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

本文主要是介绍关于Android 4.0 以上Service被kill后的生命周期 以及onTaskRemoved和OnTrimMemory调用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

 

先贴出服务代码:

 
  1. public class MyService extends Service {

  2.  
  3. @Override

  4. public void onCreate() {

  5. super.onCreate();

  6. Log.v("tag", "服务:onCreate");

  7.  
  8. }

  9.  
  10. @Override

  11. public void onDestroy() {

  12. super.onCreate();

  13. Log.v("tag", "服务:onDestroy");

  14. }

  15.  
  16. @Override

  17. public int onStartCommand(Intent intent, int flags, int startId) {

  18. Log.v("tag", "服务:onStartCommand");

  19. return super.onStartCommand(intent, flags, startId);

  20. }

  21.  
  22. @Override

  23. public void onRebind(Intent it) {

  24. super.onRebind(it);

  25. Log.v("tag", "服务:onRebind");

  26. }

  27.  
  28. @Override

  29. public boolean onUnbind(Intent it) {

  30. Log.v("tag", "服务:onUnbind");

  31. return super.onUnbind(it);

  32.  
  33. }

  34.  
  35. public class IBinderImpl extends Binder {

  36. public MyService getInstance() {

  37. return MyService.this;

  38. }

  39. };

  40.  
  41. @Override

  42. public IBinder onBind(Intent intent) {

  43. Log.v("tag", "服务:onBind");

  44. return new IBinderImpl();

  45. }

  46.  
  47. @SuppressWarnings("deprecation")

  48. @Override

  49. public void onStart(Intent intent, int startId) {

  50. // TODO Auto-generated method stub

  51. super.onStart(intent, startId);

  52. Log.v("tag", "服务:onStart");

  53. }

  54.  
  55. @Override

  56. public void onConfigurationChanged(Configuration newConfig) {

  57. // TODO Auto-generated method stub

  58. super.onConfigurationChanged(newConfig);

  59. Log.v("tag", "服务:onStart");

  60. }

  61.  
  62. @Override

  63. public void onLowMemory() {

  64. // TODO Auto-generated method stub

  65. super.onLowMemory();

  66. Log.v("tag", "服务:onLowMemory");

  67. }

  68.  
  69. @SuppressLint("NewApi")

  70. @Override

  71. public void onTrimMemory(int level) {

  72. // TODO Auto-generated method stub

  73. super.onTrimMemory(level);

  74. Log.v("tag", "服务:onTrimMemory " + level);

  75. }

  76.  
  77. @SuppressLint("NewApi")

  78. @Override

  79. public void onTaskRemoved(Intent rootIntent) {

  80. // TODO Auto-generated method stub

  81. super.onTaskRemoved(rootIntent);

  82. Log.v("tag", "服务:onTaskRemoved");

  83. }

  84.  
  85. @Override

  86. protected void dump(FileDescriptor fd, PrintWriter writer, String[] args) {

  87. // TODO Auto-generated method stub

  88. super.dump(fd, writer, args);

  89. Log.v("tag", "服务:dump");

  90. }

  91.  
  92.  
  93.  
  94. }

 

MainActivity代码:

 

 
  1. public class MainActivity extends ActionBarActivity implements OnClickListener {

  2.  
  3. private Button startServiceBtn;

  4.  
  5. @Override

  6. protected void onCreate(Bundle savedInstanceState) {

  7. super.onCreate(savedInstanceState);

  8. setContentView(R.layout.activity_main);

  9. startServiceBtn = (Button) findViewById(R.id.startService);

  10.  
  11. startServiceBtn.setOnClickListener(this);

  12.  
  13. }

  14.  
  15. @Override

  16. public boolean onCreateOptionsMenu(Menu menu) {

  17. // Inflate the menu; this adds items to the action bar if it is present.

  18. getMenuInflater().inflate(R.menu.main, menu);

  19. return true;

  20. }

  21.  
  22. @Override

  23. public boolean onOptionsItemSelected(MenuItem item) {

  24. // Handle action bar item clicks here. The action bar will

  25. // automatically handle clicks on the Home/Up button, so long

  26. // as you specify a parent activity in AndroidManifest.xml.

  27. int id = item.getItemId();

  28. if (id == R.id.action_settings) {

  29. return true;

  30. }

  31. return super.onOptionsItemSelected(item);

  32. }

  33.  
  34. @Override

  35. public void onClick(View v) {

  36. // TODO Auto-generated method stub

  37. if(v.getId() == R.id.startService){

  38.  
  39. Intent intent = new Intent();

  40.  
  41. intent.setClass(this, MyService.class);

  42.  
  43. this.startService(intent);

  44.  
  45. }

  46.  
  47. }

  48. }

 

现在进行测试 :

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调用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/973185

相关文章

Android kotlin中 Channel 和 Flow 的区别和选择使用场景分析

《Androidkotlin中Channel和Flow的区别和选择使用场景分析》Kotlin协程中,Flow是冷数据流,按需触发,适合响应式数据处理;Channel是热数据流,持续发送,支持... 目录一、基本概念界定FlowChannel二、核心特性对比数据生产触发条件生产与消费的关系背压处理机制生命周期

Android ClassLoader加载机制详解

《AndroidClassLoader加载机制详解》Android的ClassLoader负责加载.dex文件,基于双亲委派模型,支持热修复和插件化,需注意类冲突、内存泄漏和兼容性问题,本文给大家介... 目录一、ClassLoader概述1.1 类加载的基本概念1.2 android与Java Class

Java中调用数据库存储过程的示例代码

《Java中调用数据库存储过程的示例代码》本文介绍Java通过JDBC调用数据库存储过程的方法,涵盖参数类型、执行步骤及数据库差异,需注意异常处理与资源管理,以优化性能并实现复杂业务逻辑,感兴趣的朋友... 目录一、存储过程概述二、Java调用存储过程的基本javascript步骤三、Java调用存储过程示

Python中Tensorflow无法调用GPU问题的解决方法

《Python中Tensorflow无法调用GPU问题的解决方法》文章详解如何解决TensorFlow在Windows无法识别GPU的问题,需降级至2.10版本,安装匹配CUDA11.2和cuDNN... 当用以下代码查看GPU数量时,gpuspython返回的是一个空列表,说明tensorflow没有找到

python如何调用java的jar包

《python如何调用java的jar包》这篇文章主要为大家详细介绍了python如何调用java的jar包,文中的示例代码简洁易懂,具有一定的借鉴价值,有需要的小伙伴可以参考一下... 目录一、安装包二、使用步骤三、代码演示四、自己写一个jar包五、打包步骤六、方法补充一、安装包pip3 install

Android DataBinding 与 MVVM使用详解

《AndroidDataBinding与MVVM使用详解》本文介绍AndroidDataBinding库,其通过绑定UI组件与数据源实现自动更新,支持双向绑定和逻辑运算,减少模板代码,结合MV... 目录一、DataBinding 核心概念二、配置与基础使用1. 启用 DataBinding 2. 基础布局

Android ViewBinding使用流程

《AndroidViewBinding使用流程》AndroidViewBinding是Jetpack组件,替代findViewById,提供类型安全、空安全和编译时检查,代码简洁且性能优化,相比Da... 目录一、核心概念二、ViewBinding优点三、使用流程1. 启用 ViewBinding (模块级

MybatisPlus service接口功能介绍

《MybatisPlusservice接口功能介绍》:本文主要介绍MybatisPlusservice接口功能介绍,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友... 目录Service接口基本用法进阶用法总结:Lambda方法Service接口基本用法MyBATisP

Java调用C#动态库的三种方法详解

《Java调用C#动态库的三种方法详解》在这个多语言编程的时代,Java和C#就像两位才华横溢的舞者,各自在不同的舞台上展现着独特的魅力,然而,当它们携手合作时,又会碰撞出怎样绚丽的火花呢?今天,我们... 目录方法1:C++/CLI搭建桥梁——Java ↔ C# 的“翻译官”步骤1:创建C#类库(.NET

Android学习总结之Java和kotlin区别超详细分析

《Android学习总结之Java和kotlin区别超详细分析》Java和Kotlin都是用于Android开发的编程语言,它们各自具有独特的特点和优势,:本文主要介绍Android学习总结之Ja... 目录一、空安全机制真题 1:Kotlin 如何解决 Java 的 NullPointerExceptio