【问题标题】:Android BroadcastReceiver android.intent.action.BATTERY_CHANGEDAndroid BroadcastReceiver android.intent.action.BATTERY_CHANGED
【发布时间】:2011-09-24 10:24:29
【问题描述】:

我能够在我的活动中收听 Intent Intent.ACTION_BATTERY_CHANGED,而且效果很好。我尝试在清单中定义接收器:

<receiver android:name="com.beargreaves.battery.BatteryReceiver"> 
    <intent-filter> 
        <action android:name="android.intent.action.BATTERY_CHANGED" />
    </intent-filter> 
</receiver>

但它不起作用,我在这里阅读了一篇文章,说它必须以编程方式定义。我不想在我的活动中注册接收器,而是想在服务中实现这一点,以便它持续监控。我已经成功实现了这一点,并且它有效,但我想检查我的工作,看看它是否是正确的方法。

我从扩展 BroadcastReceiver 开始:

public class BatteryReceiver extends BroadcastReceiver{
    @Override
    public void onReceive(Context context, Intent intent) {
        Bundle bundle = intent.getExtras();

        if(null == bundle)
            return;

        boolean isPresent = intent.getBooleanExtra("present", false);
        String technology = intent.getStringExtra("technology");
        int plugged = intent.getIntExtra("plugged", -1);
        int scale = intent.getIntExtra("scale", -1);
        int health = intent.getIntExtra("health", 0);
        int status = intent.getIntExtra("status", 0);
        int rawlevel = intent.getIntExtra("level", -1);
        int level = 0;

        Log.d("Debug","Battery Receiver OnReceive");

        if(isPresent) {
            if (rawlevel >= 0 && scale > 0) {
                level = (rawlevel * 100) / scale;

                Log.d("Debug","BatterReceiver: " + level);

                Toast.makeText(context,"Battery Receiver: " + level + "\t" + status + "Raw: " + rawlevel,Toast.LENGTH_LONG).show();

                if(level <60) {
                    /*
                     * Only invoke the service when level below threshold
                     */
                    Intent i = new Intent(context, BatteryService.class);
                    i.putExtra("level", level);
                    context.startService(i);
                }
            }
        }
    }
}

然后我使用服务首先在onCreate() 中注册接收器,然后在onStart() 中处理事件。如果级别低于阈值,我的 BroadcastReceiver 将启动服务。

public class BatteryService extends Service {
    /*
     * First Call to onStart we don't want to do anything
     */
    boolean avoidFirst = false;
    private BroadcastReceiver receiver;

    @Override
    public IBinder onBind(Intent intent) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public void onCreate() {
        super.onCreate();

        IntentFilter filter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
        receiver = new BatteryReceiver();
        registerReceiver(receiver, filter);
    }

    @Override
    public void onStart(Intent intent, int startId) {
        Log.d("Debug","Battery Service On Start");
        int level = intent.getIntExtra("level", -1);

        if(avoidFirst) {
            if(level != -1) {
                Log.d("Debug","Battery Alert Notifying..... " + level);
                SMSManager.sendSMS(BatteryService.this, "<number redacted>", "Battery Level Aleart: " + level);
                stopSelf();
            }
        } else {
            avoidFirst = true;
        }
    }

    @Override
    public void onDestroy() {
        // TODO Auto-generated method stub
        super.onDestroy();
        PreferenceUtil.updatePreference(BatteryService.this, "battery_monitor_on", false);
        unregisterReceiver(receiver);
    }
}

这是正确的方法吗?即在onCreate() 中注册接收者,然后在收到事件时启动服务。首先我尝试不使用服务,但后来我无法注册接收器,因为它无法在清单中实现。其次,当我尝试在onReceive() 中发送短信时引发异常。我读到onReceive() 不应该启动任何线程。

提前致谢

【问题讨论】:

    标签: android broadcastreceiver power-management


    【解决方案1】:

    是的,这是正确的方法。这与我对我的应用程序所做的非常相似,该应用程序在生产环境中运行良好已有十多年(自 Android 早期以来),我没有看到您在这里遗漏或出错的任何内容。你是正确的,你不能从你的 Manifest 注册那个广播;您确实需要以编程方式执行此操作。根据您分享的其余内容,在 Service 而不是 Activity 中这样做显然是正确的。

    【讨论】:

    • @Darshan!您能否在您的答案中添加您的答案而不是问题,因为它现在很混乱。
    • @ShajeelAfzal 我不明白。这是我的回答。我的回答是,Bear 在一些失误之后采用的方法,即问题中提出的方法,确实是一种合适的方法,类似于我在生产中使用了七年的方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-01
    相关资源
    最近更新 更多