Android 点击Home键之后启动Activity会延迟5秒
Android 点击Home键之后启动Activity会延迟5秒的情况
关于后台 startActivity 被延迟 5 秒
关于在 Service 或 BroadcastReceiver 中 startActivity
1. 不从后台启动 Activity 准则:
在谷歌的 Android API Guides 中,特意提醒开发者不要在后台启动 activity,包括在 Service 和 BroadcastReceiver 中,这样的设计是为了避免在用户毫不知情的情况下突然中断用户正在进行的工作。
2. 需要违反“不从后台启动 Activity”准则的特例:
特例:即便如此,手机厂商的开发者们在开发基于系统级的应用的时候,可能仍然需要有从 Service 或 BroadcastReceiver 中 startActivity 的需求,往往这样的前提是连这样的 Service 或 BroadcastReceiver 也是由用户的某些操作而触发的,Service 或 BroadcastReceiver 只是充当了即将启动 activity 之前的一些代理参数检查工作以便决定是否需要 start 该 activity。
一个需要特别注意的问题是,特例中所述的情况还会遇到一个问题,就是当通过 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、在 AndroidManifest.xml 中添加 "android.permission.STOP_APP_SWITCHES" 用户权限;
2、将应用程序 push 到手机的 /system/app 目录中。
方案二:
1. 通过以下方式启动activity
Intent intent = new Intent(context, TransparentActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);
pendingIntent.send();