将数据从小部件传递到应用程序

时间:2012-07-07 17:05:50

标签: android android-widget android-pendingintent

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

到目前为止我的工作是什么,但只有当我完全退出我的应用程序时(反复按下后退按钮),否则它似乎没有检测到传入的数据。

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

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()始终为空。

1 个答案:

答案 0 :(得分:10)

首先 - 当您按下直到返回主屏幕时,您的应用程序并未真正关闭。只是在这个阶段没有来自你的应用程序的任何活动 我认为,如果你不这样做,那就非常重要了......

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

  

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

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

这就是你没有看到数据的原因 - 因为活动没有使用新意图重新启动,而是只使用你发送的新意图进入onNewIntent(intent)。

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

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

  

向intent添加一组扩展数据。键必须包含包前缀,例如app com.android.contacts将使用“com.android.contacts.ShowAll”这样的名称。

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

希望它对你有所帮助。