Android:如何防止一个小部件启动多个活动实例?
重现问题的步骤:Android:如何防止一个小部件启动多个活动实例?,android,android-activity,android-intent,widget,Android,Android Activity,Android Intent,Widget,重现问题的步骤: 用户启动我的应用程序(根活动的名称:“mainActivity”)=>mainActivity的实例A 他按下home按钮(mainActivity在后台运行) 他安装了与此应用程序相关的小部件 他单击小部件=>将显示mainActivity的新实例(实例B) 他点击后退按钮:用户返回活动A(我不想要的是!活动B应该关闭(实际上,整个应用程序都应该关闭)) 你知道如何避免这个问题吗?(我在stackoverflow上看到过一些类似的问题,但并不完全是我想要的) 谢谢 守则:
- 用户启动我的应用程序(根活动的名称:“mainActivity”)=>mainActivity的实例A
- 他按下home按钮(mainActivity在后台运行)
- 他安装了与此应用程序相关的小部件
- 他单击小部件=>将显示mainActivity的新实例(实例B)
- 他点击后退按钮:用户返回活动A(我不想要的是!活动B应该关闭(实际上,整个应用程序都应该关闭))
public class MyWidgetProvider extends AppWidgetProvider {
public void onUpdate(Context context, AppWidgetManager appWidgetManager,
int[] appWidgetIds) {
// Build the intent to call the service//
RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_layout);
Intent openAppIntent = new Intent(context.getApplicationContext(), MainActivity.class);
openAppIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, appWidgetIds);
PendingIntent openAppPendingIntent = PendingIntent.getActivity(context, 0, openAppIntent, 0);
remoteViews.setOnClickPendingIntent(R.id.widgetLinearLayout, openAppPendingIntent);
//// ETC…///
}
尝试使用:
openAppIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
您还可以使用:
openAppIntent.setFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT);
.我建议使用:
openAppIntent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
这将重用现有的活动
,并将调用onNewIntent
。您可以根据需要从那里更新UI
有关更多参考信息,请查阅:
编辑启动器活动是在AndroidManifest.xml中具有以下意图过滤器的活动
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
如果您发现了什么,请告诉我们。我已通过将此属性添加到清单中成功阻止了一个活动的多个实例:
android:launchMode="singleInstance"
这本质上告诉Android这个活动是Highlander(“只能有一个”),并将阻止它创建多个实例。每当有问题的活动被打开时,Android要么将现有实例放在前面,要么在某些情况下销毁并重新创建当前实例。谢谢NeTeInStEiN和Craigy,但我仍然有同样的问题。。。另一个想法是,你需要在每次打开活动时设置标志,包括清单中的活动(包括从应用程序抽屉启动)。这是正确的答案,所以另一个想法对你没有帮助。嗨,库夫斯。我试图将openAppIntent.setFlags(Intent.FLAG\u ACTIVITY\u CLEAR\u TOP)和openAppIntent.setFlags(Intent.FLAG\u ACTIVITY\u-to\u FRONT)添加到我的onUpdate方法中,但它不起作用。问题的不同步骤中描述的问题仍然存在。我错在哪里?顺便问一下,“包括在舱单中”是什么意思?谢谢。他的意思是(我想)在清单中定义一个启动模式。谢谢Gyuri,但我还有同样的问题。。。另一个想法?你的MainActivity
是启动程序活动吗?MainActivity是应用程序从头启动时启动的活动;所以,是的,我想这就是你们所说的“启动器活动”。问题是,当从头启动应用程序时,会启动MainActivity的第一个实例,然后当我单击它时,小部件会启动第二个实例。我有两个实例叠加;当我点击后退按钮时,我从“widget mainActivity”返回到“launcher mainActivity”。有什么想法吗?非常感谢!!!!在我的答案框中查看我的回答。