Android 四大组件学习之Service六
上几节。我们学习怎样用StartServer启动一个服务,用bindServer去绑定一个服务。以及服务的生命周期,以及什么是IntentService。
也许有读者会发现,我们BindServer中的第二个參数也就是ServiceConnection这种方法在将用bindService时好像没用到。
那本节课就学习。
那我们先说个事。上大学的时候。我学习不好,还是那种常常旷课的同学。
长期下去,老师跟前就混的不好了。
有次班里评选党员,我就想竞争一下,可是因为我常常不上课的同学,自然几率就小,所以我就想到走后门。 咋给导员点钱呗,反正导员是贪官,是贪官哪有不贪的。可是我不认识导员啊,那怎么办? 可是我舍友那是导员之前的红人啊,能够通过我舍友把钱给导员。然后让导员给我整个党员呗。
大概流程是这种:
那我们把这个转化为代码:
这个就相当与我们用于一个Activity去启动一个服务。可是服务有个方法,Activity想用可是却拿不到,仅仅能通过第三方去帮他拿。
上图中Activity就是我, 而Seriver就是贪官导员,仅仅有导员能给你一个名额让你成为党员。可是你不认识导员,所以就得去找你舍友,也就是导员的亲信。
那问题如今转话为: 我要找我舍友,也就是导员的亲信了。
那两种启动服务的方式。那种服务当创建后能返回给你这个亲信呢? 明显startService启动的服务是没有的。
可是bindService启动服务有:
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}
就是bindService启动服务后,通过return返回值,默认情况下是null的。
既然分析到,bindService是能够返回到服务的,担不是服务本身,仅仅是服务的代理而已。
public class MainActivity extends Activity { private Intent intent;
private MyServiceConn conn;
SheYou me;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); intent = new Intent(this, DangYuanService.class);
conn = new MyServiceConn();
//绑定服务
bindService(intent, conn, BIND_AUTO_CREATE);
} //我想成为党员的方法
public void toDoDangyuan(View v)
{
//调用舍友的方法
me.ToBeDangYuan();
} class MyServiceConn implements ServiceConnection
{
//当服务连接成功后调用
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
// 得到服务的代理
me = (SheYou) service;
} @Override
public void onServiceDisconnected(ComponentName name) {
// TODO Auto-generated method stub }
}
}
服务代码:
public class DangYuanService extends Service { @Override
public IBinder onBind(Intent intent) {
//返回服务的代理。也就是贪官导员的亲信
return new SheYou();
} //舍友独有的能给我办党员的方法
class SheYou extends Binder
{
//中间中(舍友)独有的方法,让你成为党员
public void ToBeDangYuan()
{
DangYuan();
}
} //服务自己的方法,也即是导员的权利
public void DangYuan()
{
Log.i("DangYuanService", "仅仅需1000元就能成为党员!");
} }
执行效果就知道了:我舍友找到导员,导员说“仅仅需1000元吉行”。 看看,导员多贪
我当时就想举报贪官,但是我还想着毕业呢。 就没举报贪官。
接着,我们导员还有个嗜好。那就是喝酒,当然了我舍友那必需要參加的。
class SheYou extends Binder
{
//中间中(舍友)独有的方法。让你成为党员
public void ToBeDangYuan()
{
DangYuan();
} public void HeJiu()
{
Log.i("DangYuanService", "陪导员喝酒!!!!");
}
}
给我舍友加上一个新方法,陪导员喝酒
当然了陪导员喝酒。那仅仅有导员的亲信才干參加。像我这样的级别的人。那是不能參加的。当然也就无权知道了
//我想成为党员的方法
public void toDoDangyuan(View v)
{
//调用舍友的方法
me.ToBeDangYuan();
me.HeJiu(); }
那如今我訪问喝酒的方法还是ok的。
按道理我是无权知道的。
那就不行了。那就对服务改动
这时候我们创建一个专门仅仅有当党员的借口:
public interface DangYuanInterface { //仅仅有一个方法,你能知道。那就是党员的事情
public void ToBeDangYuan();
}
然后让舍友。也就是中间人,实现这个接口
class SheYou extends Binder implements DangYuanInterface
{
//中间中(舍友)独有的方法,让你成为党员
public void ToBeDangYuan()
{
DangYuan();
} public void HeJiu()
{
Log.i("DangYuanService", "陪导员喝酒!!!!");
}
}
然后,Activity中定义一个党员的接口
DangYuanInterface dangyuan;
然后得到这个中间人对象:
public void toDoDangyuan(View v)
{
//调用舍友的方法
dangyuan.ToBeDangYuan(); } class MyServiceConn implements ServiceConnection
{
//当服务连接成功后调用
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
// 得到服务的代理
dangyuan = (DangYuanInterface) service;
} @Override
public void onServiceDisconnected(ComponentName name) {
// TODO Auto-generated method stub }
}
这时候你仅仅能知道关于党员的事情。别的事情你无权过问。
这样以后想须要获取服务里的方法。就能够通过onBind的返回值得到服务的代理。记住不是服务的本身。
通常情况下把服务的代理或者中间人,一般把中间人独有的方法抽成接口。
Android 四大组件学习之Service六的更多相关文章
- Android 四大组件学习之Service五
本节学习IntentService, 可能就有人问了. 什么是IntentService, IntentService有什么作用? 不是已经有了Service,那为什么还要引入IntentServic ...
- Android 四大组件学习之Activity六
本节学习Activity的状态保存与恢复. 先用样例開始: 布局文件主要是实现例如以下.大家自行编写 Activity逻辑代码: public class FiveActivity extends A ...
- Android 四大组件学习之Server一
上次学习了Android四大组件Activity之后,我们深刻理解了Activity.这次我们学习四大组件Service. Service与Activity的级别是一样的,都是Android系统不可缺 ...
- 入职小白随笔之Android四大组件——服务(Service)
Service Android多线程编程 当我们在程序中执行一些耗时操作时,比如发起一条网络请求,考虑到网速等原因,服务器未必会立刻响应我们的请求,此时我们就需要将这些操作放在子线程中去运行,以防止主 ...
- android四大组件学习总结以及各个组件示例(1)
android四大组件分别为activity.service.content provider.broadcast receiver. 一.android四大组件详解 1.activity (1)一个 ...
- Android四大组件初识之Service
Service作为Android四大组件之一,可以与Activity建立双向连接(绑定模式),提供数据和功能.也能够接收Intent单方面请求(调用模式),进行数据处理和调度功能. Service与A ...
- Android 四大组件学习之BroadcastReceiver一
本节课学习四大组件最后一个, 广播接受者. 顾名思义广播接受者就是接受广播呗.比方在现实社会中,曾经每一个人家都有一台收音机,这可就能够去接受广播发出来的消息.大家都知道.程序世界也是參照的显示生活设 ...
- Android 四大组件之二(Service)
service可以在和多场合的应用中使用,比如播放多媒体的时候用户启动了其他Activity这个时候程序要在后台继续播放,比如检测SD卡上文件的变化,再或者在后台记录你地理信息位置的改变等等,总之服务 ...
- Android四大组件之服务-Service 原理和应用开发详解
一.Android 服务简介 Service是android 系统中的四大组件之一(Activity.Service.BroadcastReceiver.ContentProvider),它跟Acti ...
随机推荐
- 1.6(Spring MVC学习笔记)文件上传与下载
一.文件上传 实现文件上传多数是采用表单提交数据, 但对于进行文件上传的表单需要满足一下几个条件 1.表单的method设置为post 2.表单的enctype设置为multipart/form-da ...
- Intellij IDEA System.out.println输出中文乱码问题
进行下列设置即可:
- Coherence的集群成员的离开和加入机制研究
最近在客户那里环境中coherence集群不稳定,所以找出一些文档,需要搞清楚Coherence内部的一些机制 1.集群成员的离开 关于状态的检测,官方的说法是: Death detection is ...
- 后台SQL注入实例
简要描述: 汉庭连锁酒店后台SQL注入,可绕过登陆限制进入后台,可脱库. 详细说明: 问题发生在这个站点.http://miaosha.htinns.com/ 标题内没有写具体信息.因为怕发布后被人入 ...
- Hibernate参数设置一览表
属性名 用途 hibernate.dialect 一个Hibernate Dialect类名允许Hibernate针对特定的关系数据库生成优化的SQL. 取值 full.classname.of.Di ...
- webpack配置:图片处理、css分离和路径问题
一.CSS中的图片处理: 1.首先在网上随便找一张图片,在src下新建images文件夹,将图片放在文件夹内 2.在index.html中写入代码:<div id="pic" ...
- Vue组件基础知识总结
组件系统是Vue.js其中一个重要的概念,它提供了一种抽象,让我们可以使用独立可复用的小组件来构建大型应用,任意类型的应用界面都可以抽象为一个组件树. 那么什么是组件呢?组件可以扩展HTML元素,封装 ...
- .Net使用程序发送邮件时的问题
在做项目的时候,不可避免的会用到给用户发送邮件的问题,一开始我用的是qq的smtp服务器,但是会出错,不管账号密码,服务器地址端口等怎么配置都是出错.后百度之,发现可能是qq服务器本身就是禁止这个功能 ...
- js实现select跳转
js简单实现select跳转功能:代码例如以下 <!DOCTYPE html> <html> <head> <title></title> ...
- LoadRunner中对图表的分析说明
LoadRunner中对图表的分析说明 (一)在Vusers(虚拟用户状态)中 1.Running Vusers(负载过程中的虚拟用户运行情况) 说明——系统形成负载的过程,随着时间的推移,虚拟用户数 ...