在網上了解了一個防止Service在息屏后被殺死的思路,就是監聽屏幕亮滅的廣播,在息屏的時候,開啟1個像素的Activity,在屏幕亮的時候,馬上關閉,做到用戶無感知。下面貼出代碼:
mScreenStatusReceiver = new ScreenStatusReceiver(); IntentFilter screenStatus = newIntentFilter(Intent.ACTION_SCREEN_UP); screenStatus.addAction(Intent.ACTION_SCREEN_OFF); registerReceiver(mScreenStatusReceiver, screenStatus); // 友情提示:切記要記得反注冊unregist...哦
然后在屏幕廣播中寫入以下代碼:
if(action.equals(Intent.ACTION_SCREEN_OFF)){ // 當屏幕關閉時,啟動一個像素的Activity Intent activity = new Intent(context,OnePxActivity.class); activity.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(activity); } else if (action.equals(Intent.ACTION_SCREEN_ON)){ // 用戶解鎖,關閉Activity // 這里發個廣播是什么鬼,其實看下面OnePxAcitivity里面的代碼就知道了,發這個廣播就是為了finish掉OnePxActivity Intent broadcast = new Intent("FinishActivity"); // broadcast.setFlags(32);Intent.FLAG_INCLUDE_STOPPED_PACKAGES context.sendBroadcast(broadcast);//發送對應的廣播 }
以上代碼中OnePxActivity就是我所說的1像素的Activity,(中國式英語OnePxActivity)
下面貼出Activity的代碼:
public class OnePxActivity extends Activity { protected BroadcastReceiver receiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { // 收到廣播 OnePxActivity.this.finish(); } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Window window = getWindow(); // 設置窗口位置在左上角 window.setGravity(Gravity.LEFT | Gravity.TOP); WindowManager.LayoutParams params = window.getAttributes(); params.x = 0; params.y = 0; params.width = 1; params.height = 1; window.setAttributes(params); // 動態注冊廣播,這個廣播是在屏幕亮的時候,發送廣播,來關閉當前的Activity registerReceiver(receiver, new IntentFilter("FinishActivity")); } @Override protected void onDestroy() { unregisterReceiver(receiver); Log.e(TAG, TAG + "onDestory"); super.onDestroy(); } }
OnPxActivity在清單文件(AndroidManifest.xml)中的配置
<activity android:name=".activity.OnePxActivity"
android:configChanges="keyboardHidden|orientation|screenSize|navigation|keyboard" android:excludeFromRecents="true" android:exported="false" android:finishOnTaskLaunch="false" android:launchMode="singleInstance" android:process=":process" android:theme="@style/undeadActivityStyle" > </activity>
以下是activity的theme(/res/values/styles.xml),具體配置的意思再注釋中已經寫的很詳細。
<style name="undeadActivityStyle"> <!-- 背景設置為透明 --> <item name="android:windowBackground">@android:color/transparent</item> <!-- 是否有邊框 --> <item name="android:windowFrame">@null</item> <item name="android:windowNoTitle">true</item> <!-- 是否浮動在界面上 --> <item name="android:windowIsFloating">true</item> <!-- 是否透明 --> <item name="android:windowIsTranslucent">true</item> <!-- 窗體上面是否有遮蓋 --> <item name="android:windowContentOverlay">@null</item> <!-- 背景是否變暗 --> <item name="android:backgroundDimEnabled">false</item> <!-- 設置背景透明 --> <item name="android:windowIsTranslucent">true</item> <!-- 為窗體的Enter和Exit設置動畫 --> <item name="android:windowAnimationStyle">@null</item> <!-- 是否禁止窗體顯示前顯示的View --> <item name="android:windowDisablePreview">true</item> <item name="android:windowNoDisplay">false</item> </style>
轉: https://blog.csdn.net/cn_1937/article/details/53933073