在很多时候,Service都不仅仅需要在后台运行,还需要和Activity进行通信,或者接受Activity的指挥,如何来实现,来看代码。

定义一个服务

 // 创建一个服务,然后在onBind()中返回内部类(继承自Binder)的实例,使得活动能获得该实例,并操作此服务
public class MyService extends Service { // 创建一个内部类的实例,被活动获得后,操作服务
private mBinder binder = new mBinder(); // 创建一个内部类,继承自Binder,需要活动操作的函数都定义在这个内部类中
class mBinder extends Binder {
public void Function1() {
Log.d("MyService.mBinder", "Function1 executed");
} public void Function2() {
Log.d("MyService.mBinder", "Function2 executed");
} }
@Override
public void onCreate() {
super.onCreate();
Log.d("MyService", "onCreate executed");
} @Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.d("MyService", "onStartCommand executed");
return super.onStartCommand(intent, flags, startId);
} @Override
public void onDestroy() {
super.onDestroy();
Log.d("MyService", "onDestroy executed");
} @Override
public IBinder onBind(Intent intent) {
Log.d("MyService", "onBind executed");
// 在绑定时返回这个内部类实例,在活动的onServiceConnected()函数中,能获得此实例
return binder;
} }

主活动中定义两个按钮,分别用于绑定和解绑活动。

 public class MainActivity extends Activity implements OnClickListener {
private Button bind;
private Button unbind;
private MyService.mBinder binder; private ServiceConnection connection = new ServiceConnection() { @Override
// 活动和服务的绑定失去的时候自动调用,比如服务被杀死或者报错,这时候ServiceConnection会保持激活,在活动下次启动时会收到一个通知
public void onServiceDisconnected(ComponentName name) {
Log.d("MainActivity", "onServiceDisonnected executed");
} @Override
// 活动和服务解绑的时候自动调用,即bindService()函数调用时
public void onServiceConnected(ComponentName name, IBinder service) {
binder = (MyService.mBinder) service; // 通过Service向下转型得到一个MyService.mBinder的对象
binder.Function1(); // 执行Service里面的函数,即指挥Service操作
binder.Function2();
Log.d("MainActivity", "onServiceConnected executed");
}
}; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bind = (Button) findViewById(R.id.bt_bind);
unbind = (Button) findViewById(R.id.bt_unbind);
bind.setOnClickListener(this);
unbind.setOnClickListener(this);
} @Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.bt_bind:
Intent intent = new Intent(this, MyService.class);
// 传入服务的Intent,和已经定义好的ServiceConnection对象,BIND_AUTO_CREATE为标志,表示活动和服务绑定后自动创建一个服务的实例
bindService(intent, connection, BIND_AUTO_CREATE);
break;
case R.id.bt_unbind:
// 解绑
unbindService(connection);
break;
default:
break;
}
} }

在AndroidManifest.xml中注册这个活动

<service android:name=".MyService"></service>

运行结果:

通信的原理:执行绑定操作的时候,传入服务的Intent,标志位BIND_AUTO_CREATE之后,服务会被创建,并且会执行onBind()方法,返回了内部类的实例,接下来,onServiceConnected()方法会被执行,这个方法的参数IBinder即为我们在服务的onBind()方法返回的实例,对其向下转型后就能得到一个服务内部类的实例,实例可以调用类中的方法,达到在活动中操作服务的效果。执行解绑操作后,服务的onDestroy方法先被执行,onServiceDisconnected()方法不会执行,因为此方法只有在服务被杀死或者Crash的时候执行,并在下次绑定上的时候发送一个报告信息给活动。

Android开发学习之路-Service和Activity的通信的更多相关文章

  1. Android开发学习之路--Service之初体验

    android最后一个组件便是service了,终于学习到最后一个组件了,从年前的开发环境的搭建,到现在学到最后一个组件花了三周的时间,期间记录的点点滴滴,照着书本学习编写的代码都受益匪浅,这里要感谢 ...

  2. Android开发学习之路--Activity之初体验

    环境也搭建好了,android系统也基本了解了,那么接下来就可以开始学习android开发了,相信这么学下去肯定可以把android开发学习好的,再加上时而再温故下linux下的知识,看看androi ...

  3. Android开发学习之路--基于vitamio的视频播放器(二)

      终于把该忙的事情都忙得差不多了,接下来又可以开始good good study,day day up了.在Android开发学习之路–基于vitamio的视频播放器(一)中,主要讲了播放器的界面的 ...

  4. Android开发学习之路-RecyclerView滑动删除和拖动排序

    Android开发学习之路-RecyclerView使用初探 Android开发学习之路-RecyclerView的Item自定义动画及DefaultItemAnimator源码分析 Android开 ...

  5. Android开发学习之路--Android Studio cmake编译ffmpeg

      最新的android studio2.2引入了cmake可以很好地实现ndk的编写.这里使用最新的方式,对于以前的android下的ndk编译什么的可以参考之前的文章:Android开发学习之路– ...

  6. Android开发学习之路--网络编程之xml、json

    一般网络数据通过http来get,post,那么其中的数据不可能杂乱无章,比如我要post一段数据,肯定是要有一定的格式,协议的.常用的就是xml和json了.在此先要搭建个简单的服务器吧,首先呢下载 ...

  7. Android开发学习之路--Android系统架构初探

    环境搭建好了,最简单的app也运行过了,那么app到底是怎么运行在手机上的,手机又到底怎么能运行这些应用,一堆的电子元器件最后可以运行这么美妙的界面,在此还是需要好好研究研究.这里从芯片及硬件模块-& ...

  8. Android开发学习之路--MAC下Android Studio开发环境搭建

    自从毕业开始到现在还没有系统地学习android应用的开发,之前一直都是做些底层的驱动,以及linux上的c开发.虽然写过几个简单的app,也对android4.0.3的源代码做过部分的分析,也算入门 ...

  9. Android开发学习之路-该怎么学Android(Service和Activity通信为例)

    在大部分地方,比如书本或者学校和培训机构,教学Android的方式都基本类似,就是告诉先上原理方法,然后对着代码讲一下. 但是,这往往不是一个很好的方法,为什么? ① 学生要掌握这个方法的用途,只能通 ...

随机推荐

  1. 【洛谷P3143】Diamond Collector

    算是一道dp 首先,排序好每一个架子上都是一段区间,然后只需要统计每个点向左向右最长延伸的区间. 所以我们预处理出每个点以左.以右最大能延伸的长度(最多能选几个差值不超过k的) 然后枚举每个点作为断点 ...

  2. Struts2之文件上传下载

    本篇文章主要介绍如何利用struts2进行文件的上传及下载,同时给出我在编写同时所遇到的一些问题的解决方案. 文件上传 前端页面 <!-- 引入struts标签 --> <%@tag ...

  3. AOP实现原理

    Spring 为解耦而生,其中AOP(面向切面编程)是很浓重的一笔. 本文来探讨一下AOP实现的原理. 一. 概述 代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负 ...

  4. chrome 浏览器 手动同步书签 && 安装离线插件

    现在查的很严,所以使用chrome浏览器 同步功能不是特别好,就算是FQ也会出现 同步延迟的情况,所以定时使用手动同步还是很靠谱的行为,就在网上找了下,借鉴下.亲测可用. 在Chrome浏览器没有一个 ...

  5. Android ListView onItemClick Not Work

    Android ListView onItemClick Not Work ListView item中有Button和RadioButton的时候,它的Item点击事件不起作用,需要设置item的属 ...

  6. rails4.2~devise邮箱测试

    1.由于网站无需验证,只需一封欢迎邮件,在config/intiailzers/devise.rb里面配置 config.allow_unconfirmed_access_for = nil #2.d ...

  7. Winodow Server Backup学习向导-window 2008

    1.安装Window Server Backup 2.备份服务器 3.恢复服务器 4.优化和备份服务器性能 Windows Server Backup 中的新增功能有哪些? Windows Serve ...

  8. 【转】JavaScript下对去重算法的优化

    本人较懒,直接将链接附上: JavaScript下去重算法优化:http://www.linuxde.net/2013/02/12062.html

  9. modal的使用

    $modal是一个可以迅速创建模态窗口的服务,创建部分页,控制器,并关联他们 $modal仅有一个方法open(options) templateUrl:模态窗口的地址 template:用于显示ht ...

  10. hdu 5720

    考虑三个树枝:a,b,c若c是将要抛出的树枝,那么形成三角形的条件是a+b>c and a-b<c 可以写成 c属于开区间(a-b,a+b)对于每个C和许许多多的其他边,如何保证C不构成三 ...