是否可以从AppWidgetProvider从RemoteViewsService获取数据?

时间:2017-07-23 08:18:34

标签: android android-widget

我想为我的应用提供一个小部件,当用户点击按钮时,将使用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);
        }
    }
}

1 个答案:

答案 0 :(得分:0)

即使有像 getRemoteAdapter()这样的方法,我也不愿意采用另一种方式将数据传递给Activity的{​​{1}}。主要原因是安全性:

您使用AppWidgetProvider Intent额外传递的所有内容都不属于您的应用。

startActivity()会在引擎盖下调用PendingIntent.getActivity(),所以这基本上是同样的问题。

但是当startActivity()RemoteViewsService延伸时,您只需启动ServiceActivity就可以向Activity询问您想要的数据显示。 ServiceActivity之间有多种通信方式(例如,通过Service发送本地广播) - 这是您的选择(尽管使用绑定LocalBroadcastManager可能是一个好方法想法,因为这种类型似乎是未来Android版本的首选)