如何在活动和小部件之间共享数据?
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