本文為個(gè)人學(xué)習(xí)筆記分享恨樟,沒有任何商業(yè)化行為褪那,對(duì)其他文章的引用都會(huì)標(biāo)記幽纷。如有侵權(quán)行為,請(qǐng)及時(shí)提醒更正博敬!如需轉(zhuǎn)載請(qǐng)表明出處
Android庇呀活相關(guān)博客大綱
希望看了的小伙伴都關(guān)注一下。
上文說到偏窝,Android主要通過LMK(Low Memory Killer)來對(duì)進(jìn)程進(jìn)行回收管理收恢,LMK是在Android系統(tǒng)內(nèi)存不足而選擇kill部分進(jìn)程釋放空間武学,生死大權(quán)的決定者,其基于Linux的OOM機(jī)制伦意,LMK通過oom_adj與占用內(nèi)存的大小決定要?dú)⑺赖倪M(jìn)程火窒,oom_adj值越小,越不容易被殺死驮肉。上面的幾種進(jìn)程形態(tài)對(duì)于的不同的oom_adj值熏矿。前臺(tái)進(jìn)程的優(yōu)先級(jí)為0,普通service的進(jìn)程優(yōu)先級(jí)是8离钝。
所以保證進(jìn)程的高優(yōu)先級(jí)票编,可以在一定程度上避免應(yīng)用被LMK回收,從而達(dá)到應(yīng)用蹦纬剑活的效果
思路
在用戶鎖屏或者h(yuǎn)ome狀態(tài)下栏妖,開啟1px的Activity。以達(dá)到進(jìn)程高優(yōu)先級(jí)
1.1px Activity
自定義Activity奖恰,在onCreate方法中實(shí)現(xiàn)1px。
@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.height = 1;
params.width = 1;
window.setAttributes(params);
}
2.設(shè)置透明style
<style name="OnePxActivityStyle" parent="Theme.AppCompat.Light.NoActionBar">
<!-- 窗體背景顏色為透明 -->
<item name="android:windowBackground">@android:color/transparent</item>
<!-- 窗體沒有邊框 -->
<item name="android:windowFrame">@null</item>
<!-- 窗體不包含標(biāo)題欄 -->
<item name="android:windowNoTitle">true</item>
<!-- 窗體懸浮 -->
<item name="android:windowIsFloating">true</item>
<!-- 自定義TitleBar時(shí)去掉多余的陰影-->
<item name="android:windowContentOverlay">@null</item>
<!-- 不允許窗體背景變暗-->
<item name="android:backgroundDimEnabled">false</item>
<!-- 窗體切換無動(dòng)畫-->
<item name="android:windowAnimationStyle">@null</item>
<!-- 禁用窗口的預(yù)覽動(dòng)畫-->
<item name="android:windowDisablePreview">true</item>
<item name="android:windowNoDisplay">false</item>
<item name="android:windowIsTranslucent">true</item>
</style>
//在AndroidManifest.xml里設(shè)置
<activity
android:name=".OnePxActivity"
android:screenOrientation="portrait"
android:theme="@style/OnePxActivityStyle"></activity>
3.監(jiān)聽鎖屏廣播
<receiver android:name=".Receiver.OnePixelReceiver">
<intent-filter>
<action android:name="android.intent.action.SCREEN_OFF" />
<action android:name="android.intent.action.USER_PRESENT" />
</intent-filter>
</receiver>
/**
* Created by Administrator on 2017/7/10.
* 監(jiān)聽屏幕狀態(tài)的廣播
*/
public class OnePixelReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) { //屏幕關(guān)閉啟動(dòng)1像素Activity
Intent it = new Intent(context, OnePxActivity.class);
it.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(it);
} else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) { //屏幕打開 結(jié)束1像素
context.sendBroadcast(new Intent("finish"));
Intent main = new Intent(Intent.ACTION_MAIN);
main.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
main.addCategory(Intent.CATEGORY_HOME);
context.startActivity(main);
}
}
}
這種策略是比較常見的策略宛裕。但應(yīng)用場(chǎng)景比較狹窄瑟啃,只是作為保活的補(bǔ)充揩尸。在高版本系統(tǒng)會(huì)這種類型的Activity做限制蛹屿,但低版本手機(jī)還是可以嘗試的。毖矣埽活有風(fēng)險(xiǎn)错负,量力而為。