すべての主題私はstackoverflowで見つけたすべての方法を試してみましたが、そのうちのどれもうまくいきませんでした。Android BroadcastReceiverはウィジェットを更新していません
私はバッテリー監視アプリケーションを開発しており、情報を表示するウィジェットがいくつか含まれています。私は、ACTION_BATTERY_CHANGED
イベントを聞くために、BatteryUpdateReceiver
と呼ばれる共通の受信機を使用します。このレシーバーを使って現在のバッテリーレベルを示すウィジェットを更新します。しかし何らかの理由でウィジェットを更新しません。私は多くの方法を試みたが、何が間違っているのか分からなかった。私のコードは以下の通りです。
BatteryUpdateReceiver.java
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(Intent.ACTION_BATTERY_CHANGED)) {
Log.i(TAG, "Receiver ACTION_BATTERY_CHANGED fired");
RemoteViews remoteViews = new RemoteViews(context.getPackageName(),
R.layout.widget);
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context.getApplicationContext());
ComponentName thisWidget = new ComponentName(context.getApplicationContext(), BatteryWidget.class);
int[] allWidgetIds = appWidgetManager.getAppWidgetIds(thisWidget);
for (int i=0; i < allWidgetIds.length; i++) {
Log.i(TAG, "WID ID: " + allWidgetIds[i]);
appWidgetManager.updateAppWidget(allWidgetIds[i], remoteViews);
}
}
}
BatteryWidget.java
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
super.onUpdate(context, appWidgetManager, appWidgetIds);
Log.i(TAG, "onUpdate: ");
int currentLevel = calculateBatteryLevel(context);
if (batteryChanged(currentLevel)) {
batteryLevel = currentLevel;
Log.i(TAG, "onUpdate: Battery level changed");
}
updateViews(context);
}
private boolean batteryChanged(int currentLevelLeft) {
return (batteryLevel != currentLevelLeft);
}
private int calculateBatteryLevel(Context context) {
Log.i(TAG, "calculateBatteryLevel: ");
Intent batteryIntent = context.getApplicationContext().registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
int level = batteryIntent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0);
int scale = batteryIntent.getIntExtra(BatteryManager.EXTRA_SCALE, 100);
return level * 100/scale;
}
private void updateViews(Context context) {
Log.i(TAG, "updateViews: ");
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget);
views.setTextViewText(R.id.batteryText, batteryLevel + "%");
ComponentName componentName = new ComponentName(context, BatteryWidget.class);
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
appWidgetManager.updateAppWidget(componentName, views);
}
のAndroidManifest.xml
<receiver android:name=".lib.receivers.BatteryUpdateReceiver" android:enabled="true" />
<receiver android:name=".widget.BatteryWidget" android:label="@string/app_name" >
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
<meta-data
android:name="android.appwidget.provider" android:resource="@xml/batterywidgetinfo" />
</receiver>
デバイスの起動時にサービスを使用してBatteryUpdateReceiverを登録します。
IntentFilter filterBattery = new IntentFilter();
filterBattery.addAction(Intent.ACTION_BATTERY_CHANGED);
this.mBatteryStatusReceiver = new BatteryUpdateReceiver();
getApplicationContext().registerReceiver(this.mBatteryStatusReceiver, filterBattery);
Log.i(TAG, "Receiver ACTION_BATTERY_CHANGED registered by Service");
それはウィジェットIDを記録しますので、私はそのBatteryUpdateReceiver
作品を確認することができます。また、受信機をBatteryWidget
の中に入れると、ウィジェットが更新されます。誰かがここで私が何が欠けているか教えてくれますか?私はBatteryWidget
クラスのonReceive()
メソッドをオーバーライドできることを知っています。しかし、どうすればこのようにアーカイブできますか?
ありがとうございます!
Woohoo!それは働いている。私の日を救った。ありがとう! –
あなたは大歓迎です:) – earthw0rmjim