Android Bound Service实现方法详解
2014-12-16 16:29
417 查看
Android中的service是运行在后台的组件,如果其他组件(比如Activity)需要与后台的service交互,有以下三个途径:
一,若参与交互的Service,Activity运行在一个进程中(可简单理解为同一个APP中)。
那么只需要在Service的onBind方法中返回一个你自己实现的Binder对象(这个Binder类是service的内部类),然后就可以通过这个Binder对象与service交互,比如说可以在Binder类中实现一个方法将Service对象引用直接返回,从而可以让Activity直接调用Service的public方法,实例关键代码如下:Activity端代码:
import com.example.startservicetest.MainService.LocalBinder; public class MainActivity extends ActionBarActivity implements OnClickListener{ private Button btn_bind_in_same_service; private ServiceConnection conn = new ServiceConnection() { @Override public void onServiceDisconnected(ComponentName name) { // TODO Auto-generated method stub } @Override public void onServiceConnected(ComponentName name, IBinder service) { // TODO Auto-generated method stub LocalBinder binder = (LocalBinder)service; MainService mainService = binder.getService(); String res = mainService.getString(); Log.i("dazhou", "bind service result:"+res); } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btn_bind_in_same_service = (Button)findViewById(R.id.btn_bind_service_in_same_app); btn_bind_in_same_service.setOnClickListener(this); } @Override public void onClick(View v) { // TODO Auto-generated method stub int id = v.getId(); Intent intent; switch (id) { case R.id.btn_bind_service_in_same_app: Log.i("dazhou", "bind service in same app"); intent = new Intent(this, MainService.class); bindService(intent, conn, Context.BIND_AUTO_CREATE); break; default: break; } } }
Service端代码:
public class MainService extends Service { private LocalBinder mBinder = new LocalBinder(); @Override public IBinder onBind(Intent intent) { // TODO Auto-generated method stub return mBinder; } @Override public void onCreate() { // TODO Auto-generated method stub super.onCreate(); Log.i("dazhou", "MainService onCreate"); } @Override public int onStartCommand(Intent intent, int flags, int startId) { // TODO Auto-generated method stub Log.i("dazhou", "MainService onStartCommand"); return super.onStartCommand(intent, flags, startId); } @Override public void onDestroy() { // TODO Auto-generated method stub super.onDestroy(); } public String getString(){ return "dazhou"; } public class LocalBinder extends Binder{ public MainService getService(){ return MainService.this; } } }
二,若Service在进程之间被bind(可以理解为多APP之间)
可以使用Messenger类来实现,方法步骤:首先在Service中构造一个Handler类,用于处理客户端发来的各种消息;其次,在Service中以刚才创建的Handler类的对象为参数创建一个Messenger对象;最后,在Service的onBind方法中返回Messenger.getBinder()。与此同时,也可以在调用Service的Activity中创建Messenger,并将该Messeneger通过Message的replyTo域传给Service,这样就可在Service中向Activity返回消息。这是Google推荐的最简便的IPC方法,因为Messenger将所有的请求放入一堆队列,并使用单线程处理,这么以来开发者就不用考虑自己所实现Service的线程安全问题。实例关键代码如下:Activity端代码:
public class MainActivity extends ActionBarActivity implements OnClickListener{ private Button btn_bind_in_diff_service; private ServiceConnection remoteConn = new ServiceConnection() { @Override public void onServiceDisconnected(ComponentName name) { // TODO Auto-generated method stub } @Override public void onServiceConnected(ComponentName name, IBinder service) { // TODO Auto-generated method stub Messenger messenger = new Messenger(service); Message msg = Message.obtain(null, 1, 0, 0); msg.replyTo = mMessenger; try { messenger.send(msg); } catch (RemoteException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }; public class IncomingHandler extends Handler{ @Override public void handleMessage(Message msg) { // TODO Auto-generated method stub super.handleMessage(msg); int what = msg.what; switch (what) { case 2: Log.v("dazhou", "service return value to activity"); break; default: break; } } } private Messenger mMessenger = new Messenger(new IncomingHandler()); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btn_bind_in_diff_service = (Button)findViewById(R.id.btn_bind_service_in_diff_app); btn_bind_in_diff_service.setOnClickListener(this); } @Override public void onClick(View v) { // TODO Auto-generated method stub int id = v.getId(); Intent intent; switch (id) { case R.id.btn_bind_service_in_diff_app: Log.i("dazhou", "bind service in diff app"); intent = new Intent(); intent.setAction("your action"); //startService(intent); bindService(intent, remoteConn, Context.BIND_AUTO_CREATE); break; default: break; } } }
Service端代码:
public class RemoteService extends Service { public Messenger mMessenger = new Messenger(new IncomingHandler()); @Override public IBinder onBind(Intent intent) { // TODO Auto-generated method stub Log.i("dazhou", "remote service onBind"); return mMessenger.getBinder(); } @Override public void onCreate() { // TODO Auto-generated method stub Log.i("dazhou", "remote service onCreate"); super.onCreate(); } @Override public int onStartCommand(Intent intent, int flags, int startId) { // TODO Auto-generated method stub Log.i("dazhou", "remote service onStartCommand"); return super.onStartCommand(intent, flags, startId); } public class IncomingHandler extends Handler{ @Override public void handleMessage(Message msg) { // TODO Auto-generated method stub super.handleMessage(msg); switch (msg.what) { case 1: Log.i("dazhou", "Remote service incominghandler handlemessage:"+msg.what); Messenger activityMessenger = msg.replyTo; if(activityMessenger!=null){ try { Log.v("dazhou", "remote service has receive the activityMessenger:"+activityMessenger.hashCode()); activityMessenger.send(Message.obtain(null, 2, 0, 0)); } catch (RemoteException e) { // TODO Auto-generated catch block e.printStackTrace(); } } break; default: break; } } } }
相关文章推荐
- Android 控件(button)对齐方法实现详解
- 详解Android实现全屏正确方法
- Android Listview item多种子布局实现方法详解
- Android 三种实现定时器详解及实现方法
- Android动画详解之Android 动画属性和实现方法之属性动画(三)
- 详解Android冷启动实现APP秒开的方法
- 详解Android TabHost的多种实现方法 附源码下载
- Android 指纹识别详解及实现方法
- Android中View的炸裂特效实现方法详解
- Android动画详解之Android 动画属性和实现方法之帧动画(二)
- Android编程之ICS式下拉菜单PopupWindow实现方法详解(附源码下载)
- Android中使用socket通信实现消息推送的方法详解
- Android实现Activity、Service与Broadcaster三大组件之间互相调用的方法详解
- Android 实现夜间模式的快速简单方法实例详解
- Android之getSystemService方法实现详解
- 详解Android中实现ListView左右滑动删除条目的方法
- 详解Android中通过Intent类实现组件间调用的方法
- Android应用中图片浏览时实现自动切换功能的方法详解
- Android 实现监听的四种方法详解实例代码
- Android实现定时器的三种方法及详解