如何在活动和小部件之间共享数据?

Posted

技术标签:

【中文标题】如何在活动和小部件之间共享数据?【英文标题】:How to share data between activity and widget? 【发布时间】:2011-08-20 07:56:41 【问题描述】:

我阅读了 hellowidget 教程和开发指南的 App Widgets。然后我知道如何创建一个包含按钮或文本或其他内容的小部件。

但我真正想做的是让它与我的应用交互。例如,我想创建一个具有文本视图的小部件,当我单击它时,它会向我的活动发送一个 PendingIntent,我可以在其中编辑文本。

我可以执行“发送 PendingIntent”步骤。但是我在活动中编辑文本后,小部件如何读取它?

【问题讨论】:

【参考方案1】:

您需要做的是在您的 AppWidgetProvider 中注册一个自定义意图,例如 ACTION_TEXT_CHANGED,例如:

public static final String ACTION_TEXT_CHANGED = "yourpackage.TEXT_CHANGED";

在此之后,您需要在您的 androidManifest.xml 中注册您希望在接收者标签的意图过滤器部分接收此意图,如下所示:

<receiver android:name=".DrinkWaterAppWidgetProvider">
    <intent-filter>
        <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
        <action android:name="yourpackage.TEXT_CHANGED" />                
    </intent-filter>
    <meta-data android:name="android.appwidget.provider"
        android:resource="@xml/appwidget_info" />
</receiver>

然后你必须在你的 AppWidgetProvider 中扩展 onReceive 方法,并确保你处理你的意图是这样的:

@Override
public void onReceive(Context context, Intent intent) 
    super.onReceive(context, intent);
    if (intent.getAction().equals(ACTION_TEXT_CHANGED)) 
        // handle intent here
        String s = intent.getStringExtra("NewString");
    

以上所有设置完成后,您只需要在文本更改后在活动中广播意图,如下所示:

Intent intent = new Intent(YourAppWidgetProvider.ACTION_TEXT_CHANGED);
intent.putExtra("NewString", textView.getText().toString());
getApplicationContext().sendBroadcast(intent);

应将“NewString”更改为您为字符串提供的名称。

希望对你有帮助。

【讨论】:

你能帮我吗?我在将数据从小部件传递到我的活动时遇到问题:***.com/questions/39587137/… 谢谢。【参考方案2】:

您必须使用 RemoteViews 类来执行此操作。在 AppWidgetProvider 的 onRefresh 方法中创建 RemoteViews 类的实例并使用其中的方法...

RemoteViews views = RemoteViews(packageName, layoutId);
views.setOnClickPendingIntent(viewId, pendingIntent);

请注意,与标准应用程序视图相比,RemoteViews 的功能有限。但是,你可以用他们提供的东西来实现你想做的事情。

【讨论】:

我可以执行“发送 PendingIntent”步骤。你回答的是这一步。 糟糕...然后,您必须从您的活动中广播另一个意图,您的小部件可以收听该意图。拥有 Intent 中的数据,小部件可以使用这些数据进行自我刷新。

以上是关于如何在活动和小部件之间共享数据?的主要内容,如果未能解决你的问题,请参考以下文章

如何创建一个共享目录以在集成测试和小部件测试之间共享代码?

在 iOS 14 中的主应用程序和小部件之间共享 UserDefaults

活动/服务和小部件提供者之间的通信?

在主机应用程序和今天的扩展程序之间共享用户生成的图像的最佳方式是啥

iOS 8 小部件,在应用程序组之间向前和向后共享数据

如何在两个活动之间共享一个视图?