我有一个应用程序从AlarmManager
接收广播。在此之后,它会启动一个透明的Activity
(AlarmAlertDialogActivity
),然后显示AlertDialog
。点击AlertDialog
上的取消会导致拨打finish()
。
由于AlarmAlertDialogActivity
未从其他Activity
启动,而是广播接收器,因此
Intent.FLAG_ACTIVITY_NEW_TASK
这意味着活动将在新任务中启动。
我的问题是,在取消AlertDialog
(即按住主页按钮并单击应用程序的图标)后,从最近的历史记录中重新启动应用程序时,会重新启动AlertDialog。我希望通过使用finish()
/ Intent
标志,我能够避免这种情况;我希望发生的是在Activity
的父活动发布之前的最后AlertDialog
。
我在启动Intent.FLAG_ACTIVITY_NO_HISTORY
时尝试使用bitmasking AlarmAlertDialogActivity
作为附加标记,但这似乎没有区别。
Bitmasking Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
有效,但只能从最近的历史记录中移除应用程序(顾名思义)。这对用户体验不利。
那么,是否有可能获得我正在寻找的UI流程?
更新 - 按要求提供更多信息:
来自广播接收器的Logcat,AlertDialog活动和我的主要活动:
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()
从BroadcastReceiver启动活动的代码:
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>
答案 0 :(得分:7)
我在另一个项目中做了类似的事情。我有一个BroadcastReceiver,它获取有关数据连接和SIM-Profile更改的信息,并显示一个对话框(使用像你这样的活动)警告用户他可能会收取费用。我最终做的是以下几点:
在清单中,在AlarmAlertDialogActivity的<Activity>
标记中添加以下内容:
android:excludeFromRecents="true"
android:noHistory="true"
android:taskAffinity=""
说明:将excludeFromRecents
和noHistory
设置为“true”,确保活动不会显示在最近的应用列表中,也会在用户导航后显示远离它,他将无法回到那里(这可能是你想要的)。将taskAffinity
设置为空字符串可确保AlarmAlertDialogActivity将在其自己的任务中运行,即使您的应用程序在显示对话框时正在运行。
只要您有另一个活动作为您的应用程序的主要活动(即:使用action.MAIN
和category.LAUNCHER
的意图过滤器),这应该可以解决您的问题。