OnUpdate从未被调用 - Android小部件

6
我一直在关注各种小部件教程,例如这个这个
我试着将它们的代码调整到我的目的上,并尝试直接复制粘贴。但无论我做什么,我的小部件都不会被更新。当它被放置在主屏幕上时,文本保持为创建时的静态文本。我只需要这个应用程序更新包含在布局中的 4 个 TextView。
下面的代码大多数是从教程中复制的,我已经尝试过调试 onUpdate 方法,但断点似乎从未被触发过。
非常感谢您的任何帮助。
编辑:我恢复了一个我之前尝试过的更简单版本的小部件,并用简单小部件的代码替换了下面的代码。 我对清单进行了CommonsWare建议的更改。 不幸的是,问题仍然存在。
我的主要.java文件如下:
public class NetStatWidget extends AppWidgetProvider 
{

public void onUpdate(Context context, AppWidgetManager manager, int[] appWidgetIds)
{   
    ComponentName thisWidget = new ComponentName(context, NetStatWidget.class);
    int[] widgetId = manager.getAppWidgetIds(thisWidget);

    RemoteViews remoteView = new RemoteViews(context.getPackageName(), R.layout.appwidget);
    remoteView.setTextViewText(R.id.textView0, "Hello");
    manager.updateAppWidget(widgetId, remoteView);
}

}

我的宣言:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="net.stat"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="10" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >


            <receiver android:name="NetStatWidget" >
                <intent-filter>
                    <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
                </intent-filter>
                <meta-data 
                    android:name="android.appwidget.provider"
                    android:resource="@xml/providerinfo" />
            </receiver>

    </application>

</manifest>

我的小部件提供程序信息:

<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:initialLayout="@layout/main"
android:minWidth="146dip"
    android:minHeight="72dip"
    android:updatePeriodMillis="10000">

1个回答

7
你的清单文件有误。你声称拥有一个network.widget.AppWidgetProvider类,但据我所知,你并没有。你有一个名字奇怪的network.widget.NetworkWidgetActivity类。你需要在<receiver>元素中使用那个
另外:
  • this替换this.getApplicationContext()getApplicationContext()

  • 除非你计划在服务中进行更严重的工作(数据库I/O、网络I/O等),否则考虑将所有逻辑移入onUpdate()并摆脱服务,因为它在这里真的没什么用(如果你要保留服务,请切换到IntentService并摆脱stopSelf(),因为这已经为您处理了)

  • 虽然你要求10秒更新一次,但最小有效的updatePeriodMillis是30分钟——在调试时请记住这一点

  • int[] widgetId似乎在NetworkWidgetActivity中没有被使用

  • Service中的onStart()已经被弃用了几年;请改用onStartCommand()


我按照你的建议更改了我的清单,但仍然遇到同样的问题...我回退到我最初尝试的一个更简单的小部件,做出了相同的更改,但它仍然存在同样的问题。我编辑了上面的代码以反映更简单的代码。你看到了同样的问题吗? - Jodron
@Jodron:不,你那里的代码应该可以在 Android 3.0 及以下版本上运行。但是在 Android 3.1 及以上版本中,你需要一个活动与你的应用小部件配合使用,否则你的应用小部件将无法接收广播,直到用户运行该活动。此目录包含另外两个应用小部件示例,它们都可以正常工作:https://github.com/commonsguy/cw-advandroid/tree/master/AppWidget - CommonsWare
这很奇怪。我在2.3上运行它,但仍然无法更新文本。我是否错误地认为一旦小部件放置,“textView0”应该读取“Hello”? 感谢您的示例,我会浏览一下并看看是否能够解决问题。我想我可能有点难度,应该只制作一个常规应用程序。 - Jodron
2
@Jodron:“我是否错误地认为一旦小部件被放置,“textView0”应该读取“Hello”?”——嗯,在一秒左右,假设在res/layout/appwidget.xml中有一个名为@+id/textView0TextView。虽然你列出的代码不会编译,因为没有widgetId。考虑暂时切换到采用ComponentNameupdateAppWidget()版本,这样你就不会迷失在应用程序小部件ID中了。 - CommonsWare
将updateAppWidget更改为使用组件名称即可解决问题!非常感谢您帮助我走出无知的迷雾。现在,我要再花5个小时自学如何用网络信息填充这些textViews。再次感谢您的帮助。 - Jodron

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接