Android中1像素Activity进程保活

Android8.0马上就要发布,Google对于安卓市场上各种应用占据内存空间的问题不断进行内存完善,我们的应用进程很难再保持不死之身,以前的服务唤醒在5.0已经失效,现在我们尽可能的做到保活方式就是提高进程的优先级,本文介绍一种1像素Activity保活进程的实现(据说QQ也在用)。

其整个逻辑就是在手机屏幕黑屏时,我们启动一个1像素的Activity,其占用内存很小毕竟只有1像素嘛,无形中减小了内存的回收几率,在屏幕亮的时候就关闭该页面。

实现步骤

1、首先需要在MainActivity中注册一个监听手机屏幕状态的广播监听:
//注册监听屏幕的广播 mOnepxReceiver = new OnePixelReceiver();IntentFilter intentFilter = new IntentFilter();intentFilter.addAction( "android.intent.action.SCREEN_OFF");intentFilter.addAction( "android.intent.action.SCREEN_ON");intentFilter.addAction( "android.intent.action.USER_PRESENT");registerReceiver(mOnepxReceiver, intentFilter);


作者:将行陌路
链接:https://www.jianshu.com/p/ef4a9531bc15
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

//注册监听屏幕的广播 mOnepxReceiver = new OnePixelReceiver();IntentFilter intentFilter = new IntentFilter();intentFilter.addAction( "android.intent.action.SCREEN_OFF");intentFilter.addAction( "android.intent.action.SCREEN_ON");intentFilter.addAction( "android.intent.action.USER_PRESENT");registerReceiver(mOnepxReceiver, intentFilter);


作者:将行陌路
链接:https://www.jianshu.com/p/ef4a9531bc15
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
//注册监听屏幕的广播 mOnepxReceiver = new OnePixelReceiver();IntentFilter intentFilter = new IntentFilter();intentFilter.addAction( "android.intent.action.SCREEN_OFF");intentFilter.addAction( "android.intent.action.SCREEN_ON");intentFilter.addAction( "android.intent.action.USER_PRESENT");registerReceiver(mOnepxReceiver, intentFilter);


作者:将行陌路
链接:https://www.jianshu.com/p/ef4a9531bc15
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
//注册监听屏幕的广播
mOnepxReceiver = new OnePixelReceiver();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("android.intent.action.SCREEN_OFF");
intentFilter.addAction("android.intent.action.SCREEN_ON");
intentFilter.addAction("android.intent.action.USER_PRESENT");
registerReceiver(mOnepxReceiver, intentFilter);
2、监听到屏幕状态后的处理:
public class OnePixelReceiver extends BroadcastReceiver
{
    @Override
    public void onReceive(Context context, Intent intent)
    {
        if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF))
        {
            //屏幕关闭启动1像素Activity
            Intent it = new Intent(context, OnePiexlActivity.class);
            it.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(it);
        } else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON))
        {
            //屏幕打开 结束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);
        }
    }
}
3、创建我们的1像素的Activity:
public class OnePiexlActivity extends Activity
{
    private BroadcastReceiver endReceiver;
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        //设置1像素
        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);
        //结束该页面的广播
        endReceiver = new BroadcastReceiver()
        {
            @Override
            public void onReceive(Context context, Intent intent)
            {
                finish();
            }
        };
        registerReceiver(endReceiver, new IntentFilter("finish"));
        //检查屏幕状态
        checkScreen();
    }
    @Override
    protected void onResume()
    {
        super.onResume();
        checkScreen();
    }
    /** * 检查屏幕状态 isScreenOn为true 屏幕“亮”结束该Activity */
    private void checkScreen()
    {
        PowerManager pm = (PowerManager) OnePiexlActivity.this.getSystemService(Context.POWER_SERVICE);
        boolean isScreenOn = pm.isScreenOn();
        if (isScreenOn)
        {
            finish();
        }
    }
}
4、我们还需要设置1像素activity为透明,不然可能会影响体验,但是影响不大,1像素毕竟是挑战视力的存在。
<style name="OnePixelActivity" parent="android:Theme.Holo.Light.NoActionBar">
    <item name="android:windowIsTranslucent">trueitem>
style>
5、AndroidManifest配置
<activity
    android:name=".activity.OnePiexlActivity"
    android:screenOrientation="portrait"
    android:theme="@style/OnePixelActivity"/>

总结

以上为1像素保活进程的基本实现,另外保活进程还可以通过启动前台service和提升service优先级来实现。

你可能感兴趣的:(Android中1像素Activity进程保活)