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应该关闭(实际上,整个应用程序都应该关闭))
你知道如何避免这个问题吗?(我在stackoverflow上看到过一些类似的问题,但并不完全是我想要的)

谢谢

守则:

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”。有什么想法吗?非常感谢!!!!在我的答案框中查看我的回答。