1像素Activity进程保活

来源:互联网 发布:斑马二维码打印软件 编辑:程序博客网 时间:2024/05/17 23:31

Android8.0马上就要发布,Google对于安卓市场上各种应用占据内存空间的问题不断进行内存完善,我们的应用进程很难再保持不死之身,以前的服务唤醒在5.0已经失效,现在我们尽可能的做到保活方式就是提高进程的优先级,本文介绍一种1像素Activity保活进程的实现(据说QQ也在用)。
其整个逻辑就是在手机屏幕黑屏时,我们启动一个1像素的Activity,其占用内存很小毕竟只有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);

监听到屏幕状态后的处理:

/** * Created by Administrator on 2017/7/10. * 监听屏幕状态的广播 */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);        }    }}

创建我们的1像素的Activity:

/** * Created by Administrator on 2017/7/10. */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();        }    }}

我们还需要设置1像素activity为透明,不然可能会影响体验,但是影响不大,1像素毕竟是挑战视力的存在。

<style name="OnePixelActivity" parent="android:Theme.Holo.Light.NoActionBar">//无标题        <item name="android:windowIsTranslucent">true</item>//透明    </style>

AndroidManifest重配置

 <activity        android:name=".OnePiexlActivity"        android:screenOrientation="portrait"        android:theme="@style/OnePixelActivity"></activity>

以上为1像素保活进程的基本实现,后续在学习Notication提高进行优先级保活后分享。