在學習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);
}