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

时间:2011-05-06 16:22:16

标签: android android-widget widget

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

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

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

2 个答案:

答案 0 :(得分:10)

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

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

在此之后,你需要在你的AndroidManifest.xml中注册你想要在接收者标签的intent-filter部分接收这个意图,如下所示:

<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”应更改为您给出字符串的名称。

我希望它有所帮助。

答案 1 :(得分:1)

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

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

请注意,与标准应用视图相比,RemoteView的功能有限。但是,您可以通过他们提供的功能实现您想要做的事情。