关于Android 4.0 以上Service被kill后的生命周期 以及onTaskRemoved和OnTrimMemory调用

一直在搞基础的安卓Service ,估计很多人都一样,最头疼的是Service被kill后的生命周期


先贴出服务代码:

public class MyService extends Service {

	@Override
	public void onCreate() {
		super.onCreate();
		Log.v("tag", "服务:onCreate");

	}

	@Override
	public void onDestroy() {
		super.onCreate();
		Log.v("tag", "服务:onDestroy");
	}

	@Override
	public int onStartCommand(Intent intent, int flags, int startId) {
		Log.v("tag", "服务:onStartCommand");
		return super.onStartCommand(intent, flags, startId);
	}

	@Override
	public void onRebind(Intent it) {
		super.onRebind(it);
		Log.v("tag", "服务:onRebind");
	}

	@Override
	public boolean onUnbind(Intent it) {
		Log.v("tag", "服务:onUnbind");
		return super.onUnbind(it);

	}	
	
	public class IBinderImpl extends Binder {
		public MyService getInstance() {
			return MyService.this;
		}
	};

	@Override
	public IBinder onBind(Intent intent) {
		Log.v("tag", "服务:onBind");
		return new IBinderImpl();
	}

	@SuppressWarnings("deprecation")
	@Override
	public void onStart(Intent intent, int startId) {
		// TODO Auto-generated method stub
		super.onStart(intent, startId);
		Log.v("tag", "服务:onStart");
	}

	@Override
	public void onConfigurationChanged(Configuration newConfig) {
		// TODO Auto-generated method stub
		super.onConfigurationChanged(newConfig);
		Log.v("tag", "服务:onStart");
	}

	@Override
	public void onLowMemory() {
		// TODO Auto-generated method stub
		super.onLowMemory();
		Log.v("tag", "服务:onLowMemory");
	}

	@SuppressLint("NewApi")
	@Override
	public void onTrimMemory(int level) {
		// TODO Auto-generated method stub
		super.onTrimMemory(level);
		Log.v("tag", "服务:onTrimMemory " + level);
	}

	@SuppressLint("NewApi")
	@Override
	public void onTaskRemoved(Intent rootIntent) {
		// TODO Auto-generated method stub
		super.onTaskRemoved(rootIntent);
		Log.v("tag", "服务:onTaskRemoved");
	}

	@Override
	protected void dump(FileDescriptor fd, PrintWriter writer, String[] args) {
		// TODO Auto-generated method stub
		super.dump(fd, writer, args);
		Log.v("tag", "服务:dump");
	}
	
	

}


MainActivity代码:

public class MainActivity extends ActionBarActivity implements OnClickListener {

	private Button startServiceBtn;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		startServiceBtn = (Button) findViewById(R.id.startService);

        startServiceBtn.setOnClickListener(this);

	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		// Handle action bar item clicks here. The action bar will
		// automatically handle clicks on the Home/Up button, so long
		// as you specify a parent activity in AndroidManifest.xml.
		int id = item.getItemId();
		if (id == R.id.action_settings) {
			return true;
		}
		return super.onOptionsItemSelected(item);
	}

	@Override
	public void onClick(View v) {
		// TODO Auto-generated method stub
		if(v.getId() == R.id.startService){

            Intent intent = new Intent();

            intent.setClass(this, MyService.class);

            this.startService(intent);

        }

	}
}


现在进行测试 :

1,连按三次button,查看服务的执行日志

说明在用startservice方式启动Service时 Create()方法只会被创建一起,再次startservice时会直接调用service的onStart函数和onStartCommand函数,这点应该很多人都知道吧

2,点击返回键之后Service执行步骤为(接着上面的):

发现Service 调用了 OnTrimMemory函数 ,很奇怪,有点不明白,有大侠懂的话可以告诉一下

3,退出软件后,用长按home调出最近运行历史,在这里面清除软件:

这时候Service调用了onTaskRemoved函数,同时在设置里面的应用管理里面可以发现这时候 Service的状态时 正在重启状态 ,于是启动后又调用了Create相关函数。

4,用最新版的360杀死软件后:

可以看到并没有调用taskremove函数,而是直接把它干了,这时候后台服务也消失,只能说360杀的太干净了,而且我发现我系统自带的清理工具杀死该软件是也是如此,杀的特别干净,而且Service不调用任何自己的函数

5,补充一下,在打开软件启动服务后,这时候点击home键 Service的执行过程如下:


6,在设置-应用管理里面-正在运行服务中,你手动点击停止服务时,Service调用:

Service调用了onDestroy()函数, 也就是说,就算用户手动停止了Service,Service也会正常走完自己的生命周期,而不会受到干扰


至此完成了所有测试,测试时间 2014-10-16 ,机型 华为荣耀H30-T10


在一般情况下 没调用onTaskRemoved函数的话 Service是正常的在后台运行的,如果调用了,服务可能会处于正在重启的状态,这是我总结发现的,不知道大家有没有什么新发现。当然如果直接被360等干了,那就另外说,我说的这是一般没有其他软件干扰的情况下


以上只是测试startservice方法启动的service的执行过程,没有测试bind方式,有机会的话在测试,一直不知道怎么才能有效的保留后台服务,如果各位大侠有什么新研究的话可否联系我,带我一起深入底层研究哎 ~ QQ:1078041387



ForegroundService是在Android系统中用于在后台持续运行的服务,它通常用于需要保持运行的任务,例如音乐播放、位置跟踪等。当这样的服务被系统杀死(即因为内存管理或用户交互导致Service进程被销毁),为了记录下服务被终止的时间,你可以在Service生命周期方法中设置一个标记,并利用SharedPreferences或其他持久存储方案保存这一信息。 以下是一个简单的示例: 1. **在Service启动时**,获取当前时间并保存到持久化存储: ```java @Override public void onCreate() { super.onCreate(); SharedPreferences.Editor editor = getSharedPreferences("service_time", MODE_PRIVATE).edit(); editor.putLong("last_foreground_time", System.currentTimeMillis()); editor.apply(); } ``` 2. **在onDestroy()方法中**,再次记录一次时间,表示服务被关闭: ```java @Override public void onDestroy() { super.onDestroy(); SharedPreferences.Editor editor = getSharedPreferences("service_time", MODE_PRIVATE).edit(); editor.putLong("termination_time", System.currentTimeMillis()); editor.apply(); // 这里还可以做一些清理工作 } ``` 3. 如果你需要在Service被杀后获取这个时间点,可以从SharedPreferences读取之前保存的数据: ```java long terminationTime = getSharedPreferences("service_time", MODE_PRIVATE) .getLong("termination_time", -1); if (terminationTime != -1) { Log.d("Termination Time", "Service was killed at: " + terminationTime); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值