后台启动Activity

来源:互联网 发布:java 小红本 编辑:程序博客网 时间:2024/06/05 19:41

问题:定时器界面A    定时提醒界面B

A正在运行,按HOME键被切换到后台,这时时间到了,应该启动B界面,这时在桌面再次点击定时器图标,则B界面再也不出现。

从log中,发现启动B界面的请求被忽略了

06-22 17:31:21.897 I/ActivityManager(  664): START u0 {flg=0x10000000 cmp=com.mobvoi.ticwear.timer/.ui.TimerUpActivity (has extras)} from uid 10020 on display 0
06-22 17:31:21.897 W/ActivityManager(  664): Activity start request from 10020 stopped


Android代码:frameworks/base/services/core/java/com/android/server/am/ActivityStackSupervisor.java    startActivityLocked函数


解释:

当通过 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 将突然出现在用户的面前,警醒用户有新的来电,这样的设计是合理的。 

所以,当你需要开发类似 Phone 这样的应用时,需要做如下工作:
  1. root 你的手机;
  2. 在 AndroidManifest.xml 中添加 "android.permission.STOP_APP_SWITCHES"  用户权限;
  3. 将你开发的应用程序 push 到手机的 /system/app 目录中。
http://blog.csdn.net/ixiaobu/article/details/18226917


我又做了个实验,

1)  在MainActivity onStop的时候,启动2s的定时器,启动Activity2.

结论:从onStop到Activity2展现,需要5s

06-23 10:22:35.298 D/MainActivity( 9769): onStop
06-23 10:22:37.308 E/MainActivity( 9769): thread time up
06-23 10:22:37.308 I/ActivityManager( 1073): START u0 {cmp=com.example.myapplication/.Activity2} from uid 10141 on display 0
06-23 10:22:37.308 W/ActivityManager( 1073): resultRecord is null: true
06-23 10:22:37.308 W/ActivityManager( 1073): Activity start request from 10141 stopped
06-23 10:22:39.888 D/Activity2( 9769): onCreate

2) 在MainActivity onStop的时候,启动7s的定时器,启动Activity2.

结论:从onStop到Activity2展现,需要7s

06-23 10:31:35.018 D/MainActivity(21082): onStop
06-23 10:31:42.048 E/MainActivity(21082): thread time up
06-23 10:31:42.048 I/ActivityManager( 1073): START u0 {cmp=com.example.myapplication/.Activity2} from uid 10141 on display 0
06-23 10:31:42.208 D/Activity2(21082): onCreate

0 0