Android应用保活实践

2 年前 · 来自专栏 Android开发经验总结

最近做了一个包含即时通讯功能的应用。即时通讯IM功能需要应用实时在线,即使是在后台或者在熄屏状态下。为了让应用实时在线,采取了以下三步:

操作一:启动前台服务startForegroundService提高系统优先级。

启动前台服务,调用startForegroundService去启动一个service。在该service的onStartCommand方法中,调用startForeground启动一个前台通知。注意调用方法startForegroundService和startForeground应判断当前设备的版本是不是大于等于Android O,大于等于Android O才有前台服务。判断方法如下:

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
           startForegroundService(service);
        }

做了上述操作后,在手机上应用保活经测试基本上没有问题。可以一直有常驻通知。但是在荣耀10手机上发现,熄屏一分钟左右,很快就与服务端的心跳断了。就处于离线状态。 经分析后本人认为,虽然应用没有被杀掉,但是进入了一种相当于休眠的状态,熄屏后很快就不能再网络操作 如何在后台保持网络操作呢? 于是就有了操作二。

操作二:用Intent引导用户允许应用在后台运行

如果不用intent引导,而只是告知用户去设置->电源中去授权应用在后台运行,也能达到保活效果,但是就会导致用户寻找成本,使用成本大大增加。这里我们还是推荐通过intent的方式帮助用户快速设置。

 Intent intent = new Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
            intent.setData(Uri.parse("package:" + activity.getPackageName()));
            activity.startActivity(intent);

注意,上述引导方法需要判断用户手机版本是否大于等于Android M.

增加上述操作引导后,用户就可以很容易的设置忽略电池优化,允许应用在后台运行。加上操作二之后,在荣耀10手机上测试,没有再发现熄屏后掉线的问题。

本来以为以上两个步骤已经OK了。但是实际运行发布过程中,发现我还是太年轻。在红米Note8 pro上可以了。但是在华为手机上一断开数据线很容易掉线。华为手机需要在手机管家-应用启动管理中,将自己的应用的自动管理开关关闭,使用手动管理。同时打开允许后台活动的开关。如下图。

加上上述设置后,在华为手机上可以正常保活。

编辑于 2020-12-14 21:45

文章被以下专栏收录

    Android开发经验总结

    Android开发经验总结

    把平时踩过的坑,总结的技术经验,小知识与大家分享