service作为后台服务,其重要性不言而喻,但很多时候service会被杀死,从而失去了我们原本想要其发挥的作用,在这种情况下我们该如何确保我们的service不被杀死就是本节需要讨论的内容了

service的等级说明

在了解service的等级说明以后,明白其生命周期,有助于我们更好的去做好服务

常见的分类是将进程分成五个等级,等级越高越不容易被系统干掉,那么先来看一看进程都有些什么等级吧

  • 前台进程

    当某个Activity处于前台并且正在活动的时候,那么这个Activity就属于前台进程,此时是不会被回收的,那么这个Activity所绑定的service也属于前台进程,也不会被回收;service被主动调为前台进程的时候(startForeground()),这时候这个服务也属于前台进程

  • 可见进程

    当Activity处于onPause()阶段,但尚未进入到onStop()阶段的时候,绑定其活动的service也属于可见进程

  • 服务进程

    使用startService()启动的进程属于服务进程,是普通的进程

  • 后台进程

    在布局文件中通过android:process=":xxx"指定的进程属于后台进程

  • 空进程

    不含任何活动组件的进程

进程优先级的提高方案

要想线程不被轻易杀死,就要尽可能的提高线程的优先级,那么有哪些切实可行的解决方案呢

  1. 系统白名单
  2. 双进程守护
  3. JobScheduler系统任务调度
  4. 监听其他app的广播启动
  5. 利用账号同步机制启动

进程防杀示例

Java层双进程守护

双进程守护可以通过Java层实现,也可以通过Native层实现

这里使用Java层的示例

首先编写aidl文件,确保两个service之间能够通信

interface ConnectionInterface {
String getProcessName();
}

编写service,这里有两个,其代码几乎一样,这里就只贴一个

public class ServiceTwo extends Service {

    private static final String TAG = "ServiceTwo";
private MyBinder myBinder;
private ServiceConnection connection; @Nullable
@Override
public IBinder onBind(Intent intent) {
return myBinder;
} @Override
public void onCreate() {
super.onCreate();
if(myBinder == null){
myBinder = new MyBinder();
}
connection = new MyServiceConnection();
} @Override
public int onStartCommand(Intent intent, int flags, int startId) {
ServiceTwo.this.bindService(new Intent(ServiceTwo.this, ServiceOne.class),connection,Context.BIND_IMPORTANT);
//这里使用一个通知将Server放到前台去了
PendingIntent contentIntent = PendingIntent.getService(this, 0, intent, 0);
NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
builder.setTicker("test")
.setContentIntent(contentIntent)
.setContentTitle("ForTest")
.setAutoCancel(true)
.setContentText("ServiceTwo")
.setWhen( System.currentTimeMillis());
startForeground(startId,builder.build());
return START_STICKY;
} class MyBinder extends ConnectionInterface.Stub{ @Override
public String getProcessName() throws RemoteException {
return "ServiceTwo";
}
} class MyServiceConnection implements ServiceConnection{ @Override
public void onServiceConnected(ComponentName name, IBinder service) {
Log.e(TAG,"连接成功");
} @Override
public void onServiceDisconnected(ComponentName name) {
Log.d(TAG, "断开连接");
ServiceTwo.this.startService(new Intent(ServiceTwo.this, ServiceOne.class));
ServiceTwo.this.bindService(new Intent(ServiceTwo.this,ServiceOne.class),connection, Context.BIND_IMPORTANT);
}
}
}

然后在activity中直接使用startService()启动两个服务即可

编译安装发现两个服务都在运行,停止其中一个,另一个立马将其唤醒

这种情况如果直接停掉应用,那么两个Service都会被杀死,那么使用系统任务调度,就可以将其唤醒了···,说实话,这个真的就有点流氓了

Service被系统杀死,那么可以使用JobService将其唤醒

不过这个是从SDK21才开始支持的一个系统服务

其也有固有缺陷。不能频繁调用

性能优化-service进程防杀的更多相关文章

  1. [PHP] – 性能优化 – Fcgi进程及PHP解析优化

    https://www.abcdocker.com/abcdocker/808------[PHP] – 性能优化 – Fcgi进程及PHP解析优化

  2. [Android]android Service后台防杀

    网上有很多办法,方法一:在JNI里面fork出子进程service在单独的进程中,在service中调用JNI的代码,然后fork出一个进程,然后让我们的service进程和fork出来的子进程一直运 ...

  3. WebView性能优化--独立进程

    Android允许一个app同时存在多个进程,可以根据需要把不同的模块放到不同进程中处理. 一.WebView独立进程的好处 1.有效增大App的运存,减少由webview引起的内存泄露对主进程内存的 ...

  4. Android进程永生技术终极揭秘:进程被杀底层原理、APP应对技巧

    1.引言 上个月在知乎上发表的由“袁辉辉”分享的关于TIM进程永生方面的文章(即时通讯网重新整理后的标题是:<史上最强Android保活思路:深入剖析腾讯TIM的进程永生技术>),短时间内 ...

  5. App架构师实践指南六之性能优化三

    App架构师实践指南六之性能优化三 2018年08月02日 13:57:57 nicolelili1 阅读数:190   内存性能优化1.内存机制和原理 1.1 内存管理内存时一个基础又高深的话题,从 ...

  6. 万级K8s集群背后etcd稳定性及性能优化实践

    背景与挑战 随着腾讯自研上云及公有云用户的迅速增长,一方面,腾讯云容器服务TKE服务数量和核数大幅增长, 另一方面我们提供的容器服务类型(TKE托管及独立集群.EKS弹性集群.edge边缘计算集群.m ...

  7. 万级K8s集群背后 etcd 稳定性及性能优化实践

    1背景与挑战随着腾讯自研上云及公有云用户的迅速增长,一方面,腾讯云容器服务TKE服务数量和核数大幅增长, 另一方面我们提供的容器服务类型(TKE托管及独立集群.EKS弹性集群.edge边缘计算集群.m ...

  8. Android性能优化之利用LeakCanary检测内存泄漏及解决办法

    前言: 最近公司C轮融资成功了,移动团队准备扩大一下,需要招聘Android开发工程师,陆陆续续面试了几位Android应聘者,面试过程中聊到性能优化中如何避免内存泄漏问题时,很少有人全面的回答上来. ...

  9. Android应用性能优化(转)

    人类大脑与眼睛对一个画面的连贯性感知其实是有一个界限的,譬如我们看电影会觉得画面很自然连贯(帧率为24fps),用手机当然也需要感知屏幕操作的连贯性(尤其是动画过度),所以Android索性就把达到这 ...

随机推荐

  1. 引入其他服务的JS、和 本地的JS文件,script的属性

    ==============使用其他服务器引入JS文件,1,减轻服务器压力2,速度快3,可以缓存 cdnjs库,更新比较快https://cdnjs.com/ cdn库 引入JS文件如:jqueryb ...

  2. 学习了武沛齐讲的Day10-完

    int       整形 int     将字符串转换为数字 x.bit_length()  ===== 当前数字的二进制,至少用n位表示 str       字符串 x.capitalize()== ...

  3. mysql数据库中锁机制的详细介绍

    悲观锁与乐观锁: 悲观锁:顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁.传统的关系型数据库里边就用到了很多这 ...

  4. elasticsearch 集群管理(集群规划、集群搭建、集群管理)

    一.集群规划 搭建一个集群我们需要考虑如下几个问题: 1. 我们需要多大规模的集群? 2. 集群中的节点角色如何分配? 3. 如何避免脑裂问题? 4. 索引应该设置多少个分片? 5. 分片应该设置几个 ...

  5. Postgresql pg_dump 与 pg_restore 使用举例

    pg_dump备份 备份本地osdb数据库,全备份,不需要密码 pg_dump osdb > osdb.sql 备份远程osdb数据库 pg_dump -h 192.168.122.1 -Uos ...

  6. 理解 __declspec

    “__declspec”是Microsoft c++中专用的关键字,它配合着一些属性可以对标准C++进行扩充.这些属性有:align.allocate.deprecated. dllexport.dl ...

  7. jQuery相关方法7----各种事件和绑定事件

    一.jQuery事件 1.鼠标事件 click与dbclick事件 click事件其实是由mousedown与mouseup 2个动作构成,所以点击的动作只有在松手后才触发 $ele.click(): ...

  8. 关于 js 函数参数的this

    先看一道面试题: var number = 10; function fn() { console.log(this.number); } var obj = { number: 2, show: f ...

  9. luogu_P4767 [IOI2000]邮局

    传送门 Description 高速公路旁边有一些村庄.高速公路表示为整数轴,每个村庄的位置用单个整数坐标标识.没有两个在同样地方的村庄.两个位置之间的距离是其整数坐标差的绝对值. 邮局将建在一些,但 ...

  10. dell如何安装Win10/Ubuntu双系统

    原文:https://www.cnblogs.com/askDing/p/10477345.html 测试环境: DELL PRECISION 7510: CPU:Intel Core i5-6300 ...