Android进程保活·1像素且透明Activity提升App进程优先级

Android进程

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

其它文章

Android安卓进程保活(一)1像素且透明Activity
Android安卓进程保活(二)设置前台Service
Android安卓进程保活(三)双进程拉活(Java层)

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

  1. 前台进程 (Foreground process)
  2. 可见进程 (Visible process)
  3. 服务进程 (Service process)
  4. 后台进程 (Background process)
  5. 空进程 (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和服务才能拥有

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

  • 1像素且透明Activity提升App进程优先级
1像素且透明Activity提升App进程优先级:

首先创建KeepLiveActivity.java继承自AppCompatActivity,这就是透明的Activity:↓

public class KeepLiveActivity extends AppCompatActivity {@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);Log.d("KeepLiveActivity","开启KeepLiveActivity");//左上角显示Window window = getWindow();window.setGravity(Gravity.START|Gravity.TOP);//设置为1像素大小WindowManager.LayoutParams params = window.getAttributes();params.x = 0;params.y = 0;params.width = 1;params.height = 1;window.setAttributes(params);KeepLiveManager.getInstance().setKeepLiveActivity(this);}@Overrideprotected void onDestroy() {super.onDestroy();Log.d("KeepLiveActivity","关闭KeepLiveActivity");}
}

样式文件中添加:↓

<style name="KeepLiveTheme" parent="AppTheme"><item name="android:windowBackground">@null</item><item name="android:windowIsTranslucent">true</item>
</style>

清单文件中注册KeepLiveActivity:↓

<activity android:name=".KeepLiveActivity"android:excludeFromRecents="true"android:exported="false"android:finishOnTaskLaunch="false"android:launchMode="singleInstance"android:theme="@style/KeepLiveTheme"/>

创建KeepLiveManager独生子模式(单例):↓

public class KeepLiveManager {private static final KeepLiveManager ourInstance = new KeepLiveManager();public static KeepLiveManager getInstance() {return ourInstance;}private KeepLiveManager() {}//弱引用,防止内存泄漏private WeakReference<KeepLiveActivity> reference;private KeepLiveReceiver receiver;public void setKeepLiveActivity(KeepLiveActivity activity) {reference = new WeakReference<>(activity);}//开启透明Activitypublic void startKeepLiveActivity(Context context) {Intent intent = new Intent(context, KeepLiveActivity.class);intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);context.startActivity(intent);}//关闭透明Activitypublic void finishKeepLiveActivity() {if (reference != null && reference.get() != null) {reference.get().finish();}}//注册广播public void registerKeepLiveReceiver(Context context) {receiver = new KeepLiveReceiver();IntentFilter filter = new IntentFilter();filter.addAction(Intent.ACTION_SCREEN_OFF);filter.addAction(Intent.ACTION_SCREEN_ON);context.registerReceiver(receiver, filter);}//反注册public void unregisterKeepLiveReceiver(Context context){if(receiver != null){context.unregisterReceiver(receiver);}}
}

创建KeepLiveReceiver继承自BroadcastReceiver(广播接收者):↓

/** 广播接收者监听屏幕开启和熄灭* */
public class KeepLiveReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {if (Intent.ACTION_SCREEN_OFF.equals(intent.getAction())) {//屏幕关闭,开启透明ActivityKeepLiveManager.getInstance().startKeepLiveActivity(context);} else if (Intent.ACTION_SCREEN_ON.equals(intent.getAction())) {//屏幕开启,关闭透明ActivityKeepLiveManager.getInstance().finishKeepLiveActivity();}}
}

最后在MainActivity调用就行:↓

public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//1像素且透明Activity提升App进程优先级KeepLiveManager.getInstance().registerKeepLiveReceiver(this);}@Overrideprotected void onDestroy() {super.onDestroy();//反注册防止内存泄漏KeepLiveManager.getInstance().unregisterKeepLiveReceiver(this);}
}

Android安卓进程保活(一)1像素且透明Activity相关推荐

  1. Android安卓进程保活(二)

    Android进程保活·设置前台Service,提升App进程优先级 Android进程 此文章代码Github上有提交:https://github.com/NorthernBrain/proces ...

  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 进程保活】提升进程优先级 ( 1 像素 Activity 提高进程优先级 | taskAffinity 亲和性说明 | 运行效果 | 源码资源 )

    文章目录 一.1 像素 Activity 提高进程优先级 1.主界面 MainActivity 2.1 像素 Activity 3.广播接收者 4.管理类 5.AndroidManifest.xml ...

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

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

  7. android 进程保活实践

    作者:08_carmelo 链接: https://www.jianshu.com/p/53c4d8303e19 首先申明这篇文章非本人原创,转载的上面的朋友的,原文链接及作者就是上面的.感觉文章写的 ...

  8. 阿里巴巴面试:《进程保活如何做到,你们保活率有多高》

    前言 进程保活的关键点有两个,一个是进程优先级的理解,优先级越高存活几率越大.二是弄清楚哪些场景会导致进程会kill,然后采取下面的策略对各种场景进行优化: 提高进程的优先级 在进程被kill之后能够 ...

  9. android listview 滑动黑屏,Android 跨进程启动Activity黑屏(白屏)的三种解决方案

    当Android跨进程启动Activity时,过程界面很黑屏(白屏)短暂时间(几百毫秒?).当然从桌面Lunacher启动一个App时也会出现相同情况,那是因为App冷启动也属于跨进程启动Activi ...

最新文章

  1. Linux shell编程学习笔记-----第六章变量和引用
  2. Redux源码分析(一)
  3. Ubuntu服务器安装lamp
  4. Android 优秀博客汇总
  5. Acision推出“ forgeathon” –第一个WebRTC应用挑战
  6. [渝粤教育] 西南科技大学 西方经济学 在线考试复习资料(1)
  7. python tcp实例_实现tcp的自动重连实例教程
  8. Beta阶段冲刺第一天
  9. oracle数据库导入表空间,oracle数据库表空间创建导入导出
  10. bzoj 3392: [Usaco2005 Feb]Part Acquisition 交易(最短路)
  11. Java读取文本文件中文乱码问题
  12. 华为OSPF多区域+路由重发布/路由引入
  13. android 圆形相机预览拍照_Android Camera2 Api 实现预览和拍照
  14. shl归纳推理测试题库_强生2020秋招笔试面试经验合集
  15. JDBC驱动(类型)
  16. MRP格式的手机QQ2008软件介绍
  17. 机器视觉运动控制一体机应用例程|橡胶密封圈检测
  18. 关于c4d默认渲染器的玻璃材质调试
  19. MIT 6.S965 韩松课程 05
  20. Ubuntu 小米6 LineageOS源码编译

热门文章

  1. 华为AC6005-8升级记录
  2. python定时器教程_python定时器的实践
  3. linux精确匹配字符串
  4. 原系统删除11g Rac后安装10g Rac中的问题处理
  5. 什么是云原生架构和K8S?
  6. MySQL 系统表损坏导致xtrabackup备份失败Cannot open filepath
  7. 南京大学周志华教授当选欧洲科学院外籍院士
  8. 智慧工地到底有多少“智慧”?见识到了!
  9. c 语言 树根 函数专题
  10. linux系统下的动态壁纸,Ubuntu 10.04下实现动态桌面壁纸