如何在App Widget上的每个项目列表中启动新活动

时间:2014-09-19 18:05:15

标签: android android-appwidget appwidgetprovider

我有一个包含ListView布局的App Widget。当我点击项目列表时,活动已打开,但如果我按下主页按钮并单击其他项目列表,则后台活动将再次打开。我希望每个项目列表打开一个新的活动,并关闭其他活动(如果已存在)。

WidgetProvider.class

        RemoteViews remoteViews = new RemoteViews(context.getPackageName(),
                R.layout.widgetnews);

        remoteViews.setImageViewBitmap(R.id.widgetTitle, buildUpdate("TITLE"));

        // Intent to item List
        Intent intentActivity;
        if(context.getResources().getBoolean(R.bool.tablet_full))
            intentActivity = new Intent(context, MainTabletFull.class); 
        else
            intentActivity = new Intent(context, MainSmartphone.class);
        intentActivity.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, widgetId);
        intentActivity.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
        intentActivity.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        intentActivity.setData(Uri.parse(intentActivity.toUri(Intent.URI_INTENT_SCHEME)));
        intentActivity.addCategory(Intent.CATEGORY_HOME);

        PendingIntent pendingIntent = PendingIntent.getActivity(context, 1, intentActivity, 0);
        remoteViews.setOnClickPendingIntent(R.id.widgetlogo, pendingIntent);
        remoteViews.setPendingIntentTemplate(R.id.widgetlist, pendingIntent);


        // Intent to Widget Logo
        Intent intent = new Intent(context, WidgetService.class);
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        intent.addCategory(Intent.CATEGORY_HOME);
        intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, widgetId);
        intent.setData(Uri.parse(intent.toUri(Intent.URI_INTENT_SCHEME)));
        remoteViews.setRemoteAdapter(R.id.widgetlist, intent);

        appWidgetManager.updateAppWidget(widgetId, remoteViews);

WidgetRemoteViewsFactory

@Override
public RemoteViews getViewAt(int position)
{
    RemoteViews remoteView = new RemoteViews(context.getPackageName(), R.layout.widget_noticias_row);

    remoteView.setTextViewText(R.id.wnr_date, "DATE");
    remoteView.setTextViewText(R.id.wnr_title, "TITLE");

    if(artigo.getId()!=null)
    {
        Intent intentActivity = new Intent();
        intentActivity.putExtra("ID_NOTIF", "ID");
        intentActivity.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        remoteView.setOnClickFillInIntent(R.id.wnr_layout, intentActivity);
    }

    return remoteView;
}

2 个答案:

答案 0 :(得分:1)

也许你正在寻找......

intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); // or intent.setFlags

android:noHistory="true"

"当用户离开活动时,是否应该从活动堆栈中移除活动并完成活动(调用其finish()方法)并且它不再在屏幕上显示" - > http://developer.android.com/guide/topics/manifest/activity-element.html#nohist

或者可能在活动结束时直接调用finish()。

另见: Clear the entire history stack and start a new activity on Android

Android: Remove all the previous activities from the back stack

http://www.slideshare.net/RanNachmany/manipulating-android-tasks-and-back-stack

我也无法看到你所做的一切,但是你以某种方式开始新的任务,所以FLAG_ACTIVITY_CLEAR_TASK& FLAG_ACTIVITY_NEW_TASK可能是也可能没有意义。后端堆栈上可能有多个任务无法清除。因此,您可能需要查看从清单中启动所有活动的方式以及代码中的所有意图。

如果您正在谈论重新开放相同的活动并刷新它,也可以使用上述内容和

intent = getIntent();
finish();
startActivity(intent);

Android refresh current activity

答案 1 :(得分:1)

我认为你使这比你需要的更复杂。只需删除以下所有内容:

    intentActivity.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
    intentActivity.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    intentActivity.setData(Uri.parse(intentActivity.toUri(Intent.URI_INTENT_SCHEME)));
    intentActivity.addCategory(Intent.CATEGORY_HOME);