android 活动与服务进行通讯(服务(Service)一)
2016-06-19 17:31
513 查看
虽然服务是在活动里启动的,但是在启动了服务之后 ,活动与服务基本就没有什么关系了。确实如此,开始服务,之后服务会一直处于运行状态,但具体运行的是什么逻辑,活动就控制不了了。那有什么办法可以让活动跟服务的关系更紧密一些呢?
不知你们有没有发现,每创建一个服务的时候,工具都会自动帮你实现一个onBind(Intent intent)方法
我们主要是利用这个方法实现与活动的通讯。开始,我们不要求与活动通讯的时候,这个方法返回值是null的。我们再我们创建的服务类中,创建一个内部类,继承Binder ,下面我随便在该类中写两个打印的方法:
在我们刚刚的onBinder();方法中把这个类返回:
可以看到,这里我们新建了一个MyBinder类,并让它继承自 Binder,然后在它的内部提供了开始下载以及查看下载进度的方法。当然这只是两个模拟方法,并没有实现真正的功能,我们在这两个方法中分别打印了一行日志。接着,在
服务中创建了 MyBinder的实例,然后在 onBind()方法里返回了这个实例,这样 服务中的工作就全部完成了。
然后就在活动(activity)中创建了一个 ServiceConnection 的匿名类,在里面重写了onServiceConnected()方法和 onServiceDisconnected()方法,这两个方法分别会在活动与服务成功绑定以及解除绑定的时候调用。在 onServiceConnected()方法中,我们又通过向下转型得到了
MyBinder的实例,有了这个实例,活动和服务之间的关系就变得非常紧密了。现在我们可以在活动中根据具体的场景来调用
MyBinder中的任何 public 方法,即实现了指挥服务干什么,服务就去干什么的功能。这里仍然只是做了个简单的测试,在onServiceConnected()方法中调用了
MyBinder的 startDownload()和 getProgress()方法。
通过活动绑定服务
Intent bindIntent = new Intent(this, MyService.class);
bindService(bindIntent, connection, BIND_AUTO_CREATE); // 绑定服务
然后如果我们想解除活动和服务之间的绑定该怎么办呢?调用一下 unbindService()方法就可以了。
unbindService(connection); // 解绑服务
其实这样就可以简单的与活动进行通讯了。
不知你们有没有发现,每创建一个服务的时候,工具都会自动帮你实现一个onBind(Intent intent)方法
@Override public IBinder onBind(Intent intent) { return null; }
我们主要是利用这个方法实现与活动的通讯。开始,我们不要求与活动通讯的时候,这个方法返回值是null的。我们再我们创建的服务类中,创建一个内部类,继承Binder ,下面我随便在该类中写两个打印的方法:
class MyBinder extends Binder { public void startDownload() { Log.d("MyService", "startDownload executed"); } public int getProgress() { Log.d("MyService", "getProgress executed"); return 0; } }
在我们刚刚的onBinder();方法中把这个类返回:
private MyBinder mBinder = new MyBinder (); @Override public IBinder onBind(Intent intent) { return mBinder; }
可以看到,这里我们新建了一个MyBinder类,并让它继承自 Binder,然后在它的内部提供了开始下载以及查看下载进度的方法。当然这只是两个模拟方法,并没有实现真正的功能,我们在这两个方法中分别打印了一行日志。接着,在
服务中创建了 MyBinder的实例,然后在 onBind()方法里返回了这个实例,这样 服务中的工作就全部完成了。
然后就在活动(activity)中创建了一个 ServiceConnection 的匿名类,在里面重写了onServiceConnected()方法和 onServiceDisconnected()方法,这两个方法分别会在活动与服务成功绑定以及解除绑定的时候调用。在 onServiceConnected()方法中,我们又通过向下转型得到了
MyBinder的实例,有了这个实例,活动和服务之间的关系就变得非常紧密了。现在我们可以在活动中根据具体的场景来调用
MyBinder中的任何 public 方法,即实现了指挥服务干什么,服务就去干什么的功能。这里仍然只是做了个简单的测试,在onServiceConnected()方法中调用了
MyBinder的 startDownload()和 getProgress()方法。
private MyService.DownloadBinder downloadBinder; private ServiceConnection connection = new ServiceConnection() { @Override public void onServiceDisconnected(ComponentName name) { } @Override public void onServiceConnected(ComponentName name, IBinder service) { downloadBinder = (MyService.DownloadBinder) service; downloadBinder.startDownload(); downloadBinder.getProgress(); } };
通过活动绑定服务
Intent bindIntent = new Intent(this, MyService.class);
bindService(bindIntent, connection, BIND_AUTO_CREATE); // 绑定服务
然后如果我们想解除活动和服务之间的绑定该怎么办呢?调用一下 unbindService()方法就可以了。
unbindService(connection); // 解绑服务
其实这样就可以简单的与活动进行通讯了。
相关文章推荐
- Intent和IntentFilter
- Android 快速开发框架:推荐10个框架:afinal、ThinkAndroid、andBase、KJFrameForAndroid、SmartAndroid
- Android之使用Camera拍照
- Android自定义adapter的listview
- android下的单例模式
- android一对多通信
- 设置随机颜色
- Android webview,js,属性
- 理解Android中的回调机制
- android抓包工具--Fiddler(一)
- Android绘制之Canvas
- Fragment学习
- Android 异步消息处理机制 让你深入理解 Looper、Handler、Message三者关系
- android:layout_weight的一点理解
- EditText(第1章)-简介以及游标相关属性
- 最全面的 Android 编码规范指南
- Android中使用Thread线程与AsyncTask异步任务的区别
- Toolbar的介绍与用法
- android 外部存储卡
- Android SQLite数据库储存数据