在学习Android初中级升高级Android工程师中,记录写3中APP保活的方法。
方法1:1像素法
实现原理就是在屏幕总创建1像素透明activity,通过这个activity来实现保活。
1):创建KeepActivity并继承Activity,然后通过Window设置1像素Activity的放置位置
Window window = getWindow();
//把1寸Activity放置左上角
window.setGravity(Gravity.START | Gravity.TOP);
通过WindowManager.LayoutParams设置1像素Activity的大小
WindowManager.LayoutParams wl = window.getAttributes();
wl.width = 1;
wl.height = 1;
wl.x = 0;
wl.y = 0;
window.setAttributes(wl);
2):创建KeepManager,并实现单例模式
private static final KeepManager ourInstance = new KeepManager();
/**
* 单例模式
*/
public static KeepManager getInstance() {
return ourInstance;
}
public KeepManager() {
}
实现广播注册开屏、关屏和注销
/**
* 注册 关屏和开屏
*/
public void registerKeep(Context context) {
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_SCREEN_OFF);
filter.addAction(Intent.ACTION_SCREEN_ON);
keepReceiver = new KeepReceiver();
context.registerReceiver(keepReceiver, filter);
}
/**
* 注销
*/
public void unregisterKeep(Context context) {
if (keepReceiver != null) {
context.unregisterReceiver(keepReceiver);
}
}
实现1像素Activity的绑定和注销方法
/**
* 开启 1px Acitivity
*/
public void startKeep(Context context) {
Intent intent = new Intent(context, KeepActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
}
/**
* 注销 1px Activity
*/
public void finishKeep() {
if (mKeepAct != null) {
Activity activity = mKeepAct.get();
if (activity != null) {
activity.finish();
}
mKeepAct = null;
}
}
3):创建KeepReceiver广播,并实现开关屏是的处理逻辑
String action = intent.getAction();
if (TextUtils.equals(action, Intent.ACTION_SCREEN_OFF)) {
//关屏
KeepManager.getInstance().startKeep(context);
} else if (TextUtils.equals(action, Intent.ACTION_SCREEN_ON)) {
//开屏
KeepManager.getInstance().finishKeep();
}
4)在KeepManager中实现弱引用绑定
private static WeakReference<Activity> mKeepAct;
/**
* 绑定弱引用
*/
public void setKeep(KeepActivity keep) {
mKeepAct = new WeakReference<Activity>(keep);
}
5)最后在MainActivity中启用
//通过 1pxActivity 进行提权
KeepManager.getInstance().registerKeep(this);
@Override
protected void onDestroy() {
super.onDestroy();
KeepManager.getInstance().unregisterKeep(this);
}