我有一个从AlarmManager
接收广播的应用程序。在此基础上,它启动一个透明的Activity
(AlarmAlertDialogActivity
),然后显示一个AlertDialog
。在AlertDialog
上单击Cancel将导致调用finish()
。
由于AlarmAlertDialogActivity
不是从另一个Activity
而是从一个广播接收器启动的,因此
Intent.FLAG_ACTIVITY_NEW_TASK
这意味着活动将在新任务中启动。
我的问题是,当取消
AlertDialog
(即按住home按钮并单击应用程序图标)后从最近的历史记录重新启动应用程序时,警报对话框将重新启动。我希望通过使用finish()
/Intent
标志可以避免这种情况;我希望发生的是Activity
父活动启动之前的最后一次AlertDialog
。我尝试过在启动
Intent.FLAG_ACTIVITY_NO_HISTORY
时将位掩蔽AlarmAlertDialogActivity
作为附加标志,但这似乎没有什么区别。bitmasking
Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
可以工作,但只能从最近的历史记录中删除应用程序(顾名思义)。这不利于用户体验。那么,有没有可能得到我正在寻找的ui流?
更新-根据要求提供更多信息:
来自广播接收器的Logcat、AlertDialog活动和My Main活动:
05-30 10:36:00.132: D/everyOtherApp(362): Received alarm broadcast at: Wed May 30 10:36:00 GMT+00:00 2012
05-30 10:36:00.262: D/everyOtherApp(362): AlarmAlertDialogActivity.onCreate()
05-30 10:36:00.912: D/everyOtherApp(362): AlarmAlertDialogActivity.onResume()
05-30 10:36:12.461: D/everyOtherApp(362): Cancel pressed
//Cancel exits the activity. I now relaunch the app from recent history:
05-30 10:36:20.233: D/everyOtherApp(362): AlarmAlertDialogActivity.onCreate()
05-30 10:36:21.621: D/everyOtherApp(362): AlarmAlertDialogActivity.onResume()
从广播接收器启动活动的代码:
Intent intent = new Intent(new Intent(applicationContext, AlarmAlertDialogActivity.class));
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.putExtra(Constants.SCHEDULED_ALARM_TAG, alarm);
applicationContext.startActivity(intent);
manfest文件中的AlarmAlertDialogActivity:
<activity
android:name=".AlarmAlertDialogActivity"
android:theme="@android:style/Theme.NoDisplay" >
</activity>
最佳答案
我在另一个项目中做了类似的事情。我有一个广播接收器,它可以获取有关数据连接和SIM卡配置文件更改的信息,并显示一个对话框(使用与您类似的活动)警告用户他可能会招致费用。我最后做的是:
在清单中,在AlarmAlertDialogActivity的<Activity>
标记中,添加以下内容:
android:excludeFromRecents="true"
android:noHistory="true"
android:taskAffinity=""
说明:将
excludeFromRecents
和noHistory
设置为“true”可确保活动不会显示在最近的应用程序列表中,而且一旦用户离开活动,他将无法返回(这可能是您想要的)。将taskAffinity
设置为空字符串可确保AlarmAlertDialogActivity在其自己的任务中运行,即使在显示对话框时应用程序正在运行。只要您有另一个活动作为您的应用程序的主要活动(即:使用
action.MAIN
和category.LAUNCHER
的意图过滤器),这就可以解决您的问题。