Service中onStartCommand()理解

有时候我们会很诧异一个现象:
当我们在Activity中通过startService()开启一个服务时,我们之后直接System.exit(0)或android.os.Process.killProcess(android.os.Process.myPid());结束进程;但启动的Service依然可以在后台重新启动;

下面Demo演示:
##1>Activity:

public class MainActivity extends Activity {
	public static final String TAG = "zhangjunling";
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		Log.v(TAG, "Activity:onCreate");
		Intent intent = new Intent(MainActivity.this, MyService.class);
		startService(intent);
	}
	public void exitProcess(View view){
		System.exit(0);
	}
	@Override
	protected void onStart() {
		// TODO Auto-generated method stub
		super.onStart();
		Log.v(TAG, "Activity:onStart");
	}

	@Override
	protected void onResume() {
		// TODO Auto-generated method stub
		super.onResume();
		Log.v(TAG, "Activity:onResume");
	}

	@Override
	protected void onPause() {
		// TODO Auto-generated method stub
		super.onPause();
		Log.v(TAG, "Activity:onPause");
	}
	@Override
	protected void onStop() {
		// TODO Auto-generated method stub
		super.onStop();
		Log.v(TAG, "Activity:onStop");
	}
	@Override
	protected void onDestroy() {
		// TODO Auto-generated method stub
		super.onDestroy();
		Log.v(TAG, "Activity:onDestroy");
	}
}

##2>Service:

public class MyService extends Service {

	@Override
	public IBinder onBind(Intent intent) {
		// TODO Auto-generated method stub
		return null;
	}
	@Override
	public void onCreate() {
		// TODO Auto-generated method stub
		super.onCreate();
		Log.v(MainActivity.TAG, "Service:onStart");
		new Thread(){
			@Override
			public void run() {
				try {
					Log.v(MainActivity.TAG, "Service:run()");
					Thread.sleep(6000);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}.start();
	}
	@Override
	public int onStartCommand(Intent intent, int flags, int startId) {
		// TODO Auto-generated method stub
		Log.v(MainActivity.TAG, "Service:onStartCommand");
		return super.onStartCommand(intent, flags, startId);
	}
	@Override
	public void onDestroy() {
		// TODO Auto-generated method stub
		Log.v(MainActivity.TAG, "Service:onDestroy");
		super.onDestroy();
	}
}

##3>测试结果:
这里写图片描述

点击按钮(结束进程)等几秒钟后我们会看到:
这里写图片描述
Service重新启动;

它为什么会重新启动呢?这就与Service.onStartCommand()的返回值有关啦!!!

(1)START_STICKY:如果service进程被kill掉,保留service的状态为开始状态,但不保留递送的intent对象。随后系统会尝试重新创建service,由于服务状态为开始状态,所以创建服务后一定会调用onStartCommand(Intent,int,int)方法。如果在此期间没有任何启动命令被传递到service,那么参数Intent将为null。

(2)START_NOT_STICKY:“非粘性的”。使用这个返回值时,如果在执行完onStartCommand后,服务被异常kill掉,系统将会把它置为started状态,系统不会自动重启该服务,直到startService(Intent intent)方法再次被调用;。

(3)START_REDELIVER_INTENT:重传Intent。使用这个返回值时,如果在执行完onStartCommand后,服务被异常kill掉,系统会自动重启该服务,并将Intent的值传入。

(4)START_STICKY_COMPATIBILITY:START_STICKY的兼容版本,但不保证服务被kill后一定能重启。

可能有人会问,那我把任务完成之后,该怎样关闭Service?
可以通过:stopSelf();自己关闭;


另一种启动Service的方法:bindService();它就没那么复杂了,当我们System.exit(0);时Service自动关闭;

由于自己现在的知识有限,现在还不能从源码的角度去分析Service的启动;等我以后学习了,会及时更新的!

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值