1像素的Activity让应用在息屏后保活

原创 2017年07月12日 17:53:29

集成后,经过测试,有的手机还是会杀死,更残忍的是,在你的手机息屏的时候,5分钟之内,你的Service早被杀的无影无踪,后来,在网上了解了一个防止Service在息屏后被杀死的思路,就是监听屏幕亮灭的广播,在息屏的时候,开启1个像素的Activity,在屏幕亮的时候,马上关闭,做到用户无感知。下面贴出代码:

首先在你的不死Service中注册屏幕亮灭的广播

 mScreenStatusReceiver = new ScreenStatusReceiver();    
 IntentFilter screenStatus = newIntentFilter(Intent.ACTION_SCREEN_UP);    
 screenStatus.addAction(Intent.ACTION_SCREEN_OFF);    
 registerReceiver(mScreenStatusReceiver, screenStatus);  
 // 友情提示:切记要记得反注册unregist...哦
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

然后在屏幕广播中写入以下代码

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);//发送对应的广播
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

以上代码中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();
    }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36

OnPxActivity在清单文件中的配置

<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>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

以下是activity的theme,具体配置的意思再注释中已经写的很详细。

<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:windowBackground">@null</item>
        <!-- 设置背景透明 -->
        <item name="android:windowIsTranslucent">true</item>
        <!-- 无遮盖 -->
        <item name="android:windowContentOverlay">@null</item>
        <!-- 为窗体的Enter和Exit设置动画 -->
        <item name="android:windowAnimationStyle">@null</item>
        <!-- 是否禁止窗体显示前显示的View -->
        <item name="android:windowDisablePreview">true</item>

        <item name="android:windowNoDisplay">false</item>
    </style>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

还望大神指正补充。

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Android高仿UC浏览器和360手机卫士消息常驻栏(通知栏)

之前网上看了下自定义消息栏,通知栏,了解到了Notification这个控件,发现UC浏览器等都是这种类型,今天写个demo实现下,如图: 其中每个按钮都有不同的功能,代码如下: package ...
  • onceing
  • onceing
  • 2015年07月16日 14:44
  • 1992

kotlin-for-android简介 (让你的Android代码更简洁)

Kotlin是众多基于JVM的语言之一,它一开始是作为android 开发中java语言的可能的代替者出现的。java是世界上使用最多的语言之一,而伴随着其他语言的发展使得程序员编程越来越容易,...

1像素Activity进程保活

Android8.0马上就要发布,Google对于安卓市场上各种应用占据内存空间的问题不断进行内存完善,我们的应用进程很难再保持不死之身,以前的服务唤醒在5.0已经失效,现在我们尽可能的做到保活方式就...

安卓一像素Activity保活+动态广播

Android8.0马上就要发布,Google对于安卓市场上各种应用占据内存空间的问题不断进行内存完善,我们的应用进程很难再保持不死之身,以前的服务唤醒在5.0已经失效,现在我们尽可能的做到保活方式就...

实现谣传QQ中的手段——“1像素页面保活”

实现谣传QQ中的手段——“1像素页面保活”关于App保活,曾经使用N多方法,只为本尊不被秒杀,随着sdk版本的提升,很多法宝已经失去了原本的神奇作用,那么今天我们来试试传说中的一像素保活实现。...

Struts2应用在断网的情况下启动报错: java/net/AbstractPlainSocketImpl.java:178:-1解决

错误代码: SEVERE: Exception starting filterstruts2 Unable to load configuration. -Class: java.net.Abst...

adnroid APP应用在锁屏界面之上的时候怎么弹消息,Toast.makeText弹不出消息,用自定义窗口模式

private Handler mHandler2 = new Handler() {         public void handleMessage(android.os.Message msg...

FT5X06 如何应用在10寸电容屏(linux-3.5电容屏驱动简析&移植10寸电容屏驱动到Android4.2) (by liukun321咕唧咕唧)

这是几个月以前的东西了,在彻底遗忘之前拿出来好好写写。做个笔记,也算是造福后来人了。在做这个项目之前,没有做过电容屏的驱动,印象中的电容触摸屏是不需要校正的。IC支持多大的屏就要配多大的屏。但是拿到需...

IOS应用在iPhone5和iPhone5s上不能全屏显示,应用画面上下各有1条黑色的解决方案

最近在发布应用的时候被苹果拒绝了,原因是我的应用在iPhone5上没有铺满屏幕显示画面,而是在应用画面的上下各有一条黑色,导致应用画面没有铺满iPhone5的屏幕。...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:1像素的Activity让应用在息屏后保活
举报原因:
原因补充:

(最多只允许输入30个字)