3

我正在为我的应用程序开发一个小部件,我想将特定数据从小部件传递到应用程序。用户可以添加多个版本的小部件,我需要检测它来自哪个小部件,以便我可以在应用程序中显示特定信息。

到目前为止我所做的工作,但前提是我完全退出我的应用程序(反复按下后退按钮),否则它似乎没有检测到正在传递的数据。

这是我必须将数据从小部件传递到应用程序的代码:

public class WidgetProvider extends AppWidgetProvider  {

    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {

        final int N = appWidgetIds.length;

        for (int i=0; i<N; i++) 
            UpdateWidget(context, appWidgetManager, appWidgetIds[i]);
    }

    public static void UpdateWidget(Context context, AppWidgetManager appWidgetManager, int appWidgetId)
    {
        Intent intent = new Intent(context, Main.class);
        final Bundle bun = new Bundle();
        bun.putInt("widgetId", appWidgetId);
        intent.setData(Uri.parse(intent.toUri(Intent.URI_INTENT_SCHEME)));
        intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
        intent.putExtras(bun);

        PendingIntent pendingIntent = PendingIntent.getActivity(context, appWidgetId, intent, PendingIntent.FLAG_UPDATE_CURRENT);

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

        appWidgetManager.updateAppWidget(appWidgetId, views);
    }
}

更新

多亏了 Tal Kanel,让这项工作接近完成。我ActionBar在我的应用程序中有一个并遵循 Google 的指南,我在以下代码中有此代码onOptionsItemSelected

if (item.getItemId() == android.R.id.home) {
          final Intent intent = new Intent(activity, Main.class);
          intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
          startActivity(intent);
          return true;
    } 

如果我单击 中的“后退”按钮ActionBar,则最小化我的应用程序并单击小部件,此代码始终为空:

    if (getIntent().getExtras() != null)
    {

    }

更新 2

实际上,只是回到我的应用程序中的主要活动会导致getExtras()为空。我的应用程序小部件中有此代码,它不会向应用程序传递任何额外内容:

    PendingIntent piMain = PendingIntent.getActivity(context, appWidgetId, new Intent(context, Main.class), PendingIntent.FLAG_UPDATE_CURRENT);

    rv.setOnClickPendingIntent(R.id.widgetTitle, piMain);

如果我在我的小部件中单击该部分,然后返回并单击我的小部件中应该传递附加功能的部分,getExtras()则始终为空。

4

1 回答 1

10

首先 - 当您按下返回直到返回主屏幕时,您的应用程序并没有真正关闭。只是在此阶段不存在您的应用程序中的任何活动。
我认为知道这一点非常重要,以防你不...

关于您的问题:
您正在尝试使用它定义的 FLAG_ACTIVITY_CLEAR_TOP 从小部件启动活动:

如果设置,并且正在启动的活动已经在当前任务中运行,那么不会启动该活动的新实例,而是关闭它上面的所有其他活动,并且此 Intent 将被传递到(现在顶部)作为新意图的旧活动。

这意味着如果您的 Main 活动已经在前台运行,那么当您从小部件启动活动时 - 此 Main 活动之上的所有其他活动都将从堆栈中删除,并且 Main 将恢复并进入Activity.onNewIntent(intent )回调。

这就是您看不到数据的原因 - 因为活动不会以新意图重新启动,而只会以您发送的新意图进入 onNewIntent(intent)。

我敢肯定,如果您在 onNewIntent(intent) 方法中设置一个断点 - 您会看到您发送的意图已传递到那里,以及所有额外的数据。

您的代码的另一个问题:检查 Intent.putExtras(boundle) 方法的定义:

向意图添加一组扩展数据。键必须包含包前缀,例如应用程序 com.android.contacts 将使用类似“com.android.contacts.ShowAll”的名称。

似乎您没有按照规则调用您的密钥前缀。这就是为什么它是空的。

希望它对你有所帮助。

于 2012-07-13T05:59:50.577 回答