7

我对意图标志不是很熟悉,所以请多多包涵。

我正在做一个应用程序,它在 ViewPager 中显示数据库中的内容。我还有一个小部件,它不时拉出一个随机行并显示它。现在,当我单击它时,我会进入一个显示相同内容的活动,现在我可以对其采取行动。

一切正常,但是当我已经运行了一个活动然后单击小部件时,它似乎创建了一个新实例,因为当我按下后退按钮时,我没有退出应用程序,而是被带到前一个实例或其他东西。

有没有办法启动一个新的活动实例,如果有一些以前的实例运行关闭它们,使用标志?

我玩过 CLEAR_TOP 之类的东西,但老实说我不知道​​我在做什么。

谢谢!

//编辑

Intent.FLAG_ACTIVITY_CLEAR_TOP 似乎没有做任何事情。Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP 似乎将前一个带到顶部而忽略了新的或其他东西。也许让我换个说法,我从启动器图标开始活动,然后按主页按钮并单击小部件,它应该会打开一个新实例,其中 ViewPager.setCurrentItem 设置正确的页面(与小部件中相同)。如果之前没有运行主要活动,一切都很好,但如果它正在运行,则完成它。

MyWidgetProvider extends AppWidgetProvider

@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
    Log.d("MainActivity", "MyWidgetProvider # onUpdate");

    for (int i = 0; i < appWidgetIds.length; i++) {
        int appWidgetId = appWidgetIds[i];

        Intent intent = new Intent(context, MainActivity.class);
        intent.putExtra("from_widget", true);
        //intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
        PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);

        RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget_layout);
        views.setOnClickPendingIntent(R.id.widget_container, pendingIntent);

        appWidgetManager.updateAppWidget(appWidgetId, views);
    }

}
4

3 回答 3

10

有几种方法可以做到这一点。如果要创建一个新实例并关闭当前实例(假设它位于活动堆栈的顶部),则需要设置Intent.FLAG_ACTIVITY_CLEAR_TOP.

另一种选择是重用相同的活动实例,如果它已经在堆栈的顶部。在这种情况下,您需要同时设置 Intent.FLAG_ACTIVITY_CLEAR_TOPIntent.FLAG_ACTIVITY_SINGLE_TOP。如果您这样做,Android 将不会创建该 Activity 的另一个实例,而是会调用onNewIntent()您的 Activity 以传递新的 Intent。

于 2012-12-17T10:24:19.007 回答
3

标记其他关闭,

Intent.FLAG_ACTIVITY_CLEAR_TOP

并标记新实例,

Intent.FLAG_ACTIVITY_NEW_TASK
于 2012-12-17T10:30:44.777 回答
0

我的要求是使用新实例启动活动(AbcActivity)并关闭相同活动(AbcActivity)的任何其他实例(如果有),并关闭顶部的其他活动(如果有)。对我有用的解决方案是:

startActivity(new Intent(MainActivity.this,AbcActivity.class)
            .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK));
于 2016-08-10T05:52:44.020 回答