После сбоя при создании виджета батареи я снова попытался использовать другую технику.Аккумуляторный виджет не обновляется
После просмотра и исследования я решил использовать службу и широковещательный приемник внутри моего класса 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
Что будет использовать onStartCommand(), если бы я переместил весь свой код в onReceieve()? – Mich
Я так запутался .... onReceived не позволяет мне делать обновления. эта строка не работает внутри получаемого ComponentName thisWidget = new ComponentName (это, BatteryWidgetProvider.class); – Mich
@ user1155204: «Что бы использовать onStartCommand(), если бы я переместил весь свой код в onReceieve()?» - ничего, но я никогда не говорил, чтобы вы переместили весь свой код в 'onReceive()'. «эта строка не работает» - это потому, что «BroadcastReceiver» не является «контекстом». Вам нужно использовать 'Context', предоставленный' onReceive() 'в качестве первого параметра для вашего конструктора' ComponentName'. – CommonsWare