2

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

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

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

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

这是我用来从接收器 startActivity 的代码:

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

我发现了更烦人的事情。如果主要活动未关闭,则广播接收器的每个调用都会再次打开活动,即使它已经打开。虽然如果主要活动关闭,后续调用将不会做任何事情。

4

1 回答 1

3

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

要解决此问题,请将以下内容添加到 的<activity>定义中ActivityReminder

android:taskAffinity=""

这告诉 Android 它不应该寻找“匹配”的任务来启动ActivityReminder

于 2015-03-04T19:37:55.963 回答