我想为我的应用提供一个小部件,当用户点击按钮时,将使用RemoteViewsService
中的数据打开该应用。有可能得到它吗?要设置列表,我们需要RemoteViews#setRemoteAdapter
。有没有RemoteViews#getRemoteAdapter
?
public class WidgetProvider extends AppWidgetProvider {
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
for (int appWidgetId : appWidgetIds) {
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget_layout);
Intent itemIntent = new Intent(context, WidgetItemService.class);
views.setRemoteAdapter(R.id.item_list, itemIntent);
views.setEmptyView(R.id.item_list, R.id.empty);
Intent buttonIntent = new Intent(context, ActivityA.class);
//TODO: Something like this
buttonIntent.putExtra(EXTRA_DATA, views.getRemoteAdapter().getData());
PendingIntent buttonPendingIntent = PendingIntent.getActivity(context, 0, buttonIntent, PendingIntent.FLAG_UPDATE_CURRENT);
views.setOnClickPendingIntent(R.id.button, buttonPendingIntent);
}
}
}
答案 0 :(得分:0)
即使有像 getRemoteAdapter()这样的方法,我也不愿意采用另一种方式将数据传递给Activity
的{{1}}。主要原因是安全性:
您使用AppWidgetProvider
Intent
额外传递的所有内容都不属于您的应用。
startActivity()
会在引擎盖下调用PendingIntent.getActivity()
,所以这基本上是同样的问题。
但是当startActivity()
从RemoteViewsService
延伸时,您只需启动Service
,Activity
就可以向Activity
询问您想要的数据显示。 Service
和Activity
之间有多种通信方式(例如,通过Service
发送本地广播) - 这是您的选择(尽管使用绑定LocalBroadcastManager
可能是一个好方法想法,因为这种类型似乎是未来Android版本的首选)