本文主要是介绍关于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方式,有机会的话在测试,一直不知道怎么才能有效的保留后台服务,如果各位大侠有什么新研究的话可否联系我,带我一起深入底层研究哎
这篇关于关于Android 4.0 以上Service被kill后的生命周期 以及onTaskRemoved和OnTrimMemory调用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!