Android广播接收器的电池寿命每10分钟或更改一次,它可以进入自己的线程吗?

时间:2011-03-31 18:12:05

标签: android multithreading exception broadcastreceiver

我想编写一个应用程序(用于研究),每次电池电量变化时都会生成一个时间戳。如果我不能这样做,我想做到这一点,每10分钟左右需要一次电池读数。

我有这个BroadcastReceiver代码,但我不知道该把它放在哪里。

我的应用程序因以下异常而崩溃:

  

java.lang.RuntimeException:在com.mdog.datareceive.Receive$1@43c9cd10

中接收广播Intent {act = android.intent.action.BATTERY_CHANGED flg = 0x60000000(有额外内容)}时出错

在我的活动的onCreate中,我产生了3个在后台执行操作的AsyncTask线程。放置广播接收器的好地方在哪里?

我在onCreate尝试过,我尝试过一种新方法,可以通过其中一个后台任务调用。我认为问题可能是BroadcastRecevier代码所处的功能可能过早结束了?

无论如何,我可以将它放在自己的线程中,以便它等待广播吗?

代码:

batteryLevelTimeStamps = new LinkedList<String>();
BroadcastReceiver batteryLevelReceiver = new BroadcastReceiver(){
    @Override
    public void onReceive(Context context, Intent intent){
        int rawlevel = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
        int scale = intent.getIntExtra(BatteryManager.EXTRA_SCALE, -1);
        int level = -1;
        if (rawlevel >= 0 && scale > 0) {
            level = (rawlevel * 100) / scale;
        }

        batteryLevel = level + "%";
        batteryLevelTimeStamps.add("At time: " + new Date().toString() + " the battery level is:" +batteryLevel); 
        out.print("At time: " + new Date().toString() + " the battery level is:" +batteryLevel + " in onCreate\n");
    }
};

IntentFilter batteryLevelFilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
registerReceiver(batteryLevelReceiver, batteryLevelFilter);

1 个答案:

答案 0 :(得分:0)

我想你想看一下使用AlarmManager。您可以在手机启动时设置闹钟,并在收到该闹钟后,您可以检查电池并在将来10分钟内设置另一个闹钟。

使用AlarmManager比你自己的线程更好,因为

  • 允许手机在十分钟等待期间进入低功耗模式
  • 在10分钟结束时,如果手机当前处于低功耗状态,它将唤醒手机。