gpt4 book ai didi

android - ACTION_BATTERY_CHANGED 疯狂射击

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:35:57 28 4
gpt4 key购买 nike

好的,我正在开发一个 AppWidget,它可以检查电池电量并将其显示在 TextView 上。我的代码如下所示:

public class BattWidget extends AppWidgetProvider {

private RemoteViews views = new RemoteViews("com.nickavv.cleanwidgets", R.layout.battlayout);

@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int appWidgetIds[]) {
final int N = appWidgetIds.length;
context.getApplicationContext().registerReceiver(this,new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
for (int i = 0; i < N; i++) {
int appWidgetId = appWidgetIds[i];
appWidgetManager.updateAppWidget(appWidgetId, views);
}
}

@Override
public void onReceive(Context context, Intent intent) {
super.onReceive(context, intent);
Log.d("onReceive", "Received intent " + intent);
if (intent.getAction().equals(Intent.ACTION_BATTERY_CHANGED)) {
Integer level = intent.getIntExtra("level", -1);
views.setTextViewText(R.id.batteryText, level+"%");
AppWidgetManager myAWM = AppWidgetManager.getInstance(context);
ComponentName cn = new ComponentName(context, AirWidget.class);
onUpdate(context, myAWM, myAWM.getAppWidgetIds(cn));
}
}
}

我开始担心了,因为只要我将小部件放到主屏幕上,它就会开始每秒触发大约 100 个 Log 调用,说它正在接收 ACTION_BATTERY_CHANGED。这不是应该只针对每个百分比的减少进行广播吗?它实际上导致我的整个启动器滞后,我不得不卸载它。这是不对的。

最佳答案

My code looks like this:

您无法从另一个 BroadcastReceiver 注册一个 BroadcastReceiver 并获得可靠的结果。 Android 将终止您的进程,因为它认为没有任何东西在运行。监听 ACTION_BATTERY_CHANGED 的唯一方法是从 Activity 或服务中注册该接收器。

Isn't this only supposed to be broadcast for each percent decrease?

您在哪里看到该记录? AFAIK,ACTION_BATTERY_CHANGED 将在硬件感觉良好时广播。此外,请记住该 Intent 中的其他数据会发生变化,例如温度。

如果您想实现此应用小部件,请不要按照您的方式注册 ACTION_BATTERY_CHANGED。相反:

  • 允许用户通过 SharedPreference 选择轮询周期(例如,每分钟一次,每 15 分钟一次)
  • 使用 AlarmManager 通过 getBroadcast() PendingIntent
  • 控制轮询周期
  • 在那个 BroadcastReceiver 中,为 ACTION_BATTERY_CHANGED 调用 registerReceiver() 但是使用 null BroadcastReceiver,因为这将向您返回为该操作广播的最后一个 Intent(注意:您仍然需要为此使用 getApplicationContext())<
  • 使用 AppWidgetManager 更新您的应用程序小部件实例,电池电量从您在上一步中检索到的 Intent 中提取(注意:如果您将它们全部设置为相同,您不需要遍历 ID——使用 updateAppWidget()ComponentName 作为参数)

这有几个优点:

  1. 您不关心广播ACTION_BATTERY_CHANGED的频率
  2. 用户可以通过执行这些检查来控制您消耗的电量(如果您将轮询周期保持在一分钟或更长时间,则可以忽略不计)
  3. 您的进程可以在轮询之间安全地终止,从而降低用户使用任务 killer 攻击您和半永久性地弄乱您的应用程序的可能性

关于android - ACTION_BATTERY_CHANGED 疯狂射击,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7624882/

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