博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android进程保活(一):利用 Activity 提升权限
阅读量:6656 次
发布时间:2019-06-25

本文共 2889 字,大约阅读时间需要 9 分钟。

前言

最近公司有进程保活方面的业务需求,所以就趁着闲暇时间研究了相关的技术方案,并且亲身验证它们的可行性,接下来我会用几篇文章详细介绍。

之前就有人爆出手机 QQ 长久存活的秘诀,那就是 监听用户的解锁屏操作,在锁屏的时候启动一个像素的透明窗口的 Activity,在解锁的时候把 Activity 销毁。 不得不佩服鹅厂的程序猿,竟然能想出这么棒的方案!管你 Android 怎么升级,该方案真的是屡试不爽!用户无感知,目的达到了,两全其美的事情。

首先验证一下:在锁屏状态下 cmd 输入

adb shell dumpsys activity activities复制代码

我们来看一下 dump 的输出:最顶层的 Task 的信息,包名:com.tencent.reading,我看了一下应用列表,它是「天天快报」,果然是腾讯家的。

我们看到 OffActicity 就是顶层的 Activity,怀着好奇心找到了源码所在的目录,参考相关代码,自己写了一个 demo。

具体实现分两步:

  1. 创建一个透明的 Activity
  2. 监听用户解锁屏操作
第一步:创建一个透明的 Activity

1. 在 onCreate 方法中设置 window 的属性

Window window = getWindow();window.setGravity(Gravity.TOP | Gravity.LEFT);LayoutParams attributes = window.getAttributes();attributes.x = 0;attributes.y = 0;attributes.height = 1;attributes.width = 1;window.setAttributes(attributes);复制代码

2. 在 Manifest 中设置一些属性,包括排除在最近任务列表外、透明主题、启动模式等

复制代码

3. 处理触摸和销毁事件 因为 Activity 是在锁屏的时候启动的,所以在用户点亮屏幕后,它是绝对不能存在的。我们要在 Activity 的生命周期里做些处理。为了稳妥起见,对 Activity 的触摸事件我们也要处理,直接销毁 Activity 就可以了。

@Overrideprotected void onResume() {      super.onResume();      if (isScreenOn()) {             finishSelf();      }}@Overrideprotected void onDestroy() {      super.onDestroy();      if (instance != null && instance.get() == this) {            instance = null;     }}public void finishSelf() {      if (!isFinishing()) {            finish();      }  }private boolean isScreenOn() {        PowerManager powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT_WATCH) {                    return powerManager.isInteractive();            } else {                    return powerManager.isScreenOn();             }     }复制代码
第二步:监听用户解锁屏操作

实现该功能要注册三个广播:

复制代码

但是这里有一个问题,USER_PRESENT 可以静态注册,其余两个只能通过动态注册才能收到广播。我们索性把这三个广播都动态和静态注册一次,反正不会有什么坏处。然后接收到开关屏广播事件,对 Activity 做处理。

if ("android.intent.action.SCREEN_OFF".equals(action)) {        Log.i(TAG, "锁屏开启一像素");    CheckTopTask.setForeground(context);        mHandler.postDelayed(mCheckTopTask, 3000);} else if ("android.intent.action.USER_PRESENT".equals(action) || "android.intent.action.SCREEN_ON".equals(action)) {       Log.i(TAG, "开屏关闭一像素");        OnePxActivity onePxActivity = OnePxActivity.instance != null ? OnePxActivity.instance.get() : null;       if (onePxActivity != null) {                onePxActivity.finishSelf();       }        mHandler.removeCallbacks(mCheckTopTask);}复制代码

这里有一个很鸡贼的地方,既然锁屏时已经启动了透明 Activity,为什么还要再三秒后还要执行一个任务?因为担心其他应用也采用同样的方案,把它的 Activity 盖在我们的上面。这个任务就是在三秒后检测当前 Activity 是否在前台,如果不在就再次启动,获得前台的焦点。我看腾讯就是这么搞的,大写的「服」!

最后实现的功能是 Activity 为我们占据前台,保证进程不被杀死,后台的 Service 在辛勤工作,目的达到了,so happy

最后

在现在这个金三银四的面试季,我自己在网上也搜集了很多资料做成了文档和架构视频资料免费分享给大家【包括高级UI、性能优化、架构师课程、NDK、Kotlin、混合式开发(ReactNative+Weex)、Flutter等架构技术资料】,希望能帮助到您面试前的复习且找到一个好的工作,也节省大家在网上搜索资料的时间来学习。

资料获取方式:加入Android架构交流QQ群聊:513088520 ,进群即领取资料!!!

点击链接加入群聊【Android移动架构总群】:

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

你可能感兴趣的文章
查看系统内存 cpu占用率脚本
查看>>
我的友情链接
查看>>
python实例练习-01登录
查看>>
awk编程
查看>>
H3C SR6604 升级IOS
查看>>
Linux 进程与服务管理1
查看>>
我的友情链接
查看>>
一个前端所需具备的PS能力
查看>>
Exchange 2010 (二) MBX DAG部署
查看>>
vim使用
查看>>
python列表(Lists)
查看>>
Python中sort 、sorted函数和operator.itemgetter函数
查看>>
Android Studio中快捷键冲突
查看>>
活动目录回收站之基于GUI方式完成对象还原
查看>>
ionic 列表
查看>>
轻松玩转window7之四:轻松制作DVD
查看>>
搜索引擎测试指南
查看>>
我的友情链接
查看>>
Nginx代理上传文件大小设置
查看>>
C# CefSharp 可监听请求等
查看>>