4

我有一个应用程序接收来自AlarmManager. 在此之后,它会启动一个透明的Activity( AlarmAlertDialogActivity),然后显示一个AlertDialog. AlertDialog在调用结果上单击取消finish()

由于AlarmAlertDialogActivity不是从另一个发射Activity器而是从广播接收器发射的,因此它是用发射的

Intent.FLAG_ACTIVITY_NEW_TASK

这意味着 Activity 将在新任务中启动。

我的问题是,当应用程序在取消AlertDialog(即按住主页按钮并单击应用程序的图标)后从最近的历史记录中重新启动时,AlertDialog 会重新启动。我曾希望通过使用finish()/Intent标志能够避免这种情况;我想要发生的是要启动的父 ActivityActivity之前的最后一个。AlertDialog

Intent.FLAG_ACTIVITY_NO_HISTORY在启动时尝试将位掩码作为附加标志,AlarmAlertDialogActivity但这似乎没有什么区别。

位掩码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 启动 Activity 的代码:

        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);

清单文件中的 AlarmAlertDialogActivity:

    <activity
        android:name=".AlarmAlertDialogActivity"
        android:theme="@android:style/Theme.NoDisplay" >
    </activity>
4

1 回答 1

7

我在另一个项目中做了类似的事情。我有一个 BroadcastReceiver,它获取有关数据连接和 SIM 配置文件更改的信息,并显示一个对话框(使用像你这样的活动)警告用户他可能会产生费用。我最终做的是以下内容:

在清单中的<Activity>AlarmAlertDialogActivity 标记中,添加以下内容:

android:excludeFromRecents="true"
android:noHistory="true"
android:taskAffinity=""

说明:设置excludeFromRecentsnoHistory“真”确保活动不会出现在最近的应用程序列表中,并且一旦用户离开它,他将无法回到那里(这可能是你想要的)。设置taskAffinity为空字符串可确保 AlarmAlertDialogActivity 将在它自己的任务中运行,即使您的应用程序在显示对话框时正在运行。

只要您有另一个活动作为应用程序的主要活动(即:使用意图过滤器action.MAINcategory.LAUNCHER),这应该可以解决您的问题。

于 2012-05-30T14:16:57.407 回答