电池小部件不更新
Posted
技术标签:
【中文标题】电池小部件不更新【英文标题】:Battery Widget does not update 【发布时间】:2012-04-21 19:13:36 【问题描述】:在创建电池小部件失败后,我再次尝试使用不同的技术。
浏览和研究后,我决定在我的AppWidgetProvider
类中使用服务和广播接收器。
我的电池值始终为 null 并且永远不会改变。
我在manifest中注册了服务,看到服务启动了。
我添加了日志并注意到在广播的onRecieve
之前调用了 Start 命令。
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;
这是我的堆栈跟踪
java.lang.RuntimeException: Unable to start service com.mischel.batterywidget.BatteryWidgetProvider$BatteryMonitorReceiver@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
【问题讨论】:
【参考方案1】:我做错了什么?
您正在尝试从 onStartCommand()
而非 onReceive()
更新您的应用小部件。
还有我在哪里注销接收者?
Service
中的onDestroy()
似乎很适合这样做。
【讨论】:
如果我将所有代码移到 onReceieve() 中,onStartCommand() 将用于什么? 我很困惑.... onReceived 不允许我进行更新。此行在 Receieved ComponentName thisWidget = new ComponentName( this, BatteryWidgetProvider.class); 内部不起作用; @user1155204:“如果我将所有代码移到 onReceieve() 中,onStartCommand() 将用于什么?” -- 没什么,但我从来没有说过让你将所有代码移到onReceive()
。 “这条线不起作用”——那是因为BroadcastReceiver
不是Context
。您需要使用提供给onReceive()
的Context
作为ComponentName
构造函数的第一个参数。
谢谢,我仍然在后面遇到了一些崩溃。你帮了很多忙。以上是关于电池小部件不更新的主要内容,如果未能解决你的问题,请参考以下文章