首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ACTION_BATTERY_CHANGED疯狂开炮

ACTION_BATTERY_CHANGED疯狂开炮
EN

Stack Overflow用户
提问于 2011-10-02 14:04:02
回答 2查看 6.6K关注 0票数 12

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

代码语言:javascript
复制
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个这样的日志呼叫,说它正在接收ACTION_BATTERY_CHANGED。这不是应该在每减少一个百分比的情况下才广播吗?它实际上导致了我的整个启动程序延迟,我必须卸载它。这是不对的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-10-02 20:25:46

我的代码如下所示:

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

不是应该每减少一个百分比就广播一次吗?

你在哪里看到这方面的文档?AFAIK,ACTION_BATTERY_CHANGED将在任何硬件需要的时候进行广播。此外,请记住,该Intent中的其他数据也会发生变化,例如温度。

如果您想实现此应用程序小部件,请不要以这种方式注册ACTION_BATTERY_CHANGED。而是:

  • 允许用户通过SharedPreference选择轮询周期(例如,每分钟一次,每15分钟一次)
  • 使用AlarmManager通过getBroadcast() BroadcastReceiver为您提供对该轮询周期的控制,但使用<代码>e224 PendingIntent
  • In调用<代码>d22<代码>E123因为这将返回为该操作广播的最后一个Intent (注意:您仍需要使用getApplicationContext()完成此操作)
  • 使用AppWidgetManager更新您的应用程序小部件实例,电池电量来自上一步中检索到的Intent (注意:如果您将它们都设置为相同,则不需要遍历IDs -使用接受ComponentName作为参数的ComponentName)

<代码>F239

这有几个优点:

应用程序用户可以通过执行这些检查来控制您的耗电量(如果您将轮询时间保持在一分钟或更长时间,则可以忽略不计)

  1. 您可以在两次轮询之间安全地终止您的进程,从而降低用户使用任务杀手攻击您并半永久性地扰乱您的应用程序

的可能性

票数 24
EN

Stack Overflow用户

发布于 2017-05-31 09:02:13

好的,你的onUpdate正在注册它自己的类作为batteryinfo意图的接收者。然后,对于第一个信息,该意图被立即触发。您的onReceive再次呼叫您的onUpdate。我们称之为循环。因此每秒有100个日志...

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7624882

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档