从广播接收器启动活动会调出默认活动

时间:2012-12-29 14:12:39

标签: android android-activity taskaffinity

我的应用包含两个活动,一个小部件和一个广播接收器。

第一个活动是默认的活动,由家庭启动器调用。第二个活动是提醒对话框活动,它播放MP3并具有关闭按钮。它将出现在主屏幕上。

我的小部件是一个自定义时钟,它设置一个闹钟,每分钟呼叫一个广播接收器,负责更新时钟。在特定时间有一些提醒,广播接收者呼叫提醒活动。

我的应用程序现在完全正常工作,但是有一个小问题:当应用程序在后台打开时(它不在屏幕上),当广播接收器启动提醒活动时,默认活动首先显示,提醒活动显示在那。但是当我关闭应用程序时,主屏幕上会出现提醒活动,没有问题。

这是我用来从接收器启动活动的代码:

context.startActivity(new Intent(context, ActivityReminder.class).setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP));

这是android清单:

    <activity android:name=".MyActivity"
        android:theme="@android:style/Theme.Black.NoTitleBar"
        android:label="@string/app_name"
        android:screenOrientation="portrait" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN"/>
            <category android:name="android.intent.category.LAUNCHER"/>
        </intent-filter>
    </activity>

    <activity android:name=".ActivityReminder" android:label="@string/reminder" android:screenOrientation="portrait" android:theme="@style/Theme.CustomDialog"  />

    <receiver android:name=".widget"
        android:label="@string/app_name">
        <intent-filter>
            <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
        </intent-filter>
        <meta-data android:name="android.appwidget.provider"
            android:resource="@xml/widget" />
    </receiver>

    <receiver android:name=".UpdaterReceiver" />

现在我在默认活动中使用此解决方法来解决问题,它就像关闭应用程序一样:

@Override
protected void onPause()
{
    super.onPause();
    finish();
}

我发现更烦人的东西。如果主要活动未关闭,来自广播接收器的每次呼叫都会再次打开活动,即使它已经打开。虽然主要活动已关闭,但后续通话不会做任何事情。

1 个答案:

答案 0 :(得分:2)

您的问题是 taskAffinity 。当您启动ActivityReminder时,Android会尝试找到适当的任务来启动它。如果您的应用程序没有运行,它将找不到合适的任务,因此它将启动一个新任务,并且Activity将自动显示在任务中。但是,如果您的应用已在后台运行,Android会将现有任务置于前台并启动ActivityReminder进入该任务。

要解决此问题,请将以下内容添加到<activity>的{​​{1}}定义中:

ActivityReminder

这告诉Android它不应该寻找“匹配”任务来启动android:taskAffinity=""