`
lovelease
  • 浏览: 382593 次
社区版块
存档分类
最新评论

android service被系统回收的解决方法

阅读更多
自己的app的service总是容易被系统回收,搜罗了一下,基本上的解决思路有以下几种:
1.把service写成系统服务,将不会被回收(未实践):
在Manifest.xml文件中设置persistent属性为true,则可使该服务免受out-of-memory killer的影响。但是这种做法一定要谨慎,系统服务太多将严重影响系统的整体运行效率。
2.提高service的优先级(未实践):
设置android:priority="1000"
<!-- 为了消去加上android:priority="1000"后出现的警告信息,可以设置android:exported属性,指示该服务是否能够被其他应用程序组件调用或跟它交互 -->
        <service android:name="com.example.helloandroid.weatherforecast.service.UpdateWidgetService" android:exported="false" >
            <!-- 为防止Service被系统回收,可以通过提高优先级解决,1000是最高优先级,数字越小,优先级越低 -->
            <intent-filter android:priority="1000"></intent-filter>
        </service>

3.将服务写成前台服务foreground service(已实践,很大程度上能解决问题,但不能保证一定不会被杀):
重写onStartCommand方法,使用StartForeground(int,Notification)方法来启动service。
注:前台服务会在状态栏显示一个通知,最典型的应用就是音乐播放器,只要在播放状态下,就算休眠也不会被杀,如果不想显示通知,只要把参数里的int设为0即可。
Notification notification = new Notification(R.drawable.logo,
                "wf update service is running",
                System.currentTimeMillis());
		pintent=PendingIntent.getService(this, 0, intent, 0);
		notification.setLatestEventInfo(this, "WF Update Service",
		        "wf update service is running!", pintent);
		
		//让该service前台运行,避免手机休眠时系统自动杀掉该服务
		//如果 id 为 0 ,那么状态栏的 notification 将不会显示。
		startForeground(startId, notification);

同时,对于通过startForeground启动的service,onDestory方法中需要通过stopForeground(true)来取消前台运行状态。

ps:如果service被杀后下次重启出错,可能是此时重发的Intent为null的缘故,可以通过修改onStartCommand方法的返回值来解决:
START_STICKY:如果service进程被kill掉,保留service的状态为开始状态,但不保留递送的intent对象。随后系统会尝试重新创建service,由于服务状态为开始状态,所以创建服务后一定会调用onStartCommand(Intent,int,int)方法。如果在此期间没有任何启动命令被传递到service,那么参数Intent将为null。
START_NOT_STICKY:“非粘性的”。使用这个返回值时,如果在执行完onStartCommand后,服务被异常kill掉,系统不会自动重启该服务。
START_REDELIVER_INTENT:重传Intent。使用这个返回值时,如果在执行完onStartCommand后,服务被异常kill掉,系统会自动重启该服务,并将Intent的值传入。
START_STICKY_COMPATIBILITY:START_STICKY的兼容版本,但不保证服务被kill后一定能重启。
//if this service's process is killed, then it will be scheduled for a restart and the last delivered Intent re-delivered to it again 
return Service.START_REDELIVER_INTENT;

4.利用ANDROID的系统广播检查Service的运行状态,如果被杀掉,就再起来(未实践):
利用的系统广播是Intent.ACTION_TIME_TICK,这个广播每分钟发送一次,我们可以每分钟检查一次Service的运行状态,如果已经被结束了,就重新启动Service。
具体的实现,可以参考这个链接:http://mobile.51cto.com/abased-374969.htm

补充:以上是解决service容易被回收的方法,但是再进一步深究,为什么service会被系统杀掉呢?通过分析手机的logcat日志发现这么一段话:
引用

06-19 08:01:32.755 W/ActivityManager( 2081): Killing ProcessRecord{43a96570 6437:com.example.helloandroid/u0a187}: background ANR
06-19 08:01:32.910 I/ActivityManager( 2081): Process com.example.helloandroid (pid 6437) (adj 0) has died.

看来这个ANR(Application Not Responding)是关键。上网查到的解释是:
在如下情况下,Android会报出ANR错误:
– 主线程 (“事件处理线程” / “UI线程”) 在5秒内没有响应输入事件
– BroadcastReceiver 没有在10秒内完成返回
通常情况下,下面这些做法会导致ANR
1、在主线程内进行网络操作
2、在主线程内进行一些缓慢的磁盘操作(例如执行没有优化过的SQL查询)
主线程中执行过多的操作也是不好的,我的主线程里有访问网络的处理,于是想办法将网络访问移出主线程,通常有两种方法:把访问网络放在独立线程或者异步线程AsyncTask中。至于具体怎么实现,google之。
分享到:
评论

相关推荐

    《Android系统源代码情景分析》

    《Android系统源代码情景分析》随书光盘内容(源代码) 目录如下: 第1篇 初识Android系统 第1章 准备知识 1.1 Linux内核参考书籍 1.2 Android应用程序参考书籍 1.3 下载、编译和运行Android源代码 ...

    浅谈Android Service服务的高级技巧

    如果若要避免服务被回收,可以使用前台服务。 前台服务会一直有一个图标在系统的状态栏中显示,下拉状态栏可以看到更加详细的信息,类似于消息通知效果。 public class FirstService extends Service { private ...

    Android系统源代码情景分析-罗升阳-源码

    《Android系统源代码情景分析》随书光盘内容(源代码) 目录如下: 第1篇 初识Android系统 第1章 准备知识 1.1 Linux内核参考书籍 1.2 Android应用程序参考书籍 1.3 下载、编译和运行Android源代码 1.3.1 下载...

    Android系统源代码情景分析光盘

    Android系统源代码情景分析光盘资料 目录 第1篇初识Android系统 第1章 准备知识................................................................ 2 1.1 Linux内核参考书籍......................................

    Android应用程序进程管理

    Android系统里面的应用程序进程有一个特点,那就是它们是被系统托管的。也就是说,系统根据需要来创建进程以及回收进程。进程创建发生在组件启动时,它们是由Zygote进程负责创建。Zygote进程是由系统中的第一个进程...

    java/android 开发面试题

    如果后台的Activity由于某原因被系统回收了,如何在被系统回收之前保存当前状态? 3. 如何将一个Activity设置成窗口的样式。(Edited by Sodino) 4. 如何退出Activity?如何安全退出已调用多个Activity的Application...

    深入理解Android:卷I--详细书签版

     全书共10章,第1章介绍了阅读本书所需要做的准备工作,主要包括对android系统架构和源码阅读方法的介绍;第2章通过对android系统中的mediascanner进行分析,详细讲解了 android中十分重要的jni技术;第3章分析了...

    Android开发实现根据包名判断App运行状态的方法

    对于没有 Service 的 App,程序一旦切换到后台,可能很快就被回收了,这里使用 ActivityManager.getRunningTasks(int maxNum) 方法来获取当前正在运行的任务,注意:此方法并不被系统推荐,且是一个

    android 面试2

    2. 如果后台的Activity由于某原因被系统回收了,如何在被系统回收之前保存当前状态?  答:在系统回收或者用户调用finish方法,都会销毁Activity,此时会调用onDestroy方法,利用onDestroy方法保存Activity状态  3...

    Android 代码分析

    1 Android build system 4 1.1 Basic 4 1.2 Executable 6 ...30.3 你后台的Activity被系统回收怎么办:onSaveInstanceState 115 30.4 调用与被调用:我们的通信使者Intent 116 31 编译Native C的helloworld 118

    Android通过JNI实现守护进程

    1、提高Service的优先级:这个,也只能说在系统内存不足需要回收资源的时候,优先级较高,不容易被回收,然并卵… 2、提高Service所在进程的优先级:效果不是很明显 3、在onDestroy方法里重启service:这个倒还算挺...

    ZAlalm:闹钟实例,1、杀不死的Service。2、双进程保护Aidl。3、Android 5.0 JobScheduler和Android 6.0 Doze模式。4、AppWidget小组件。5、对一些系统广播监听(开机、锁屏、安装更新APP...)

    /**Android 闹钟实例:1、杀不死的服务Service,只能在进程存在的情况下,降低系统回收几率。A:android:priority="1000"最高权限;B:onStartCommand返回值设置,getApplicationInfo().targetSdkVersion &lt; Build....

    《深入理解Android》卷Ⅰ

    1.1.1 Android系统架构 1.1.2 本书的架构 1.2 搭建开发环境 1.2.1 下载源码 1.2.2 编译源码 1.3 工具介绍 1.3.1 Source Insight介绍 1.3.3 Busybox的使用 1.4 本章小结 第2章 深入理解JNI 2.1 JNI概述 2.2 学习JNI...

    深入理解Android卷1全

    1.1.1 Android系统架构 / 2 1.1.2 本书的架构 / 3 1.2 搭建开发环境 / 4 1.2.1 下载源码 / 4 1.2.2 编译源码 / 6 1.3 工具介绍 / 8 1.3.1 Source Insight介绍 / 8 1.3.3 Busybox的使用 / 11 1.4 本章小结 / 12 第2章...

    精通ANDROID 3(中文版)1/2

    1.5.5 Android Service组件  1.5.6 Android媒体和电话组件  1.5.7 Android Java包  1.6 利用Android源代码  1.7 本书的示例项目  1.8 小结  第2章 设置开发环境  2.1 设置环境  2.1.1 下载JDK 6  ...

    Android典型技术模块开发详解

    1.1.2 Android系统框架 1.1.3 应用程序框架 1.2 Eclipse开发环境 1.2.1 安装ADT插件 1.2.2 安装SDK 1.2.3 配置源代码 1.2.4 创建AVD 1.3 Android模拟器 1.3.1 ADB工具 1.3.2 其它常用工具 1.4 本章小结 第2章 应用...

    Android项目源码带悬浮窗和图表统计的流量助手.zip

    通过前台Service实现悬浮窗,免得悬浮窗被回收。 补充: 由于每次手机重新启动,流量会清零,这样会导致逻辑变化,所以请务必开启本程序的开机启动权限,不然在重新启动手机后将会工作不正常。 系统的这个API好像...

    精通Android 3 (中文版)2/2

    1.5.5 Android Service组件  1.5.6 Android媒体和电话组件  1.5.7 Android Java包  1.6 利用Android源代码  1.7 本书的示例项目  1.8 小结  第2章 设置开发环境  2.1 设置环境  2.1.1 下载JDK 6  ...

    Android通知栏前台服务的实现

    一、前台服务的简单介绍 ...后台运行的Service系统优先级相对较低,当系统内存不足时,在后台运行的Service就有可能被回收,为了保持后台服务的正常运行及相关操作,可以选择将需要保持运行的Service设置为前台服务,从

    Android 面试题汇总

    Android 70道面试题汇总不再愁面试 本文为开发者奉献了70道经典Android面试题加答案–重要知识点几乎都涉及到了,你还等啥,赶紧收藏吧!!  1. 下列哪些语句关于内存回收的说明是正确的? (b)  A、 程序员必须创建...

Global site tag (gtag.js) - Google Analytics