讓應用在息屏后保活


在網上了解了一個防止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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM