我的应用包含两个活动,一个小部件和一个广播接收器。
第一个活动是默认的活动,由家庭启动器调用。第二个活动是提醒对话框活动,它播放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();
}
我发现更烦人的东西。如果主要活动未关闭,来自广播接收器的每次呼叫都会再次打开活动,即使它已经打开。虽然主要活动已关闭,但后续通话不会做任何事情。
答案 0 :(得分:2)
您的问题是 taskAffinity 。当您启动ActivityReminder
时,Android会尝试找到适当的任务来启动它。如果您的应用程序没有运行,它将找不到合适的任务,因此它将启动一个新任务,并且Activity将自动显示在任务中。但是,如果您的应用已在后台运行,Android会将现有任务置于前台并启动ActivityReminder
进入该任务。
要解决此问题,请将以下内容添加到<activity>
的{{1}}定义中:
ActivityReminder
这告诉Android它不应该寻找“匹配”任务来启动android:taskAffinity=""
。