java - 在 Android 中监控电池电量的正确优化方法

标签 java android broadcastreceiver alarmmanager android-broadcast

我想监控电池电量,如果达到一定水平,我想做点什么。 我担心的是不必要地消耗太多电池。

使用服务将继续在后台运行。另外,如果我使用 android.intent.action.BATTERY_CHANGED Intent ,它将检查电池电量的每一个变化。根据我的要求,这两种方法可能会耗尽不必要的电池。

因此,如果我使用 AlarmManager(这也是操作系统处理的服务),它将在每个用户定义的时间(适当的时间)检查电池电量。

以下是我实现的代码。

import android.app.Activity;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;

public class MainActivity extends Activity {

private AlarmManager mAlarmManager;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.fragment_main);

        mAlarmManager= (AlarmManager) getSystemService(Context.ALARM_SERVICE);

        Intent intentAlarm = new Intent(this, AlarmReceiverTest.class);

        // User defined time
        long fiveMin= (AlarmManager.INTERVAL_FIFTEEN_MINUTES/3); // adjustment here

        mAlarmManager.setRepeating(AlarmManager.RTC,
                    System.currentTimeMillis()+fiveMin, oneMin, 
                    PendingIntent.getBroadcast(this,1,  intentAlarm, PendingIntent.FLAG_UPDATE_CURRENT));

    }

}

广播接收器:

public class AlarmReceiverTest extends BroadcastReceiver {

@Override
public void onReceive(Context pContext, Intent arg1) {

    IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
    Intent batteryStatus = pContext.registerReceiver(null, ifilter);

    int level = batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
    int scale = batteryStatus.getIntExtra(BatteryManager.EXTRA_SCALE, 100);
    int percent = (level*100)/scale;

    if(percent== myThreshold)
        //DO-SOMETHING
}

}

list 中:

<receiver android:name="AlarmReceiverTest">
    <intent-filter>
        <action android:name="android.intent.action.BATTERY_CHANGED"/>
    </intent-filter>
</receiver>

权限:

android.permission.BATTERY_STATS

由于它是重复警报,因此即使应用程序关闭,它也会继续检查。

例如:执行某些操作:如果应用程序已打开,则可能会锁定应用程序如果应用程序已关闭,则不允许打开应用程序。

这是正确的方法吗?我的理解是否正确? 如果还有其他合适的方法,请建议我。

编辑:

如果我每隔 5-10 小时检查一次电池电量,最好的方法是什么?

最佳答案

您不需要使用 AlarmManager 类。如果您使用 AlarmManager 类,您的应用程序会消耗更多电池。

最简单的方法是使用 Intent ACTION_BATTERY_CHANGED 的广播监听器。

public class AlarmReceiverTest extends BroadcastReceiver {

        @Override
        public void onReceive(Context context, Intent intent) {
            int batteryLevel = intent.getIntExtra(
                    BatteryManager.EXTRA_LEVEL, 0);
            int maxLevel = intent
                    .getIntExtra(BatteryManager.EXTRA_SCALE, 0);
            int batteryHealth = intent.getIntExtra(
                    BatteryManager.EXTRA_HEALTH,
                    BatteryManager.BATTERY_HEALTH_UNKNOWN);
            float batteryPercentage = ((float) batteryLevel / (float) maxLevel) * 100;

            // Do something with batteryPercentage and batteryHealth.
            // batteryPercentage here ranges 0-100
        }
    }

onReceive 会在每次电池电量发生变化时运行。

在您的主要 Activity 中注册广播接收器:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    AlarmReceiverTest mBatteryLevelReceiver = new AlarmReceiverTest();
    registerReceiver(mBatteryLevelReceiver, new IntentFilter(
            Intent.ACTION_BATTERY_CHANGED));
}

关于java - 在 Android 中监控电池电量的正确优化方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25932677/

相关文章:

java - JTextfield数组,检索名称和文本

android - 找不到有关如何添加到此元素的信息,Android

Android 设备监视器未在 Ubuntu 17.10 中打开

android - 应用程序未从 Play 商店安装在某些设备中

android - BroadcastReceiver CONNECTIVITY_CHANGE 总是在第一次启动应用程序时运行?

Android:从 broadcastReceiver 更新 listView 中的进度条

java - 获取每个 Activity 的网络状态

java - 如何打印一行中第 N 个单词的第 N 个字符?

java - 命令行参数和默认值(如何重置)

java - 一般对象的堆