意图标志 - 如何启动新活动实例并关闭其他实例

urS*_*Sus 7 flags android android-intent

我对意图标志并不熟悉,所以请耐心等待.

我正在做一个应用程序,它在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);
    }

}
Run Code Online (Sandbox Code Playgroud)

Dav*_*ser 9

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

另一种替代方法是,如果活动已经位于堆栈顶部,则重用相同的活动实例.在这种情况下,你需要设置 Intent.FLAG_ACTIVITY_CLEAR_TOPIntent.FLAG_ACTIVITY_SINGLE_TOP.如果您这样做,Android将不会创建活动的另一个实例,但会调用onNewIntent()您的活动来提供新的Intent.