2012-03-16 69 views
6

我一直在关注各种小部件教程如this onethis one的OnUpdate从来不叫 - Android小工具

我试图适应他们的代码,以我的目的,我曾尝试直线上升的复制粘贴。 看来不管我做什么,我的小部件都不会更新。当它被放置在主屏幕上时,文本保持为其创建的静态文本。 我需要这个应用程序做的是更新4将包含在布局中的TextViews。

下面的代码大部分都是从一个教程中复制的。我试着调试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"> 

回答

7

你的清单是错误。你声称你有一个network.widget.AppWidgetProvider班,而AFAIK,你没有。你有一个奇怪的network.widget.NetworkWidgetActivity类。您需要在<receiver>元素中使用

另外:

  • 更换this.getApplicationContext()getApplicationContext()this

  • 除非你打算在服务做得更严肃的工作(数据库I/O,网络I/O等)考虑只是把所有的逻辑移动到onUpdate()并摆脱服务,因为它不是真的在这里买你很多(如果你去保持服务,切换到IntentService并摆脱stopSelf()因为这是为您处理)

  • 虽然你所要求的10秒更新,最小有效updatePeriodMillis为30分钟 - 只要记住这一点,当你在调试

  • int[] widgetId似乎是未使用在NetworkWidgetActivity

  • onStart() in Service已被弃用一两年;使用onStartCommand()而不是

+0

我改变我的清单,根据您的建议,我仍然有同样的问题...我回到了我刚开始努力时尝试的一个更简单的小部件,做出了同样的改变,它也遇到了同样的问题。我编辑上面的代码反映了更简单的代码。你看到同样的问题吗? – Jodron 2012-03-16 22:16:34

+0

@Jodron:不,你在那里应该在Android 3.0及更低版本上工作。 Android 3.1及以上版本,你需要一个活动去与你的应用程序小部件 - 你的应用程序小部件将不会收到广播,直到用户运行该活动。该目录包含另外两个应用程序小部件示例,这两个示例都适用:https://github.com/commonsguy/cw-advandroid/tree/master/AppWidget – CommonsWare 2012-03-16 22:19:45

+0

这很奇怪。我在2.3上运行它,它仍然不会更新文本。我错误地认为,一旦小部件被放置“textView0”应该读“你好”? 感谢这些例子,我仔细看看那些,看看我是否搞不清楚。我想我可能会在我的脑海中,应该只是一个普通的应用程序。 – Jodron 2012-03-16 22:30:29