进程保活

进程保活

    • 一.为什么需要进程保活
    • 二.进程优先级
      • 前台进程(Foreground process)
      • 可见进程(Visible process)
      • 服务进程(Service process)
      • 后台进程(Background process)
      • 空进程(Empty process)
    • 三.保活方式
      • 1. 利用 Notification 提升权限
      • 2. 利用系统Service机制拉活
      • 3. 添加Manifest文件属性值为android:persistent=“true”
      • 4. 覆写Service的onDestroy方法
      • 5. 利用系统广播拉活
      • 6.利用第三方应用广播拉活
      • 7.利用Native进程拉活
      • 8.利用账号同步机制拉活
      • 9.利用 JobScheduler 机制拉活
      • 10.利用 Activity 提升权限
      • 11.利用 JobScheduler 机制拉活
      • 12. A/B Test保活

一.为什么需要进程保活

Android系统会在内存不足的时候去将进程杀死,俗称Low Memory Killer,它是 基于linux内核的 OOM Killer(Out-Of-Memory killer)机制,内存不足时,优先杀oom_adj值高的进程(此值越高,代表该进程越不重要)。对于公司来说,当然都希望自己APP的进程尽量的不被杀死,于是乎,就有了一些列进程保活的方法出现。

二.进程优先级

进程的重要性,划分5级:

前台进程(Foreground process)

A. 拥有用户正在交互的 Activity(已调用 onResume())
B. 拥有某个 Service,后者绑定到用户正在交互的 Activity
C. 拥有正在“前台”运行的 Service(服务已调用 startForeground())
D. 拥有正执行一个生命周期回调的 Service(onCreate()、onStart() 或 onDestroy())
E. 拥有正执行其 onReceive() 方法的 BroadcastReceiver

可见进程(Visible process)

A. 拥有不在前台、但仍对用户可见的 Activity(已调用 onPause())。

B. 拥有绑定到可见(或前台)Activity 的 Service

服务进程(Service process)

A. 正在运行 startService() 方法启动的服务,且不属于上述两个更高类别进程的进程。

后台进程(Background process)

A. 对用户不可见的 Activity 的进程(已调用 Activity的onStop() 方法)

空进程(Empty process)

A. 不含任何活动应用组件的进程

三.保活方式

1. 利用 Notification 提升权限

将服务写为前台服务
https://blog.csdn.net/amynn/article/details/106984939

2. 利用系统Service机制拉活

说明:在service的onStartCommand方法里返回 STATR_STICK
START_NOT_STICKY:表示当Service运行的进程被Android系统强制杀掉之后,不会重新创建该Service,如果想重新实例化该Service,就必须重新调用startService来启动。
START_STICKY:表示Service运行的进程被Android系统强制杀掉之后,Android系统会将该Service依然设置为started状态(即运行状态),但是不再保存onStartCommand方法传入的intent对象。
START_REDELIVER_INTENT:表示Service运行的进程被Android系统强制杀掉之后,Intent保留下来并再次传入到重新创建后的Service的onStartCommand方法中,这样我们就能读取到intent参数。

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
   return START_STICKY;
   //return super.onStartCommand(intent, flags, startId);
}

3. 添加Manifest文件属性值为android:persistent=“true”

<application android:name="PhoneApp"
   android:persistent="true"
   android:label="@string/dialerIconLabel"
   android:icon="@drawable/ic_launcher_phone">

4. 覆写Service的onDestroy方法

@Override
public void onDestroy() {
	//服务销毁时再次启动
    Intent intent = new Intent(this, KeeLiveService.class);
    startService(intent);
    super.onDestroy();
}

5. 利用系统广播拉活

思路:在发生特定系统事件时,系统会发出响应的广播,通过在 AndroidManifest 中“静态”注册对应的广播监听器,即可在发生响应事件时拉活。
在这里插入图片描述

6.利用第三方应用广播拉活

获得如:手机QQ、微信、支付宝、UC浏览器等,以及友盟、信鸽、个推等 SDK,找出它们外发的广播,在应用中进行监听,这样当这些应用发出广播时,就会将我们的应用拉活。

7.利用Native进程拉活

该方案主要适用于 Android5.0 以下版本手机

8.利用账号同步机制拉活

9.利用 JobScheduler 机制拉活

Android5.0 以后系统对 Native 进程等加强了管理,Native 拉活方式失效。系统在 Android5.0 以上版本提供了 JobScheduler 接口,系统会定时调用该进程以使应用进行一些逻辑操作。

10.利用 Activity 提升权限

11.利用 JobScheduler 机制拉活

相当于开启了计时器

public class Services2 extends JobService {

    @Override
    public boolean onStartJob(JobParameters params) {
        Log.d("amy","onStart");
        startJobService();
        return false;
    }

    @Override
    public boolean onStopJob(JobParameters params) {
        Log.d("amy","onStopJob");
        return false;
    }

    public  void startJobService(){
        JobScheduler jobScheduler = (JobScheduler) this.getSystemService(JOB_SCHEDULER_SERVICE);
        JobInfo.Builder builder = new JobInfo.Builder(100,
                new ComponentName(getPackageName(),Services2.class.getName())).setPersisted(true);

        jobScheduler.schedule(builder.build());
    }
}
   <service android:name=".Services2" />
public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        new Services2().startGuardJob();
    }
}

12. A/B Test保活

所谓 A/B 测试,简单来说,就是为同一个目标制定两个方案(比如两个页面),让一部分用户使用 A 方案,另一部分用户使用 B 方案,记录下用户的使用情况,看哪个方案更符合设计目标。

热门文章

暂无图片
编程学习 ·

10.4 引用的本质

10.4 引用的本质 引用的本质其实是一个指针常量。 也就是说:int &b = a;本质上是:int* const b = &a;回想一下引用的一个特性(引用一旦确定了引用关系就不能改变)不难发现,这与指针常量的特性一样。指针常量也是不能再改变指针指向的地址。
暂无图片
编程学习 ·

Leetcode-至多包含两个不同字符的最长子串

题目:给定一个字符串 s ,找出 至多 包含两个不同字符的最长子串 t ,并返回该子串的长度。思路:使用hash表的优点在于,使用数组存储正在找的字符,用两个数组就很方便。统计个数也好,还是替代也好。其实看到这个题目,就知道有三种情况,第一种,表中只有两种字符以下的情…
暂无图片
编程学习 ·

一文读懂BERT(原理篇)

一文读懂BERT(原理篇)2018年的10月11日,Google发布的论文《Pre-training of Deep Bidirectional Transformers for Language Understanding》,成功在 11 项 NLP 任务中取得 state of the art 的结果,赢得自然语言处理学界的一片赞誉之声。本文是对近期关于BERT论文、相关文…
暂无图片
编程学习 ·

文献管理之 Citavi & Latex

文章目录为什么选择Citavi安装地址使用指南不足之处官方文档 为什么选择Citavi 比较好的文献管理软件主要有Citavi、Endnote、Mendeley、Zotero,根据Citavi、Endnote、Mendeley 功能大比拼!到底哪一款才是众望所归的终极文献管理软件?总结,Citavi不仅是个免费的软件,而且功…
暂无图片
编程学习 ·

微信小程序引入vant Weapp组件

微信小程序引入vant Weapp组件 步骤: 1. 打开终端: 先初始化: npm init -y 然后进行安装 npm install --productionnpm i @vant/weapp -S --production2. 需要在微信开发者工具,点击工具==>>构建npm 并点击详情,勾选 使用 npm 模块 选项,构建完成后,即可引入组件…
暂无图片
编程学习 ·

PHP字符串函数vsprintf(返回格式化字符串)

在PHP中,字符串函数 vsprintf() 返回格式化字符串。函数语法:vsprintf ( string $format , array $args ) : string函数参数说明:参数描述format必需。规定字符串以及如何格式化其中的变量。可能的格式值:%% - 返回一个百分号 %%b - 二进制数%c - ASCII 值对应的字符%d - 包…
暂无图片
编程学习 ·

一文详解 Ansible 的自动化运维

一、Ansible 概述 Ansible 是近年来越来越火的一款开源运维自动化工具,通过Ansible可以实现运维自动化,提高运维工程师的工作效率,减少人为失误。 Ansible 通过本身集成的非常丰富的模块可以实现各种管理任务,其自带模块超过上千个。更为重要的是,它操作非常简单,即使小白…
暂无图片
编程学习 ·

React配置less以及less的全局变量设置

工作中接触react的项目比较的少,对于less的全局变量设置在vue项目中设置过,react的全局变量设置没怎么接触了。 看到有小伙伴问这个,试着在网上找了下,也是花费了不少的功夫才找到不错的方式,在这里分享给大家。 由于之前vue项目里没法使用sass-resource-loader,一开始也…
暂无图片
编程学习 ·

训练数据转换为PASCAL VOC2007

数据 我们已有标注数据个数为json保存的,现在训练代码使用的标注格式为PASCAL VOC2007,为了不修改代码,将数据转换到PASCAL VOC2007的xml格式。 转换代码 import os import json from lxml.etree import Element, SubElement, tostring, ElementTree from xml.dom import mi…
暂无图片
编程学习 ·

nginx从下载到部署全过程(Linux)

导航NGINX官网下载NGINX安装环境解压,编译,安装启动及测试NGINX官网以下列举了三个网址,分别是:NGINX官网,下载网址及官方文档。官方网站:http://nginx.org/下载网址:http://nginx.org/en/download.html官方文档:http://nginx.org/en/docs/ 下载NGINX 通过官方下载地址…
暂无图片
编程学习 ·

小甲鱼python听课笔记p11-p15

p11 7.1 列表1 = 打了激素的数组列表可以存放不同类型的数,还可以创建空列表append():向列表里面添加数据末尾添加一个元素但是只能一次插入一个数据extend():扩张的方式来扩展列表末尾添加多个元素,但要求已列表的格式添加[x,x,x,x]用一个列表来扩展另一个列表,所以他…
暂无图片
编程学习 ·

04 | 如何处理消费过程中的重复消息?

1.应用场景见: https://blog.csdn.net/william_n/article/details/1040254082.学习/操作2.1 阅读文档你好,我是李玥。上节课我们讲了如何确保消息不会丢失,课后我给你留了一个思考题,如果消息重复了怎么办?这节课,我们就来聊一聊如何处理重复消息的问题。在消息传递过程中…
暂无图片
编程学习 ·

GIT学习

1. 初始化仓库 git init # 从而在指定文件夹下生成一个.git文件夹,即为.git仓库2. 配置 2.1 配置文件 windows系统下,这三个文件分别是在: 1.系统级别:`%git安装路径%/etc/gitconfig` 2.用户级别: `C:\Users\lingguiwang\.gitconfig` 3.仓库级别: `项目\.git\config`#…
暂无图片
编程学习 ·

计算机专业大学生的随感

我想去聚会,想和朋友一起喝酒,但是仔细一想,自己好像没有可以去的聚会,也没有可以陪着自己喝酒的朋友。 懒得在社交上花费时间和精力,那么需要朋友的时候,就只能对着屏幕空感叹。 那几分GPA虽然重要,但真的不至于占用自己那么多时间
暂无图片
编程学习 ·

Leetcode刷题链表预备知识(C)

Leetcode里的head指针指向实实在在的链表第一个结点,该结点不是哨兵结点。 对链表处理完之后,链表成为空链表,则head指针赋值NULL。 写代码的时候,不要写出p->next->next这种东西,因为如果p->next==NULL,那程序运行就报错了。 用指针的时候,一定要判其是否为NU…
暂无图片
编程学习 ·

多线程知识点梳理1

1.什么是线程 线程(thread)是操作系统能够调度的最小的单位,它包含在进程内。是进程的实际运作单位。一个进程中可以有多个线程。2.线程的生命周期 线程的生命周期一共分为五个部分:新建,就绪,运行,阻塞,死亡。 当线程被创建之后并不是直接执行状态,也不是一直处于执…
暂无图片
编程学习 ·

吴说区块链:吉比特创始人「疑遭警方调查」暂时失联

据吴说区块链消息,吉比特创始人雷太国遭到举报暂时失联,疑似遭到警方调查。雷太国旗下主要有三大业务,分别是云算力销售平台吉比特、发币LTG(辣条哥,也是雷太国名字的三个首字母)、交易所CHANGE COIN(币兑)。吉比特自称,矿场分布在四川有4个,新疆有3个,内蒙古有3个,…
暂无图片
编程学习 ·

半监督深度学习

半监督学习在有标签数据+无标签数据混合成的训练数据中使用的机器学习算法。一般假设,无标签数据比有标签数据多,甚至多得多。要求:无标签数据一般是有标签数据中的某一个类别的(不要不属于的,也不要属于多个类别的); 有标签数据的标签应该都是对的; 无标签数据一般是类…