【问题标题】:How to call onUpdate function of widget from network listener service如何从网络监听服务调用小部件的 onUpdate 函数
【发布时间】:2013-12-16 06:21:45
【问题描述】:

我正在使用 vogella 教程为我的应用程序构建一个小部件。我有一个疑问。 每当用户第一次打开我的小部件时,我的代码将调用一个异步,它将从网络检索数据,并在 postExecute 中将更新数据显示到小部件中{这工作正常} 在每个指定的更新间隔之后,自动调用 OnUpdate 并再次调用异步并显示新数据。如果在更新时没有可用的互联网,它将使用以前的数据并且小部件在这种情况下也是一致的。

但如果在小部件启动时没有互联网连接[即当第一次调用小部件时],那么在下一个更新间隔之前,该会话不会显示任何数据 [在此小部件中为 30 分钟]

我添加了一个网络监听器,它工作正常。 但我无法从网络监听器的 onReceive() 调用 onUpdate 函数。 如何强制调用小部件的 onUpdate 函数,静态引用在这个 cade 中不起作用。 请帮忙! {对于这么大的文字问题感到抱歉}

>网络监听类代码更新

public class NetworkListener extends BroadcastReceiver {

public void onReceive(Context context, Intent intent) {
    ConnectivityManager connectivityManager = (ConnectivityManager) context
            .getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo activeNetInfo = connectivityManager.getActiveNetworkInfo();
    NetworkInfo mobNetInfo = connectivityManager
            .getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
    if (activeNetInfo != null || mobNetInfo != null) {
        if (!getUpdateComplete(context)) {
            Log.d("NetworkListener", "IsInterruptedDueToNetwork=true");
            RemoteViews remoteViews = new RemoteViews(
                    context.getPackageName(), R.layout.widget_layout);
            ComponentName watchWidget = new ComponentName(context,
                    MyWidgetProvider.class);
            (AppWidgetManager.getInstance(context)).updateAppWidget(
                    watchWidget, remoteViews);
        }

    } else {
        Toast.makeText(context, "Network Not Available", Toast.LENGTH_SHORT)
                .show();
    }
}

public boolean getUpdateComplete(Context mContext) {
    Log.d("getUpdateComplete", "getUpdateComplete");
    SharedPreferences myPref = mContext.getSharedPreferences("Widget",
            Context.MODE_PRIVATE);
    return myPref.getBoolean("IsUpdateComplete", false);
}

}

但上面的代码仍然没有调用 onUpdate 方法。 我的代码哪里错了!

【问题讨论】:

  • 你的广播正常吗
  • 你怎么叫这个广播
  • 我已经在 Manifest 中设置了。每当网络状态发生变化时,它都应该被调用! {它工作正常},但 updataeAppWidget 永远不会被调用
  • 在 OnRecieve 中更新你的小部件的逻辑在哪里......你不明白我在说什么
  • 不,代码在 AppWidgetProvider 的 onUpdate 里面。我在这个方法中调用了另一个异步!

标签: android android-widget


【解决方案1】:

您需要在可以随时调用的小部件类的 onReceive 中实现更新小部件的逻辑。

@Override
public void onReceive(Context context, Intent intent) {
    super.onReceive(context, intent);
    remoteViews = new RemoteViews(context.getPackageName(),
            R.layout.touchwidget);
    watchWidget = new ComponentName(context,
            widget.class);

            if (intent.getAction().equals(UPDATE_WIDGET)) {//user defined action
                //update widget
            }

    (AppWidgetManager.getInstance(context)).updateAppWidget(watchWidget, remoteViews);//it is responsible to update ur widget
}

【讨论】:

  • 太棒了!我会试试这个。
  • 它不工作。仍然没有调用我的 onUpdate 方法。我已经用代码更新了我的问题。请帮忙!!
  • 它不会调用你的 onUpdate ..你需要在 OnReceive 方法中写入你想要的更新
【解决方案2】:

如果你了解 OOP 的概念,那么你就不能直接调用任何受保护的方法。它只能派生,但不能在任何你想要的地方直接调用它。

所以在您的情况下,onUpdate() 方法是根据您为小部件 xml 文件定义的时间间隔调用的。最小间隔时间为 30 分钟(30*60*100 毫秒)。

你可以参考Android Developer Widget Tutorial这里...

希望对你有所帮助..

【讨论】:

  • 感谢回复;是的,我知道我的小部件肯定会在每 30 分钟后更新一次。但我希望只要有可用的网络连接且没有可用的先前数据,就强制更新它{如果启用小部件时第一次无法使用互联网,则会发生这种情况}。我想知道有没有办法做到这一点。
  • 然后您需要将间隔时间设置为零并使用远程视图手动更新视图...您可以在我提供的链接上参考有关远程视图的更多信息..
  • 请带我到任何使用它的来源,或任何我可以学习如何使用它的链接。
  • 参考我在帖子中给你的链接......它声明可以从你的应用程序的任何地方更新小部件。
猜你喜欢
  • 2017-06-27
  • 2019-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-23
  • 2021-10-07
  • 1970-01-01
相关资源
最近更新 更多