哪个Android Intent标志使用

时间:2012-05-28 20:40:54

标签: android android-intent android-activity

我有一个应用程序从AlarmManager接收广播。在此之后,它会启动一个透明的ActivityAlarmAlertDialogActivity),然后显示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>

1 个答案:

答案 0 :(得分:7)

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

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

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

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

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