此文原创,转载请标明网址:http://blog.csdn.net/buyi006/archive/2011/04/28/6369002.aspx
下面我们就来讲讲LocalService,在讲之前贴张service的状态图
由此图可清楚看到service各生命周期方法的调用时机,不解释。
请看LocalServiceActivities类中的Controller和Binding类,它已经说明了service的两种使用方法。
startService(new Intent(Controller.this, LocalService.class));
stopService(new Intent(Controller.this, LocalService.class));
写好指向service的intent然后调用startService和stopService就可以完成对service的打开和关闭。你可以在service做你想做的事情,到现在controller的方法已经全部揭晓,接下来是binding的方法,这个就有点复杂。
继续看:
bindService(new Intent(Binding.this, LocalService.class), mConnection, Context.BIND_AUTO_CREATE);
与service绑定需要三个参数,一个intent去指向目的service,一个ServiceConnection对象,这个对象是用户与service连接的桥梁,还有一个参数是一个flag,这个先用系统默认的。
connection顾名思义得双方做好连接的准备,所以调用方和service都必须有相关代码
1.service
自定义一个Binder对象
private final IBinder mBinder = new LocalBinder();
public class LocalBinder extends Binder {
LocalService getService() {
return LocalService.this;
}
}
覆盖onBind方法,返回一个Binder对象
public IBinder onBind(Intent intent) {
return mBinder;
}
2.调用方
private ServiceConnection mConnection = new ServiceConnection() {
public void onServiceConnected(ComponentName className, IBinder service) {
mBoundService = ((LocalService.LocalBinder)service).getService();
}
public void onServiceDisconnected(ComponentName className) {
mBoundService = null;
Toast.makeText(Binding.this, R.string.local_service_disconnected,
Toast.LENGTH_SHORT).show();
}
};
通过一个连接拿到service对象,然后通过该service做一些自定义的事情。
至此Binding也说完了。
但其中还有一些细节没有处理:
1.譬如如果同时使用biding和start,哪个优先级高。其实不存在优先级之说,调用onStartCommand和onBind方法都会遵循一个原则,就是如果该service已经创建的话,则不会去调用onCreate方法,然后走各自的生命周期路线。例如先startService的话再bindservice,则因startService已经创建了service,所以直接走onBind方法。反之亦然。
2.这个IBinder究竟是何方神仙,这个说起来就有点复杂。且留待下一节解释吧~
回顾,这一节系统介绍了service start和bind的用法,所有示例代码如上。
下一节将说说我对IBinder的理解,敬请期待。
此文原创,转载请标明网址:http://blog.csdn.net/buyi006/archive/2011/04/28/6369002.aspx