android home 后台,解决Android 按Home键时无法从后台启动Activity

最近有个需求:在检查到特定条件的时候,自动从后台启动页面。

很简单的功能,但是也遇到了坑,那就是:按Home键时无法从后台启动Activity。

会报以下错误:

10-22 17:31:21.897 I/ActivityManager( 664): START u0 {flg=0x14000000 meizuflg=0x200000 cmp=com.pl.getaway.getaway/com.pl.getaway.component.Activity.welcome.SplashActivity } from uid 10255

10-22 17:31:21.897 W/ActivityManager( 664): Activity start request from 10020 stopped

百度一下,很快就找到了原因,是Android系统本身的限制:

当通过 home 键将当前 activity 置于后台时,任何在后台startActivity 的操作都将会延迟 5 秒。

除非该应用获取了"android.permission.STOP_APP_SWITCHES" 权限。

关于延迟 5 秒的操作在 com.android.server.am.ActivityManagerService 中的 stopAppSwitches() 方法中。

系统级的应用当获取了 "android.permission.STOP_APP_SWITCHES" 后将不会调用到这个方法来延迟通过后台启动 activity 的操作。

事实上 android 原生的 Phone 应用就是这样的情况,它是一个获取了"android.permission.STOP_APP_SWITCHES" 权限的系统级应用。

当有来电时,一个从后台启动的 activity 将突然出现在用户的面前,警醒用户有新的来电,这样的设计是合理的。

方法很简单,也很巧妙,用PendingIntent来启动:

把:

Intent intent = new Intent(context, A.class);

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

context.startActivity(intent);

改成:

Intent intent = new Intent(context, A.class);

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

PendingIntent pendingIntent =

PendingIntent.getActivity(context, 0, intent, 0);

try {

pendingIntent.send();

} catch (PendingIntent.CanceledException e) {

e.printStackTrace();

}

如此即可解决问题。

但是这种方案也并不完美,在pixel 2 android 9上可以完美运行,但是在小米6 miui10,android 8.0上无法运行。

再次感叹:

1、面向google和sof编程是如此重要。

2、国产ROM是多么厉害

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值