论坛首页 移动开发技术论坛

关于Service的生命周期,以及ServiceConnection接口时注意的东东

浏览 31677 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-08-04   最后修改:2010-08-04
首先是Service的周期问题
The service will at this point continue running until Context.stopService() or stopSelf() is called. Note that multiple calls to Context.startService() do not nest (though they do result in multiple corresponding calls to onStartCommand()), so no matter how many times it is started a service will be stopped once Context.stopService() or stopSelf() is called
上面是android的HP上写的关于Service周期的一段话,是说,Service在开始以后,除非调用了Context.stopService()或者stopSelf(),否则不会停止。当然如果内存不足,系统可能自动杀死Service。


下面是关于ServiceConnection接口的:
private ServiceConnection conn = new ServiceConnection() {

		@Override
		public void onServiceDisconnected(ComponentName name) {
			// TODO Auto-generated method stub
			
			mService = null;
			
		}

		@Override
		public void onServiceConnected(ComponentName name, IBinder service) {
			// TODO Auto-generated method stub
			mService = IBindService.Stub.asInterface(service);
			
		}
	};

貌似现在的主流写法是这样。下面的代码的bindService method执行之后会自动调用上面ServiceConnection接口里的onServiceConnected method
				Intent intent = new Intent(IBindService.class.getName());
				bindService(intent, conn, BIND_AUTO_CREATE);


有人会想,如果执行unbindService之后不就自动调用ServiceConnection接口里的onServiceDisconnected method了吗。

其实不然,查看api,你会发现,ServiceConnection接口里德onServiceDisconnected method只会在Service被停止或者被系统杀死以后调用。

也就是说你执行unbindService 只是告诉系统你已经和这个服务没有关系了。系统在内存不足的时候可以优先杀死这个服务而已。

   发表时间:2010-08-10  
如果没有startService,而调用stopservice不会出错.
如果没有bindservice而调用unbindservice就会出错.

还有在TabActivity里面,如果每个Tab都是Intent的话,启动了这个Tabactivity里,如何Bindservice呢?
maintabactivity->>tab1activity,tab2activity
在tab1activity里无法bindservice,不知道这个如何处理呢?

似乎又和Tab有关了,上面的maintabactivity都监听不到onkeydown事件.....
0 请登录后投票
   发表时间:2010-08-10  
phenom 写道
如果没有startService,而调用stopservice不会出错.
如果没有bindservice而调用unbindservice就会出错.

还有在TabActivity里面,如果每个Tab都是Intent的话,启动了这个Tabactivity里,如何Bindservice呢?
maintabactivity->>tab1activity,tab2activity
在tab1activity里无法bindservice,不知道这个如何处理呢?

似乎又和Tab有关了,上面的maintabactivity都监听不到onkeydown事件.....

TabActivity  没有用过,汗颜。

不过,我觉得可以这样做:
对于每个不同的tab,在onServiceConnected()里有不同的初始化设定,例如一些组件的注册。通过if或者switch进行判断。

切换tab时,在onTabChanged()里,unbindService之后再bindService。


0 请登录后投票
   发表时间:2010-09-03  
zk216fire 写道
phenom 写道
如果没有startService,而调用stopservice不会出错.
如果没有bindservice而调用unbindservice就会出错.

还有在TabActivity里面,如果每个Tab都是Intent的话,启动了这个Tabactivity里,如何Bindservice呢?
maintabactivity->>tab1activity,tab2activity
在tab1activity里无法bindservice,不知道这个如何处理呢?

似乎又和Tab有关了,上面的maintabactivity都监听不到onkeydown事件.....

TabActivity  没有用过,汗颜。

不过,我觉得可以这样做:
对于每个不同的tab,在onServiceConnected()里有不同的初始化设定,例如一些组件的注册。通过if或者switch进行判断。

切换tab时,在onTabChanged()里,unbindService之后再bindService。



这个方法没有尝试过,不过我尝试过使用在TabActivity中的Activity上bindService,结果失败。
在网上查了一下,如果是想针对TabActivity中的每一个Activity都bind一个service的话,那么在bindService的时候必须调用getApplicationContext().bindService()方法,而不是直接调用bindService()方法。
详细情况可以参见Google的Issue 2483

 

0 请登录后投票
论坛首页 移动开发技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics