gpt4 book ai didi

java - Android BroadcastReceiver 不更新小部件

转载 作者:搜寻专家 更新时间:2023-11-01 08:33:44 25 4
gpt4 key购买 nike

首先,我尝试了在 stackoverflow 上找到的所有方法,但没有一个有效。

我正在开发一个电池监控应用程序,它包含一些显示信息的小部件。我使用一个名为 BatteryUpdateReceiver 的通用接收器来监听 ACTION_BATTERY_CHANGED 事件。我使用此接收器更新显示当前电池电量的小部件。但由于某些原因,它不会更新小部件。我尝试了很多方法,但无法弄清楚出了什么问题。我的代码如下。

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");

我可以确认 BatteryUpdateReceiver 有效,因为它记录了小部件 ID。此外,如果我将接收器放在 BatteryWidget 中,那么小部件就会更新。有人能告诉我我在这里想念什么吗?我知道我可以覆盖 BatteryWidget 类中的 onReceive() 方法。但是我怎样才能以这种方式存档呢?

谢谢!

最佳答案

您应该从接收器发送一个 ACTION_APPWIDGET_UPDATE 广播,而不是直接调用 updateAppWidget()

像这样:

@Override
public void onReceive(Context context, Intent intent) {
AppWidgetManager widgetManager = AppWidgetManager.getInstance(getApplicationContext());
int[] appWidgetIds = widgetManager.getAppWidgetIds(new ComponentName(context, BatteryWidget.class));

Intent updateIntent = new Intent(AppWidgetManager.ACTION_APPWIDGET_UPDATE, null, getApplicationContext(), BatteryWidget.class);
updateIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, appWidgetIds);

sendBroadcast(updateIntent);
}

关于java - Android BroadcastReceiver 不更新小部件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38392599/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com