Android安卓进程保活(二)
Android进程保活·设置前台Service,提升App进程优先级
Android进程
此文章代码Github上有提交:https://github.com/NorthernBrain/processKeep_Service/tree/master
首先你要知道Android中的进程以及它的优先级,下面来说明它进程
- 前台进程 (Foreground process)
- 可见进程 (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安卓进程保活(二)相关推荐
- Android安卓进程保活(一)1像素且透明Activity
Android进程保活·1像素且透明Activity提升App进程优先级 Android进程 此文章代码Github上有提交:https://github.com/NorthernBrain/proc ...
- 关于Android安卓APP保活 - 安卓消息推送详解 - 安卓端外推送离线推送
转自:http://zhangtielei.com/posts/blog-android-push.html 说Android端外推送比较烦,实际有两层意思:首先是说实现上比较麻烦,至今业界也没有找到 ...
- android qq 进程保活,Android保活从入门到放弃:乖乖引导用户加白名单吧(附7大机型加白示例)...
1.引言 IM在Android上的保活问题经常在即时通讯网的论坛和技术群里被讨论,自从Android 8.0后系统大大降低了后台运行应用的保活容忍度(详见<Android P正式版即将到来:后台 ...
- 再谈Android客户端进程保活
在很多移动应用中,特别是即时通信类项目中,保活是一个永远无法避免的一个话题.保活,按照我的理解,主要包含两部分: 网络连接保活:如何保证消息接收实时性. 进程保活:尽量保证应用的进程不被Android ...
- Android跨进程通信二——AIDL
AIDL全称Android Interface Definition Language即安卓接口定义语言.主要用于多进程通信.比Messenger,它具有支持多线程优势 注意事项: 为了线程安全考虑, ...
- Android进程保活方案的几种方案
自己曾经也在这个问题上伤过脑经,前几日刚好有一个北京的哥们在QQ说在做IM类的项目,问我进程保活如何处理比较恰当,决定去总结一下,网上搜索一下进程常驻的方案好多好多,但是很多的方案都是不靠谱的或者不是 ...
- Android进程保活黑科技实现原理解密及方法,最新整理
前言 前几天去参加了一场面试.面试的题目大多很基础,有一道关于埋点的问题,面试官问我如果不用第三方SDK进行埋点,自己埋点的话,如何减少埋点对业务代码的入侵. 当时没想太多,就说创建一个 BaseVi ...
- android 6.0的DozeMode低功耗模式 及 引起的进程保活问题
一.问题的来源 由于Android的开放特性,加上国内app开发者的觉悟普遍不高的情况下,越来越多的app开始利用安卓的系统特性甚至可以称为漏洞,故意让app退出后仍然占用大量的硬件资源. 越来越 ...
- 关于 Android 进程保活,你所需要知道的一切
早前,我在知乎上回答了这样一个问题:怎么让 Android 程序一直后台运行,像 QQ 一样不被杀死?.关于 Android 平台的进程保活这一块,想必是所有 Android 开发者瞩目的内容之一.你 ...
最新文章
- mysql拷贝恢复.frm_通过.frm .ibd文件恢复MySQL数据
- 入门Leaflet之小Demo
- 2019牛客暑期多校训练营(第六场)
- python 判断当前时间是否为零点
- MySQL——Caused by: java.sql.SQLException: Unknown system variable ‘transaction_isolation‘
- 递归——幂次方(洛谷 P1010)
- 【华为云技术分享】【DevCloud· 敏捷智库】物理看板和电子看板该如何选择?(内附下载材料)
- 完全备份、差异备份以及增量备份的区别
- 强化学习读书笔记 - 03 - 有限马尔科夫决策过程
- 全国30m精度二级分类土地利用数据
- 简述python2.x和python3.x的区别_python面试题Python2.x和Python3.x的区别
- 【基本办公软件】万彩办公大师教程丨二维条码制作工具
- Oracle中索引的原理
- 7.5图卷积编码器-解码器
- oracle_身份证有效性校验
- 今年的情人节,给心爱的她一个不一样的礼物吧
- 可溶性变色配体(PCLs)-光致变色-杂环偶氮苯/螺噁嗪光致变色材料/二氧化钛溶胶凝胶光致变色材料
- java web之javascript(js)解析
- 联想笔记本Fn+Q性能调节模式失效
- 华为五年自动化测试工程详细解说:unittest单元测试框架
热门文章
- c++ winpcap开发(10)
- Python pyppeteer通过cookie获取数据(cookie爬虫)
- Unix domain socket 简介(进程间通信,进程通信)
- Python 基本语法规则
- OpenCV Using Python——基于SURF特征提取和金字塔LK光流法的单目视觉三维重建 (光流、场景流)...
- js获取几个月前,几周前时间。
- F2工作流引擎之-纯JS Web在线可拖拽的流程设计器(八)
- UIWebView与JavaScript的交互
- 在VS2010中F5调试Silverlight程序时,提示“无法启动调试,找不到Microsoft Internet Explorer”...
- [翻译]当SA帐号丢失时怎么办