绑定服务的初步解读
来源:互联网 发布:淘宝卖教程选什么类目 编辑:程序博客网 时间:2024/05/19 11:49
由于工作中很少用Service,所以对于service也只是初步了解,最近手头的项目基本进入收尾,所以有时间深入了解一下service.Service是四大组件之一,其重要性不言而喻,即使在面试中,也是面试官必问的问题。
启动一个service有两种方式,一种利用StartService;一种是利用BundService的方式。第一种方式估计大多数人都很容易理解,所以这篇博客重头戏就是如何实现以绑定的形式启动一个Service。
When creating a service that provides binding, you must provide an IBinder that provides the programming interface that clients can use to interact with the service.这是源于官网的一句话,大概意思就是如果我们想创建一个绑定服务,我们必须提供一个可以供客户端与服务端联系的提供运行接口的一个IBinder.官网指出,有三种方式可以定义一个这样的接口。
第一种:继承Binder这个类 这种方式适合用于同一个应用程序里面;
第二种:利用Messenger 该方式是最简单的IPC机制
第三种:利用AIDL
第一种 继承Binder
MyService类
public class MyService extends Service { //创建一个Binder的子类 public class MyBinder extends Binder{ //创建一个方法,该方法可以让外部类获取到该Service,然后就可以调用该Service下的方法 public MyService getService(){ return MyService.this; } } public MyService() { } @Override public IBinder onBind(Intent intent) { return new MyBinder(); } public void toast(){ Toast.makeText(MyService.this,"我可以操作service啦",Toast.LENGTH_LONG).show(); }MainActivity类
//必须实现ServiceConnectTion接口public class MainActivity extends AppCompatActivity implements View.OnClickListener, ServiceConnection { private Button btn_bund_service,btn_un_bund_service,btn_operator; //与Service相关 private MyService myService; //与MyBinder相关 private MyService.MyBinder myBinder; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); setListeners(); } private void initView() { btn_bund_service = (Button) findViewById(R.id.btn_bund_service); btn_un_bund_service = (Button) findViewById(R.id.btn_unbund_service); btn_operator = (Button) findViewById(R.id.btn_operator_service); } private void setListeners(){ btn_bund_service.setOnClickListener(this); btn_un_bund_service.setOnClickListener(this); btn_operator.setOnClickListener(this); } @Override public void onClick(View v) { Intent inttent = new Intent(MainActivity.this,MyService.class); switch (v.getId()){ case R.id.btn_bund_service: //绑定服务 bindService(inttent,this, Service.BIND_AUTO_CREATE); break; case R.id.btn_unbund_service: //解绑服务 unbindService(this); break; case R.id.btn_operator_service: if (myService !=null){ myService.toast(); } break; } } @Override public void onServiceConnected(ComponentName name, IBinder service) { //获取MyBinder myBinder = (MyService.MyBinder) service; //获取Service对象 myService=myBinder.getService(); } @Override public void onServiceDisconnected(ComponentName name) { }}简要理解一下:
我们知道如果以绑定的方式启动一个Service的话,它的生命周期是onCreate()----->onBind,而OnBind()方法的返回值是一个IBinder,IBinder是一个接口,它的直接子类就是Binder。
我们再看我们执行绑定服务的时候,里面有一个参数就是ServiceConnection。参看官方文档可以得知ServiceConnection是一个接口,该接口有两个抽象方法,一个是onServiceConnected,官方说明:Called when a connection to the Service has been established, with the IBinder of the communication channel to the Service.大概意思就是通过IBinder就可以和Service通信啦!
第二种:利用Messenger
第一个程序里面的MyService类
public class MyService extends Service { static final int MSG_SAY_HELLO = 1; //消息的处理 private class Myhandler extends Handler { @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what){ case MSG_SAY_HELLO: Toast.makeText(MyService.this,"绑定成功",Toast.LENGTH_LONG).show(); break; } } }; private Messenger messenger=new Messenger(new Myhandler()); public MyService() { } @Override public IBinder onBind(Intent intent) { return messenger.getBinder(); } @Override public void onCreate() { super.onCreate(); Log.d("Bund", "onCreate: "); }}第二个程序里面的MainActivity,主要操作第一个程序里面的Service
public class MainActivity extends Activity implements View.OnClickListener, ServiceConnection { private Button btn_bund,btn_unbund,btn_commumicate_service; private Intent intent; private Messenger messenger; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.content_main); initView(); setListeners(); } private void initView() { btn_bund=(Button)findViewById(R.id.btn_bund); btn_unbund=(Button)findViewById(R.id.btn_unbund); btn_commumicate_service = (Button) findViewById(R.id.btn_conmiunicate_with_messenger); } private void setListeners() { btn_bund.setOnClickListener(this); btn_unbund.setOnClickListener(this); btn_commumicate_service.setOnClickListener(this); } @Override public void onClick(View view) { intent = new Intent(); intent.setComponent(new ComponentName("com.boundserviceusemessenger","com.boundserviceusemessenger.MyService")); switch (view.getId()){ case R.id.btn_bund: bindService(intent,this, Service.BIND_AUTO_CREATE); break; case R.id.btn_unbund: unbindService(this); break; case R.id.btn_conmiunicate_with_messenger: if (messenger !=null){ try { Message message = Message.obtain(); message.what=1; messenger.send(message); } catch (RemoteException e) { e.printStackTrace(); } } break; } } @Override public void onServiceConnected(ComponentName componentName, IBinder iBinder) { messenger=new Messenger(iBinder); } @Override public void onServiceDisconnected(ComponentName componentName) { }}简要理解一下:
首先该方式的重点就是Messenger,那接下来我们到官方文档了解一下该类。
该类的构造方法有两种:
Messenger(Handler target),该构造方法是我们在MyService里面使用的,来实例化的。
Messenger(IBinder target),该构造方法是我们在MainAcyivity里面实例化Messenger对象的
该类两个重要的方法:
getBinder(),其返回值是IBinder
send(Message message),该方法用于发送消息,就是与Service通信的核心。
第三种:AIDL方式实现IPC
在两个程序中创建包名和类名都相同的aidl接口,这一点很重要。
interface IMyAidlInterface { /** * Demonstrates some basic types that you can use as parameters * and return values in AIDL. */ void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat, double aDouble, String aString); void setDataChange(String data);}
第一个程序的MyService类:
public class MyService extends Service { public MyService() { } @Override public IBinder onBind(Intent intent) { return new IMyAidlInterface.Stub() { @Override public void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat, double aDouble, String aString) throws RemoteException { } @Override public void setDataChange(String data) throws RemoteException { } }; } @Override public void onCreate() { super.onCreate(); Log.d("Test", "onCreate: "); } @Override public int onStartCommand(Intent intent, int flags, int startId) { return super.onStartCommand(intent, flags, startId); } @Override public void onDestroy() { super.onDestroy(); Log.d("Test", "onDestroy: "); }}第二个程序的MyService类:
public class MyService extends Service { public MyService() { } @Override public IBinder onBind(Intent intent) { return new IMyAidlInterface.Stub() { @Override public void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat, double aDouble, String aString) throws RemoteException { } @Override public void setDataChange(String data) throws RemoteException { } }; } @Override public void onCreate() { super.onCreate(); Log.d("Test", "onCreate: "); } @Override public int onStartCommand(Intent intent, int flags, int startId) { return super.onStartCommand(intent, flags, startId); } @Override public void onDestroy() { super.onDestroy(); Log.d("Test", "onDestroy: "); }}第二个程序的MainAcyivity类:
public class MainActivity extends Activity implements View.OnClickListener, ServiceConnection { private Button btn_bund,btn_unbund,btn_commumicate_service; private Intent intent; private IMyAidlInterface iMyAidlInterface; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.content_main); initView(); setListeners(); } private void initView() { btn_bund=(Button)findViewById(R.id.btn_bund); btn_unbund=(Button)findViewById(R.id.btn_unbund); btn_commumicate_service = (Button) findViewById(R.id.btn_conmiunicate_with_aidl); } private void setListeners() { btn_bund.setOnClickListener(this); btn_unbund.setOnClickListener(this); btn_commumicate_service.setOnClickListener(this); } @Override public void onClick(View view) { intent = new Intent(); intent.setComponent(new ComponentName("com.taolv365","com.taolv365.MyService")); switch (view.getId()){ case R.id.btn_bund: bindService(intent,this, Service.BIND_AUTO_CREATE); break; case R.id.btn_unbund: unbindService(this); break; case R.id.btn_conmiunicate_with_aidl: if (iMyAidlInterface !=null){ try { iMyAidlInterface.setDataChange("通信成功"); } catch (RemoteException e) { e.printStackTrace(); } } break; } } @Override public void onServiceConnected(ComponentName componentName, IBinder iBinder) { iMyAidlInterface=IMyAidlInterface.Stub.asInterface(iBinder); } @Override public void onServiceDisconnected(ComponentName componentName) { }}到此为止,跟着官方代码理解如此,欢迎指点更正。
- 绑定服务的初步解读
- 绑定未绑定的服务
- 远程服务的绑定
- 绑定服务的用法
- header.S文件的初步解读
- Silverlight的绑定数据(初步学习)
- 服务的生命周期-绑定服务的生命周期
- 编写绑定的 Service服务
- android 服务的绑定调用
- 绑定服务的注意事项小结
- 绑定服务&调用服务里面的方法
- 绑定服务:调用服务内部的方法
- andorid,绑定服务,调用服务的方法
- Android--绑定服务调用服务的方法
- Android---服务(Service)的绑定服务
- Android 绑定类型服务---创建绑定类型的服务
- Android 绑定类型服务---管理绑定类型服务的生命周期
- Android 绑定类型服务---创建绑定类型的服务
- 808 协议的解析
- CentOS 6.X 关闭不需要的 TTY 方法
- Meteor:关闭所有tab时退出登录
- STL中hashtable,hashset,hashmap,set,map,multiset和multimap的区别
- 从头认识java-16.5 nio的数据转换
- 绑定服务的初步解读
- logback学习
- Undefined symbols for architecture armv7问题
- Word自动目录字体过大,如何全选并修改样式
- 结构体初始化
- php模块memcache和memcached区别分析
- 离散--繁琐的定义
- linux下的stdin,stdout和stderr理解
- dazhongdianping招聘