Android进程保活·设置前台Service,提升App进程优先级

Android进程

此文章代码Github上有提交:https://github.com/NorthernBrain/processKeep_Service/tree/master

首先你要知道Android中的进程以及它的优先级,下面来说明它进程

  1. 前台进程 (Foreground process)
  2. 可见进程 (Visible process)

服务进程 (Service process) 后台进程 (Background process) 空进程 (Empty process)

下面进行解释:

前台进程(Foreground process):

用户当前操作所必需的进程。如果一个进程满足以下任一条件,即视为前台进程:

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

通常,在任意给定时间前台进程都为数不多。只有在内存不足以支持它们同时继续运行这一万不得已的情况下,系统才会终止它们。 此时,设备往往已达到内存分页状态,因此需要终止一些前台进程来确保用户界面正常响应。

可见进程 (Visible process):

没有任何前台组件、但仍会影响用户在屏幕上所见内容的进程。 如果一个进程满足以下任一条件,即视为可见进程:

  • 托管不在前台、但仍对用户可见的 Activity(已调用其 onPause() 方法)。例如,如果前台 Activity 启动了一个对话框,允许在其后显示上一 Activity,则有可能会发生这种情况。
  • 托管绑定到可见(或前台)Activity 的 Service。

可见进程被视为是极其重要的进程,除非为了维持所有前台进程同时运行而必须终止,否则系统不会终止这些进程。

服务进程 (Service process):

正在运行已使用 startService() 方法启动的服务且不属于上述两个更高类别进程的进程。尽管服务进程与用户所见内容没有直接关联,但是它们通常在执行一些用户关心的操作(例如,在后台播放音乐或从网络下载数据)。因此,除非内存不足以维持所有前台进程和可见进程同时运行,否则系统会让服务进程保持运行状态。

后台进程 (Service process):

包含目前对用户不可见的 Activity 的进程(已调用 Activity 的 onStop() 方法)。这些进程对用户体验没有直接影响,系统可能随时终止它们,以回收内存供前台进程、可见进程或服务进程使用。 通常会有很多后台进程在运行,因此它们会保存在 LRU (最近最少使用)列表中,以确保包含用户最近查看的 Activity 的进程最后一个被终止。如果某个 Activity 正确实现了生命周期方法,并保存了其当前状态,则终止其进程不会对用户体验产生明显影响,因为当用户导航回该 Activity 时,Activity 会恢复其所有可见状态。

空进程 (Empty process):

不含任何活动应用组件的进程。保留这种进程的的唯一目的是用作缓存,以缩短下次在其中运行组件所需的启动时间。 为使总体系统资源在进程缓存和底层内核缓存之间保持平衡,系统往往会终止这些进程。

进程优先级:

首先空进程是最先被回收的,其次便是后台进程,依次往上,前台进程是最后才会被结束。

Android进程保活

有很多种方法可以实现Android的进程保活,比如通过 1像素且透明Activity提升App进程优先级、通过设置前台Service提升App进程优先级、Java层的双进程拉活、JobScheduler实现、NDK双进程守护、使用账户同步拉活、workmanager实现。

下面这幅图,说明的是:

  • 红色部分是容易被回收的进程,属于android进程
  • 绿色部分是较难被回收的进程,属于android进程
  • 其他部分则不是android进程,也不会被系统回收,一般是ROM自带的app和服务才能拥有

本篇文章介绍的是进程第二种方式:

  • 设置前台Service,提升App进程优先级
设置前台Service,提升App进程优先级:

首先创建ForegroundService.java继承自Service(android.app.Service):↓

这里要注意,不同的Android版本,所用的方式也就不同,并且不能显示通知栏,这里需要在onStartCommand中判断Android版本,选择不同的操作

public class ForegroundService extends Service {private static final int SERVICE_ID = 1;@Overridepublic void onCreate() {super.onCreate();Log.d("ForegroundServiceNew", "开启ForegroundService");}@Overridepublic void onDestroy() {super.onDestroy();Log.d("ForegroundServiceNew", "销毁ForegroundService");}@Overridepublic IBinder onBind(Intent intent) {return null;}@RequiresApi(api = Build.VERSION_CODES.O)@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {//判断版本if (Build.VERSION.SDK_INT < 18) {//Android4.3以下版本//将Service设置为前台服务,可以取消通知栏消息startForeground(SERVICE_ID, new Notification());} else if (Build.VERSION.SDK_INT < 24) {//Android4.3 - 7.0之间//将Service设置为前台服务,可以取消通知栏消息startForeground(SERVICE_ID, new Notification());startService(new Intent(this, InnerService.class));} else {//Android 8.0以上NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);if (manager != null) {NotificationChannel channel = new NotificationChannel("channel","name",NotificationManager.IMPORTANCE_NONE);manager.createNotificationChannel(channel);NotificationCompat.Builder builder = new NotificationCompat.Builder(this,"channel");//将Service设置为前台服务,Android 8.0 App启动不会弹出通知栏消息,退出后台会弹出通知消息//Android9.0启动时候会立刻弹出通知栏消息startForeground(SERVICE_ID,new Notification());}}return START_STICKY;}public static class InnerService extends Service {@Overridepublic IBinder onBind(Intent intent) {return null;}@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {startForeground(SERVICE_ID, new Notification());stopForeground(true);//移除通知栏消息stopSelf();return super.onStartCommand(intent, flags, startId);}}}复制代码

加入权限

<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
复制代码

最后在MainActivity启动服务就行:↓

public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//设置前台Service,提升App进程优先级startService(new Intent(this,ForegroundService.class));}
}复制代码

转载于:https://juejin.im/post/5c1b8a9b6fb9a049e70212b8

Android安卓进程保活(二)相关推荐

  1. Android安卓进程保活(一)1像素且透明Activity

    Android进程保活·1像素且透明Activity提升App进程优先级 Android进程 此文章代码Github上有提交:https://github.com/NorthernBrain/proc ...

  2. 关于Android安卓APP保活 - 安卓消息推送详解 - 安卓端外推送离线推送

    转自:http://zhangtielei.com/posts/blog-android-push.html 说Android端外推送比较烦,实际有两层意思:首先是说实现上比较麻烦,至今业界也没有找到 ...

  3. android qq 进程保活,Android保活从入门到放弃:乖乖引导用户加白名单吧(附7大机型加白示例)...

    1.引言 IM在Android上的保活问题经常在即时通讯网的论坛和技术群里被讨论,自从Android 8.0后系统大大降低了后台运行应用的保活容忍度(详见<Android P正式版即将到来:后台 ...

  4. 再谈Android客户端进程保活

    在很多移动应用中,特别是即时通信类项目中,保活是一个永远无法避免的一个话题.保活,按照我的理解,主要包含两部分: 网络连接保活:如何保证消息接收实时性. 进程保活:尽量保证应用的进程不被Android ...

  5. Android跨进程通信二——AIDL

    AIDL全称Android Interface Definition Language即安卓接口定义语言.主要用于多进程通信.比Messenger,它具有支持多线程优势 注意事项: 为了线程安全考虑, ...

  6. Android进程保活方案的几种方案

    自己曾经也在这个问题上伤过脑经,前几日刚好有一个北京的哥们在QQ说在做IM类的项目,问我进程保活如何处理比较恰当,决定去总结一下,网上搜索一下进程常驻的方案好多好多,但是很多的方案都是不靠谱的或者不是 ...

  7. Android进程保活黑科技实现原理解密及方法,最新整理

    前言 前几天去参加了一场面试.面试的题目大多很基础,有一道关于埋点的问题,面试官问我如果不用第三方SDK进行埋点,自己埋点的话,如何减少埋点对业务代码的入侵. 当时没想太多,就说创建一个 BaseVi ...

  8. android 6.0的DozeMode低功耗模式 及 引起的进程保活问题

    一.问题的来源 由于Android的开放特性,加上国内app开发者的觉悟普遍不高的情况下,越来越多的app开始利用安卓的系统特性甚至可以称为漏洞,故意让app退出后仍然占用大量的硬件资源.   越来越 ...

  9. 关于 Android 进程保活,你所需要知道的一切

    早前,我在知乎上回答了这样一个问题:怎么让 Android 程序一直后台运行,像 QQ 一样不被杀死?.关于 Android 平台的进程保活这一块,想必是所有 Android 开发者瞩目的内容之一.你 ...

最新文章

  1. mysql拷贝恢复.frm_通过.frm .ibd文件恢复MySQL数据
  2. 入门Leaflet之小Demo
  3. 2019牛客暑期多校训练营(第六场)
  4. python 判断当前时间是否为零点
  5. MySQL——Caused by: java.sql.SQLException: Unknown system variable ‘transaction_isolation‘
  6. 递归——幂次方(洛谷 P1010)
  7. 【华为云技术分享】【DevCloud· 敏捷智库】物理看板和电子看板该如何选择?(内附下载材料)
  8. 完全备份、差异备份以及增量备份的区别
  9. 强化学习读书笔记 - 03 - 有限马尔科夫决策过程
  10. 全国30m精度二级分类土地利用数据
  11. 简述python2.x和python3.x的区别_python面试题Python2.x和Python3.x的区别
  12. 【基本办公软件】万彩办公大师教程丨二维条码制作工具
  13. Oracle中索引的原理
  14. 7.5图卷积编码器-解码器
  15. oracle_身份证有效性校验
  16. 今年的情人节,给心爱的她一个不一样的礼物吧
  17. 可溶性变色配体(PCLs)-光致变色-杂环偶氮苯/螺噁嗪光致变色材料/二氧化钛溶胶凝胶光致变色材料
  18. java web之javascript(js)解析
  19. 联想笔记本Fn+Q性能调节模式失效
  20. 华为五年自动化测试工程详细解说:unittest单元测试框架

热门文章

  1. c++ winpcap开发(10)
  2. Python pyppeteer通过cookie获取数据(cookie爬虫)
  3. Unix domain socket 简介(进程间通信,进程通信)
  4. Python 基本语法规则
  5. OpenCV Using Python——基于SURF特征提取和金字塔LK光流法的单目视觉三维重建 (光流、场景流)...
  6. js获取几个月前,几周前时间。
  7. F2工作流引擎之-纯JS Web在线可拖拽的流程设计器(八)
  8. UIWebView与JavaScript的交互
  9. 在VS2010中F5调试Silverlight程序时,提示“无法启动调试,找不到Microsoft Internet Explorer”...
  10. [翻译]当SA帐号丢失时怎么办