2012-04-21 2 views
0

После сбоя при создании виджета батареи я снова попытался использовать другую технику.Аккумуляторный виджет не обновляется

После просмотра и исследования я решил использовать службу и широковещательный приемник внутри моего класса AppWidgetProvider.

Значение моей батареи всегда равно нулю и никогда не изменяется.

Я зарегистрировал службу в манифесте и увидел, что служба запущена.

Я добавил журналы и заметил, что команда запуска вызывается перед сообщением onRecieve.

Значение изменяется в onReceieve, но никогда не изменяется в onStartCommand, где я обновляю свой вид.

Что я делаю неправильно?

Кроме того, где я могу отменить регистрацию приемника?

Мой класс ниже

public class BatteryWidgetProvider extends AppWidgetProvider 
{ 
    private RemoteViews views; 
    @Override 
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, 
      int[] appWidgetIds) 
    { 
     context.startService(new Intent(context, BatteryMonitorReceiver.class)); 
     /*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);*/ 

    } 

    public static class BatteryMonitorReceiver extends Service 
    { 
     private RemoteViews views; 
     private Integer level; 
     private BroadcastReceiver batteryReceiver = new BroadcastReceiver(){ 
      @Override 
      public void onReceive(Context context, Intent intent) 
      { 
       String action = intent.getAction(); 
       if(action.equals(Intent.ACTION_BATTERY_CHANGED)) 
       { 
        level = intent.getIntExtra("level", 0); 
        Log.d("BATTERY ON Receieve", "Battery Level is "+level); 
views = new RemoteViews(getPackageName(), R.layout.battery100layout); 

       } 
ComponentName thisWidget = new ComponentName(context,BatteryWidgetProvider.class); 
        AppWidgetManager manager = AppWidgetManager.getInstance(context); 
        manager.updateAppWidget(thisWidget, views); 

      } 
     }; 

     @Override 
     public int onStartCommand(Intent intent, int flags, int startId) 
     { 
      registerReceiver(this.batteryReceiver, new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); 

      Log.d("BATTERY Service", "Battery Level is "+level); 


      super.onStart(intent, startId); 
      return super.onStartCommand(intent, flags, startId); 
     } 

     @Override 
     public void onStart(Intent intent, int startId) 
     { 


     } 

     @Override 
     public IBinder onBind(Intent intent) 
     { 
      // TODO Auto-generated method stub 
      return null; 
     } 

    } 
} 

Вот мой StackTrace

java.lang.RuntimeException: Unable to start service com.mis[email protected]40522428 with null: java.lang.NullPointerException 
at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2473) 
at android.app.ActivityThread.access$2800(ActivityThread.java:135) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1127) 
at android.os.Handler.dispatchMessage(Handler.java:99) 
at android.os.Looper.loop(Looper.java:150) 
at android.app.ActivityThread.main(ActivityThread.java:4385) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:507) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:849) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:607) 
at dalvik.system.NativeStart.main(Native Method) 
Caused by: java.lang.NullPointerException 
at com.test.batterywidget.BatteryWidgetProvider$BatteryMonitorReceiver.onStartCommand(BatteryWidgetProvider.java:102) 
at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2456) 
... 10 more 

ответ

0

Что я делаю неправильно?

Вы пытаетесь обновить приложение виджет из onStartCommand(), а не от onReceive().

Также, где я могу отменить регистрацию приемника?

onDestroy()Service может показаться вероятным местом для этого.

+0

Что будет использовать onStartCommand(), если бы я переместил весь свой код в onReceieve()? – Mich

+0

Я так запутался .... onReceived не позволяет мне делать обновления. эта строка не работает внутри получаемого ComponentName thisWidget = new ComponentName (это, BatteryWidgetProvider.class); – Mich

+0

@ user1155204: «Что бы использовать onStartCommand(), если бы я переместил весь свой код в onReceieve()?» - ничего, но я никогда не говорил, чтобы вы переместили весь свой код в 'onReceive()'. «эта строка не работает» - это потому, что «BroadcastReceiver» не является «контекстом». Вам нужно использовать 'Context', предоставленный' onReceive() 'в качестве первого параметра для вашего конструктора' ComponentName'. – CommonsWare

Смежные вопросы