Android防止Service被杀死

1. Service被杀死的两种场景

1.2 系统回收

在系统内存空间不足时可能会被系统杀死以回收内存,内存不足时Android会依据Service的优先级来清除Service

1.2 用户清除

用户可以在”最近打开”(多任务窗口、任务管理窗口)中清除最近打开的任务,当用户清除了Service所在的任务时,Service可能被杀死(不同ROM有不同表现,在小米、魅族等第三方产商定制ROM上一般会被立即杀死,在Android N上没有被立即杀死)。

2. 解决方案

对于第一种场景(系统回收),如果不用黑科技(双进程互开等),我们只能够尽量提高Service的优先级,一种比较好的方式是使用前台Service

对于第二种场景(用户手动清除),可以将启动Service的任务排除出系统的最近任务列表。

2.1 前台Service

前台Service是一种有前台界面(Notification)、优先级非常高的Service,只有在系统内存空间严重不足时,才会清除前台Service。

只需要在Service的onCreate() 或者 onStartCommand() 内调用startForeground,就能将Service转为前台Service。示例如下:


private Notification buildForegroundNotification() {
   Notification.Builder builder = new Notification.Builder(this);

   builder.setOngoing(true);

   builder.setContentTitle(getString(R.string.notification_title))
           .setContentText(getString(R.string.notification_content))
           .setSmallIcon(R.mipmap.ic_launcher)
           .setTicker(getString(R.string.notification_ticker));
   builder.setPriority(Notification.PRIORITY_MAX);
   return builder.build();
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
   Log.e(TAG, "onStartCommand");

   WindowManager windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
   mRootView = new FloatRootView(this);
   mRootView.attach(windowManager);
   mRootView.showBubble();
   startForeground(1, buildForegroundNotification());

   return START_STICKY;

}

2.2 移出最近任务

为了使Service不会被用户从”最近打开”中清除,我们可以将启动Service的任务从系统的最近应用列表中删除。做法是将任务ActivityexcludeFromRecents设为true,如下:


<activity android:name=".MainActivity"
         android:excludeFromRecents="true">
   <intent-filter>
       <action android:name="android.intent.action.MAIN"/>

       <category android:name="android.intent.category.LAUNCHER"/>
   </intent-filter>
</activity>
时间: 2024-08-06 03:45:20

Android防止Service被杀死的相关文章

Android如何降低service被杀死概率

http://www.jianshu.com/p/06a1a434e057 http://www.cnblogs.com/ylligang/articles/2665181.html Android应对进程被杀死--Service(二)

【Android】Android中Service类onStartCommand的返回值有关问题(转)

@Override public int onStartCommand(Intent intent, int flags, int startId) { System.out.println("---------->>onStartCommand2"); return super.onStartCommand(intent, flags, startId); } Android开发的过程中,每次调用startService(Intent)的时候,都会调用该Service对象

Android实现Service永久驻留

说实话,这是一种流氓行为.但有些时候又是不得不需要的.比如微信的NotifyReceiver.现在抛开这些伦理的东西不讲,我们只是来看看技术上怎么实现.在后台运行的service有几个途径可以将其停止运行,第一种就是软件退出:第二种就是通过系统强制停止运行:第三种就是被某些安全软件杀死.这里我们重点关注后两种永久驻留的实现.思路有一下几个:1.通过系统的某些动作来重启Service:2.在Service的onDestory()通过一系列操作重启Service. 先看第一种,最常见系统动作就是系统

保证Android后台不被杀死的几种方法

由于各种原因,在开发Android应用时会提出保证自己有一个后台一直运行的需求,如何保证后台始终运行,不被系统因为内存低杀死,不被任务管理器杀死,不被软件管家等软件杀死等等还是一个比较困难的问题.网上也有各种方案,笔者经过自己试验学习尝试总结了3中还可以的方式,记录如下.并不是绝对保证,不过确实提高了存活率不少. 方式一:service绑定通知栏成为前台服务 android中实现后台一般通过service方式,但系统本身会在内存低等情况下杀死service.通过将service绑定到notifi

Android AIDL SERVICE 双向通信 详解

http://www.cnblogs.com/punkisnotdead/p/5062631.html 起因 是这个blog 提到了 用webview 的时候 用开启子进程的方式 可以极大避免内存泄露.然后有很多人私信我 这种情况下 如何 相互通信的问题.当然广播是一个比较不错的选择,只不过广播的方法 能够传递的值比较有限.messenger 也只能做 单向传递消息.(当然你如果用2个 是可以双向的.单独的messenger是只能单向的). so,这里给出一个简单的小例子,教你如何处理 AIDL

【Android】怎样使一个Android应用不被杀死?(整理)

[转载]怎样使一个Android应用不被杀死?(整理) 原文地址:怎样使一个Android应用不被杀死?(整理)作者:飘锦丹枫 参考:http://blog.csdn.net/windskier/article/details/6560925http://blog.csdn.net/zmyde2010/article/details/6756368http://blog.sina.com.cn/s/blog_514048cb0100wi2j.html 方法:对于一个service,可以首先把它设

Android服务Service总结

转自 http://blog.csdn.net/liuhe688/article/details/6874378 富貴必從勤苦得,男兒須讀五車書.唐.杜甫<柏學士茅屋> 作为程序员的我们,须知富贵是要通过勤苦努力才能得到的,要想在行业内有所建树,就必须刻苦学习和钻研. 今天我们来讲一下Android中Service的相关内容. Service在Android中和Activity是属于同一级别上的组件,我们可以将他们认为是两个好哥们,Activity仪表不凡,迷倒万千少女,经常做一些公众人物角色

Android之Service的细枝末节

转载注明出处:http://blog.csdn.net/xiaohanluo/article/details/53675312 1. 简介 与前一篇Android之Activity的细枝末节是同一系列的文章,是自己在学习和研发过程中,对Service的一些知识点的总结,汇总得到这篇文章. 这篇文章会从Service的一些小知识点,延伸到Android中几种常用进程间通信方法. 2. 进程 Service是一种不提供用户交互页面但是可以在后台长时间运行的组件,可以通过在AndroidManifes

Android中service用法

Service翻译: Class Overview A Service is an application component representing either an application's desire to perform a longer-running operation while not interacting with the user or to supply functionality for other applications to use. Each servi