第一步,新建一个Activity,作为1像素页面的主体,我姑且叫它HooliganActivity:
public class HooliganActivity extends Activity {
private static final String TAG = "HooliganActivity";
private static HooliganActivity instance;
/**
* 开启保活页面
*/
public static void startHooligan() {
Log.d(TAG, "startHooligan: 开启保活页面");
Intent intent = new Intent(My_Application.getContext(), HooliganActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
My_Application.getContext().startActivity(intent);
}
/**
* 关闭保活页面
*/
public static void killHooligan() {
Log.d(TAG, "killHooligan: 关闭保活页面");
if (instance != null) {
instance.finish();
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
instance = this;
Window window = getWindow();
window.setGravity(Gravity.LEFT | Gravity.TOP);
WindowManager.LayoutParams params = window.getAttributes();
params.x = 0;
params.y = 0;
params.height = 1;
params.width = 1;
window.setAttributes(params);
}
@Override
protected void onDestroy() {
super.onDestroy();
instance = null;
}
}
第二步,注册清单文件:
<activity
android:name=".view.HooliganActivity"
android:configChanges="keyboardHidden|orientation|screenSize|navigation|keyboard"
android:excludeFromRecents="true"
android:exported="false"
android:finishOnTaskLaunch="false"
android:launchMode="singleInstance"
android:theme="@style/HooliganActivityStyle" />
<style name="HooliganActivityStyle">
<item name="android:windowBackground">@color/transparent</item>
<item name="android:windowContentOverlay">@null</item>
<item name="android:windowIsTranslucent">true</item>
<item name="android:windowNoDisplay">false</item>
<item name="android:windowDisablePreview">true</item>
</style>
<!--安卓全透明颜色-->
<color name="transparent">#00000000</color>
第三步,监听锁屏和解锁通知,不能静态注册广播,只能动态注册:【可以放在MainActivity、BaseActivity、或者是SplashActivity中】
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_SCREEN_ON);
filter.addAction(Intent.ACTION_SCREEN_OFF);
registerReceiver(new BootCompleteReceiver(), filter);
第四步,分别在解锁和锁屏时唤醒我的HooliganActivity:
/**
* Created by 柱子 on 2018/04/13
*/
public class NetBroadcastReceiver extends BroadcastReceiver {
public NetEvevt netEvevt = BaseActivity.evevt;
@Override
public void onReceive(Context context, Intent intent) {
Log.e("eeee", "onReceive: ");
if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
HooliganActivity.startHooligan();
} else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) {
HooliganActivity.killHooligan();
}
}
}
这样你在后台每次锁屏,实际上都会吊起一个一像素的页面,假装app在前台,拥有最高进程优先级。