ACTION_BATTERY_CHANGED像疯了一样开火

Nic*_*ick 12 android battery broadcastreceiver android-appwidget

好的,所以我正在开发一个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));
    }
}
}
Run Code Online (Sandbox Code Playgroud)

而且我很担心,因为只要我将小部件放到我的主屏幕上,就会开始关闭大约100个这样的Log调用,说它正在接收ACTION_BATTERY_CHANGED.这不应该只为每减少百分比广播吗?它实际上导致我的整个发射器滞后,我不得不卸载它.这不可能是正确的.

Com*_*are 23

我的代码看起来像这样:

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

这不应该只为每减少百分比广播吗?

你在哪里看到记录?ACTION_BATTERY_CHANGED只要硬件感觉如此,AFAIK 就会播出.另外,请记住其他数据会发生变化Intent,例如温度.

如果您想实现此应用小部件,请不要注册您ACTION_BATTERY_CHANGED的方式.代替:

  • 允许用户通过a选择一个轮询周期SharedPreference(例如,每分钟一次,每15分钟一次)
  • 用于AlarmManager通过a来控制该轮询周期getBroadcast() PendingIntent
  • 在此BroadcastReceiver,呼吁registerReceiver()ACTION_BATTERY_CHANGED 但有null广播接收器,因为这会回报给你的最后Intent这是该行动广播(注:你仍然需要使用getApplicationContext()这个)
  • 使用AppWidgetManager带有电池电量来更新您的应用程序控件实例拉出的Intent您在前面的步骤中检索(注:如果要设置他们都一样,你并不需要遍历的标识-使用updateAppWidget()的是需要a ComponentName作为参数)

这有几个好处:

  1. 你不关心ACTION_BATTERY_CHANGED广播的频率
  2. 用户可以通过执行这些检查来控制您消耗的电量(如果将轮询周期保持在一分钟或更长时间,则应该可以忽略不计)
  3. 您可以在民意调查之间安全地终止您的流程,从而减少用户使用任务杀手攻击您的可能性,并且半永久性地破坏您的应用

  • 这不是解决这个问题的最好方法.我见过很多闭源电池小部件,一旦发生变化就会更新他们的信息(BattStatt就是一个很好的例子).我从未见过一个为用户提供更新间隔的软件.电池级小部件应始终准确. (3认同)