需要完整有效代码的粉丝,加我上面的绿泡泡。
之前有做过1像素保活
1像素保活后台服务
现在2021年了,很多保活方式其实已经过时了
谷歌对于这方面的掌控也越来越严
而且作为开发者,其实也不建议应用长时间的驻留内存
搞得和流氓软件一样。
但一些实际场景,的确是需要进程保活的功能的
比如跑步,聊天,外卖软件等等
这几天也在搜集相关的知识
最后整理了下
发现有三种方式,还是比较能够提升app的存活率的
而且都是提示用户手动去开启的方式
不是利用系统漏洞之类的取巧方法
显得优雅了很多。
我大概整理了下,分别是
1后台运行白名单
2自启动管理
3电池策略(这一点不同厂商有不同的叫法,比如小米叫“设置后台无限制”,华为叫“设置电池优化”。这边我先统一叫电池策略)
下面就开始一一介绍,文末会放出全部代码。
1、后台运行白名单
这个方法需要添加以下权限
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
可以从权限的名字看出来,叫做忽略电池优化
这里我们还是叫做后台运行白名单
使用起来也很简单,检测下是否开启,没有就提示用户开启
也可以在onActivityResult方法里再判断一次是否开启
这个方式只对6.0以上的机器有效
文末的代码里我也做了判断
代码如下(KeepAliveUtil工具类代码会在文末放出)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (!KeepAliveUtil.isIgnoringBatteryOptimizations(this)) {
KeepAliveUtil.requestIgnoreBatteryOptimizations(this,0x001);
}else {
Toast.makeText(this, "\"忽略电池优化功能\"已开启", Toast.LENGTH_SHORT).show();
}
}else {
Toast.makeText(this, "安卓版本太低,不支持此功能", Toast.LENGTH_SHORT).show();
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
2、自启动管理
这个主要是提示用户去开启应用的自启动
因为每个厂商跳转到自启动页面的代码都不一样
所以这边用工具类适配了几个主流机型
包括miui,华为,oppo,vivo
具体代码后面也会放出
3、电池策略
这个和自启动管理差不多,也是要去适配不同的厂商的
后面一样有代码放出
只是这个需要注意
不同的厂商叫法还不一样
这个叫法是我随便起的
比如小米叫“设置后台无限制”,华为叫“设置电池优化”。
oppo里面又叫应用速冻了
vivo里面叫做允许后台高耗电
为了实现这三个提示用户去开启的功能
我做了一个简单的demo
用三个按钮去代替这三个功能的实现
第三个按钮上方还添加了TextView对开启路径做一个提示
毕竟不同厂商的路径还不一样
业务代码封装在了KeepAliveUtil这个工具类。下面开始贴代码
首先是MainActivity
public class MainActivity extends AppCompatActivity {
@RequiresApi(api = Build.VERSION_CODES.M)
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button btn1 = findViewById(R.id.btn1);
Button btn2 = findViewById(R.id.btn2);
Button btn3 = findViewById(R.id.btn3);
TextView tv_tip = findViewById(R.id.tv_tip);
btn1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//后台运行白名单
btn1Fun();
}
});
btn2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//自启动管理
btn2Fun();
}
});
btn3.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//省电策略
btn3Fun();
}
});
tv_tip.setText(KeepAliveUtil.getBatteryStrategyTipStr(this));