android 灰色保活使用,Android保活记录

本文介绍了Android应用保活的几种常见策略,包括灰色保活、1像素保活等,详细解析了代码实现,并讨论了不同保活手段对用户体验和系统资源的影响。同时,提到了监听屏幕锁屏解锁的实现方式以及Android进程优先级和内存管理的关系。
摘要由CSDN通过智能技术生成

66b52468c121889b900d4956032f1009.png

8种机械键盘轴体对比

本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?

介绍

因为实际业务需要实时接收推送,所以应用保活也成为了必要功能,我承认保活真的是耍流氓~

灰色保活灰色保活,目前应用最广泛的手段.利用Android系统漏洞来启动一个前台的Service,区别在于它不会在通知栏出现通知,用户基本没有察觉1

2

3

4

5

6

7

8private final static int KEEP_ID = 123456;

if (Build.VERSION.SDK_INT < 18) {

startForeground(KEEP_ID, new Notification());

}else{

Intent keep = new Intent(this, KeepInnerService.class);

startService(keep);

startForeground(KEEP_ID, new Notification());

}

KeepInnerService1

2

3

4

5

6

7

8

9

10

11

12public class extends Service{

private final static int KEEP_ID = -1001;

public (){

}

public int onStartCommand(Intent intent, int flags, int startId){

startForeground(KEEP_ID, new Notification());

stopForeground(true);

stopSelf();

return super.onStartCommand(intent, flags, startId);

}

}

1像素保活(QQ神技)

创建一个Activity1

2

3

4

5

6

7

8

9

10

11

12

13

14protected void onCreate(Bundle savedInstanceState){

super.onCreate(savedInstanceState);

PkApplication.addActivity(this);

PkApplication.keppLiveInstance = this;

Window window = getWindow();

window.setGravity(Gravity.LEFT|Gravity.TOP);

WindowManager.LayoutParams attributes = window.getAttributes();

attributes.x=0;

attributes.y=0;

attributes.height=0;

attributes.width=0;

window.setAttributes(attributes);

}

设置清单文件1

2

3

4

5

6

7

8

9

android:name=".weight.activitys.KeepLiveActivity"

android:configChanges="keyboardHidden|orientation|screenSize|navigation|keyboard"

android:excludeFromRecents="true"

android:exported="false"

android:finishOnTaskLaunch="false"

android:launchMode="singleInstance"

android:process=":live"

android:theme="@style/keepLive" />

android:configChanges(未验证)不设置此属性, Activity切换横竖屏时会重新调用各个生命周期,切横屏会执行一次,切竖屏会执行两次

设置android:configChanges=”orientation”,调用各个生命周期,切横竖屏都是一次

设置Activity的android:configChanges=”orientation|keyboardHidden”时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法

android:excludeFromRecents

是否显示在最近打开的Activity列表里

android:exported

是否允许activity被其他程序调用

android:finishOnTaskLaunch

当用户重启这个任务的时候是否关闭已打开的Activity

android:process

一个Activity运行时所在的进程名,所有组件运行在默认的进程中,这个进程跟包名一直. process属性能够为所有组件设定一个新的默认值.但任何组件都可以覆盖这个默认值,允许你将你的程序放在多进程中使用.如果这个属性被”:”开头命名,当这个Activity运行时,一个新的专属于这个程序的进程将被创建.如果以小写字母开头,这个Activity将运行在全局的进程中

主题设置1

2

3

4

5

6

7

8

9

10

11

12

@android:color/transparent //背景

@null //边框

true //有无标题

true //是否浮现在Activity之上

true //半透明

@null //窗口内容放置的Drawable资源

false // 模糊

@null //Dialog 进入、退出动画

true //禁用默认启动窗口

false //当前启动的窗口不可见

监听锁屏,解锁启动 KeepLiveActivity

随着Android版本的升高,目前静态监听屏幕锁屏,解锁已不可用,只能动态注册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

30private BroadcastReceiver screenReciver = new BroadcastReceiver() {

public void onReceive(Context context, Intent intent){

String action = intent.getAction();

if(action.equals(Intent.ACTION_SCREEN_OFF)){

Intent keep = new Intent(getApplicationContext(),KeepLiveActivity.class);

startActivity(keep);

}

if (action.equals(Intent.ACTION_USER_PRESENT)){

if(null!=PkApplication.keppLiveInstance){

PkApplication.keppLiveInstance.finish();

}

}

}

};

private void initScreenBroadcastReceiver(){

IntentFilter intentFilter = new IntentFilter();

intentFilter.addAction(Intent.ACTION_SCREEN_OFF);

intentFilter.addAction(Intent.ACTION_USER_PRESENT);

registerReceiver(screenReciver,intentFilter);

}

注意

protected void onDestroy(){

super.onDestroy();

unregisterReceiver(screenReciver); //记得卸载监听

}

注:

此方法使用后出现了,在APP活动可见情况下锁屏,解锁后出现APP退出,可能是android:launchMode=”singleInstance”原因,但是当APP点击HOME键以后再锁屏解锁则不受影响,目前还不清楚原因

解决办法:

在接受到锁屏通知前,先调用HOME功能1

2

3

4Intent home = new Intent(Intent.ACTION_MAIN);

home.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

home.addCategory(Intent.CATEGORY_HOME);

startActivity(home);

adb 命令

进入adb shell 模式

打印指定包名的进程中所有Service信息

dumpsys activity services PackageName

查看进程优先级ps | grep PackageName 获取指定包名的进程信息,

如果报 grep: can’t execute: Permission denied可以先ps 打印所有的进程信息,复制到文本中,通过包名查找找到对应的进程ID

jincheng.pngcat /proc/进程ID/oom_adj

youxianji.png

oom_adj概念进程的oom_adj越大,表示进程的优先级越低,越容易被回收;越少,表示进程优先级越高

普通APP的oom_adj>=0,系统进程的oom_adj才可能<0

APP退出到后台所有的进程优先级都会降低. 其中UI进程降低的最为明显,因为它占用的内存资源最多.

Tanks

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值