2012-04-15 76 views
0

我想製作一個Android電池小部件。問題是有時會更新,但有時並不會。Android電池小部件更新有時

我必須重新啓動手機以使其再次工作 - 或者將其從屏幕上刪除並再次在屏幕上創建。

我的問題是什麼?

這是我的代碼..這是我唯一的班級。

public class BatteryWidgetProvider extends AppWidgetProvider 
{ 
    private RemoteViews views; 
    @Override 
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, 
      int[] appWidgetIds) 
    { 

    context.getApplicationContext().registerReceiver(this, new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); 
    ComponentName name = new ComponentName(context, BatteryWidgetProvider.class); 
    appWidgetManager.updateAppWidget(name, this.views); 
    super.onUpdate(context, appWidgetManager, appWidgetIds); 
} 

@Override 
public void onReceive(Context context, Intent intent) 
{ 
    String action = intent.getAction(); 
    if(action.equals(intent.ACTION_BATTERY_CHANGED)) 
    { 
     Integer level = intent.getIntExtra("level", -1); 

     this.views.setTextViewText(R.id.batter_level, level.toString() + "%"); 
     ComponentName name = new ComponentName(context, BatteryWidgetProvider.class); 
     AppWidgetManager.getInstance(context).updateAppWidget(name, this.views); 
    } 
    super.onReceive(context, intent); 
} 

我的清單文件看起來像這樣..

<application 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" > 
    <receiver android:name=".BatteryWidgetProvider"> 
     <intent-filter > 
      <action android:name="android.appwidget.action.APPWIDGET_UPDATE"/> 
     </intent-filter> 
     <meta-data 
      android:name="android.appwidget.provider" 
      android:resource="@xml/appwidget_info"/> 
    </receiver> 
</application> 

這是我的信息文件...

<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" 
    android:minHeight="72dp" 
    android:minWidth="144dp" 
    android:updatePeriodMillis="0" > 
</appwidget-provider> 

錯誤....

java.lang.RuntimeException: Error receiving broadcast Intent { act=android.intent.action.BATTERY_CHANGED flg=0x60000000 (has extras) } in [email protected] 
at android.app.ActivityThread$PackageInfo$ReceiverDispatcher$Args.run(ActivityThread.java:906) 
at android.os.Handler.handleCallback(Handler.java:587) 
at android.os.Handler.dispatchMessage(Handler.java:92) 
at android.os.Looper.loop(Looper.java:123) 
at android.app.ActivityThread.main(ActivityThread.java:4633) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:521) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
at dalvik.system.NativeStart.main(Native Method) 
Caused by: java.lang.NullPointerException 
at com.batterywidget.BatteryWidgetProvider.onReceive(BatteryWidgetProvider.java:72) 
at android.app.ActivityThread$PackageInfo$ReceiverDispatcher$Args.run(ActivityThread.java:893) 
+0

有沒有人可以幫助我? – Mich 2012-04-16 04:29:21

+0

你有沒有試過在調試器中運行這個?在onReceive/onUpdate中放置一個斷點並查看它是否以固定的時間間隔被調用?如果沒有更多信息,很難判斷代碼中可能出現什麼問題。嘗試一些打印到logcat,看看什麼是什麼時候被調用。也許你沒有正確設置接收器,或者你的代碼正在拋出未捕獲的異常。 – Tim 2012-04-16 05:07:50

+0

是的,有時候會出現空指針異常。我將它添加到 – Mich 2012-04-19 22:36:21

回答

0

看着這樣的:

Caused by: java.lang.NullPointerException 
at com.batterywidget.BatteryWidgetProvider.onReceive(BatteryWidgetProvider.java:72) 

這意味着你必須在BatteryWidgetProvider異常,行72你能查找該行並看到你引用有可能是空的哪些對象?

+0

這裏有什麼 else if(level.intValue()<10) { this.views.setTextViewText(R.id.batter_level,level.toString()+「%」); } – Mich 2012-04-19 23:40:05

+0

我有10 af這些elseif。範圍從10-100。它任意隨機崩潰。 – Mich 2012-04-19 23:50:25

+0

您必須使用調試器並檢查崩潰周圍的變量。 – Tim 2012-04-20 00:48:13