哎,这事儿我之前也遇到过,后台启动Activity,结果发现好多机型不支持,真是头疼。今天就来跟大家聊聊这个问题,看看怎么解决。
首先,结论是:在Oppo、vivo、小米等机型上,如果你没有开启后台弹出界面权限,当你的App处于后台时,将无法通过startActivity方式启动页面。
这个权限在不同型号的手机中的名称不同,我们统称为后台弹出界面权限。下面我们就来一步步分析这个问题,看看怎么解决。
一、业务背景
我们的App中有一个场景:当收到推送或者长连接消息的时候,需要启动一个Activity来展示相关的信息,在Activity展示后回复服务端ACK表示页面正常展示。结果ACK与消息发送总量的比例只有80%左右,产品经理不干了。
二、问题定位
我们通过线上埋点数据发现,调用了startActivity方法,但是确没有任何在目标页面onCreate方法中的埋点数据。经过测试,发现当App处于后台时,收到消息无法展示页面。
三、问题分析
我们发现这个问题大量出现在OPPO,vivo手机上,也有少量的小米机型。经过对比发现,OPPO,vivo的手机确实有这个问题,华为和三星倒没这个问题。
我们还发现,这个问题的手机Android系统版本分布很均匀,从Android 6.0到Android 9.0都有发生,因此和Android系统版本应该没有关系。
进一步分析发现,在调用startActivity方法的时候,App确实都处于后台。
四、问题解决
我们尝试了多种方案,包括前台Service、PendingIntent、播放音频、获取系统权限等,但都失败了。
最后,我们找到了一个临时方案:将App切换到前台。具体做法是在onResume方法中,读取有效消息,并启动页面。或者采用轮询检测,在收到消息后采用轮训的方式来将App切换到前台,并启动页面。
这种方式在我们的项目中效果不错,ACK与消息发送总量的比例从80%左右上升到了97%左右。
五、Android Q
需要注意的是,以上所有方式在Android Q中均失效。Google在Android Q中增加了从后台启动Activity的限制,无法访问的话,可能需要科学上网。
总之,这是一个比较头疼的问题,但是通过一些方法还是可以解决的。希望我的分享能帮到大家。
——陆砚码,思享编程网(www.sxgpb.com)
