下载数据后如何处理更新小部件然后打开活动

Posted

技术标签:

【中文标题】下载数据后如何处理更新小部件然后打开活动【英文标题】:How to handle updating a widget after downloading data then open an Activity 【发布时间】:2018-10-12 06:01:58 【问题描述】:

我试图实现的是,当用户单击小部件时,它应该将用户带到小部件上显示的特定任务的详细信息。我尝试使用以下代码,但单击小部件时没有任何反应。详细信息类(MasterList.class)需要从网络获取的数据。我如何做到这一点?

    我可以从小部件 onUpdate() 调用网络获取数据对象吗?这是一种不好的做法吗?

    为什么 logcat 没有变化也没有错误?为什么应用没有启动??

    我有没有犯错??

    在此处输入代码

    @Override 
     public void onUpdate(Context context,AppWidgetManager appWidgetManager,int[] appWidgetIds)
    
    super.onUpdate(context, appWidgetManager, appWidgetIds);
    Intent i = new Intent(context, CallNetwork.class);
    i.setAction(ACTION);
    context.startService(i); // starting service to get data from network
    
    
    Intent intent = new Intent(context, MasterListClass.class);
    while(CallNetwork.list.size()==0||CallNetwork.list.equals(null) //waiting for network call to complete
    
    
    
    if (CallNetwork.get(0).getName() != null) 
            this.list = CallNetwork.list;// getting data from network
        
    intent.putExtra(context.getString(R.string.object),list.get(0));
    PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, 
    intent, PendingIntent.FLAG_UPDATE_CURRENT);
    RemoteViews views = new RemoteViews(context.getPackageName(), 
     R.layout.recipe_widget);
    views.setOnClickPendingIntent(R.id.widget_layout, pendingIntent);
    appWidgetManager.updateAppWidget(appWidgetIds[0], views);
    

【问题讨论】:

我不建议在接收器中执行:“等待网络调用完成” 1. 它阻塞了主线程 2. 在紧密的循环中等待网络 IO 完成不是一个好方法练习。 数据准备就绪后,您可以从服务中触发小部件中的 onUpdate()。 【参考方案1】:

服务从网络下载数据后,此代码可用于在小部件中触发 onUpdate():

Intent intent = new Intent(this, MyAppWidgetProvider.class);
intent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
// Use an array and EXTRA_APPWIDGET_IDS instead of 
AppWidgetManager.EXTRA_APPWIDGET_ID,
// since it seems the onUpdate() is only fired on that:
int[] ids = AppWidgetManager.getInstance(getApplication())
.getAppWidgetI‌​ds(new ComponentName(getApplication(), 
MyAppWidgetProvider.class));
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, ids);
sendBroadcast(intent);

Programmatically update widget from activity/service/receiver

【讨论】:

以上是关于下载数据后如何处理更新小部件然后打开活动的主要内容,如果未能解决你的问题,请参考以下文章

如何处理小部件按钮

如何处理小部件的谷歌登录

如何处理自定义 android 视图/小部件的可见性更改

如何处理 Android 中远程视图的异常(自定义小部件或自定义通知)?

如何在从另一个小部件继承的小部件中设置数据?

在 Android 中更新多个应用小部件