Android - 保活(2)一像素保活

目录

  • 一:原理
  • 二:实现
      1. 一像素的Act
      1. 广播
      1. 清单文件注册
      1. 透明主题
      1. 注册广播

一:原理

当屏幕熄灭的时候呢,锁屏状态,调起一个一像素的Activity,为的还是能够提高进程的优先级,在上一篇文章中,有详细的进程优先级的情况

二:实现

1. 一像素的Act

package com.cpsc.sanya.act;

import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.os.PowerManager;
import android.support.annotation.Nullable;
import android.util.Log;
import android.view.Gravity;
import android.view.Window;
import android.view.WindowManager;

/**
 * 描述:
 * <p>
 * <p>
 * 一像素的ACT
 *
 * @author allens
 * @date 2018/1/24
 */

public class OnePxActivity extends Activity {
    private static final String TAG = "OnePx";
    private BroadcastReceiver endReceiver;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d(TAG, "onCreate--->启动1像素保活");
        // 获得activity的Window对象,设置其属性
        Window mWindow = getWindow();
        mWindow.setGravity(Gravity.LEFT | Gravity.TOP);
        WindowManager.LayoutParams attrParams = mWindow.getAttributes();
        attrParams.x = 0;
        attrParams.y = 0;
        attrParams.height = 1;
        attrParams.width = 1;
        mWindow.setAttributes(attrParams);

        //结束该页面的广播
        endReceiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                Log.d(TAG, "onReceive--->finish");
                finish();
            }
        };
        registerReceiver(endReceiver, new IntentFilter("finish"));
        checkScreen();
    }

    @Override
    protected void onResume() {
        super.onResume();
    }

    /**
     * 检查屏幕状态  isScreenOn为true  屏幕“亮”结束该Activity
     */
    private void checkScreen() {
        PowerManager pm = (PowerManager) OnePxActivity.this.getSystemService(Context.POWER_SERVICE);
        boolean isScreenOn = pm.isScreenOn();
        if (isScreenOn) {
            finish();
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(endReceiver);
    }

}

2. 广播

package com.cpsc.sanya.receiver;

import android.content.BroadcastReceiver;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;

import com.cpsc.sanya.act.OnePxActivity;

/**
 * 描述:
 * <p>
 * <p>
 * 广播
 *
 * @author allens
 * @date 2018/1/24
 */

public class OnePixelReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        //屏幕关闭启动1像素Activity
        if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
            Log.e("OnePx", "屏幕关闭启动1像素Activity");
            Intent it = new Intent(context, OnePxActivity.class);
            it.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            context.startActivity(it);
            //屏幕打开 结束1像素
        } else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) {
            Log.e("OnePx", "屏幕打开 结束1像素");
            context.sendBroadcast(new Intent("finish"));
        }
    }
}

3. 清单文件注册

  <!-- 一像素 -->
        <activity
            android:name="com.cpsc.sanya.act.OnePxActivity"
            android:configChanges="keyboardHidden|orientation|screenSize|navigation|keyboard"
            android:excludeFromRecents="true"
            android:finishOnTaskLaunch="false"
            android:launchMode="singleInstance"
            android:theme="@style/OnePxActStyle" />

4. 透明主题

  <style name="OnePxActStyle">
        <!-- 窗体背景颜色为透明 -->
        <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>
        <!-- 自定义TitleBar时去掉多余的阴影-->
        <item name="android:windowContentOverlay">@null</item>
        <!-- 不允许窗体背景变暗-->
        <item name="android:backgroundDimEnabled">false</item>
        <!-- 窗体切换无动画-->
        <item name="android:windowAnimationStyle">@null</item>
        <!-- 禁用窗口的预览动画-->
        <item name="android:windowDisablePreview">true</item>
        <item name="android:windowNoDisplay">false</item>
    </style>


5. 注册广播

 IntentFilter intentFilter = new IntentFilter();
 intentFilter.addAction(Intent.ACTION_SCREEN_ON);
 intentFilter.addAction(Intent.ACTION_SCREEN_OFF);
 registerReceiver(new OnePixelReceiver(), intentFilter);

小礼物走一走,来简书关注我



作者:Allens_Jiang
链接:https://www.jianshu.com/p/a1bddadfb556
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值