ACTION_POWER_CONNECTED出现问题

use*_*608 6 android

我在我的应用程序中使用以下示例页面中的代码来监视设备连接/断开连接到电源适配器的时间:

http://developer.android.com/training/monitoring-device-state/battery-monitoring.html

所以我在我的清单中:

    <receiver android:name=".StatusChangeReceiver">
        <intent-filter>
            <action android:name="android.intent.action.ACTION_POWER_CONNECTED"/>
            <action android:name="android.intent.action.ACTION_POWER_DISCONNECTED"/>
        </intent-filter>
    </receiver>
Run Code Online (Sandbox Code Playgroud)

我的班级看起来像这样:

public class StatusChangeReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
    boolean isActive = prefs.getBoolean("isActive", false);
    if (isActive){
        int status = intent.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
        boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING || status == BatteryManager.BATTERY_STATUS_FULL;
        // Do somthing with isCharging here
    }

}
Run Code Online (Sandbox Code Playgroud)

但无论电源是连接还是断开,isCharging总是假的.我显然在调试时遇到了问题,因为我必须保持(不)连接USB线以使事件发生.

我认为当电源连接时,事件被触发并且状态在我的代码运行之前没有更新,但我不确定解决它的最佳方法.有任何想法吗?

She*_*ude 5

我有其他人提到的相同问题。我的解决方案是在ACTION_POWER_CONNECTED和ACTION_POWER_DISCONNECTED广播接收器中调用ACTION_BATTERY_CHANGED阻止意图:

在onCreate或其他适当的初始化程序中:

    // register our power status receivers
    IntentFilter powerConnectedFilter = new IntentFilter(Intent.ACTION_POWER_CONNECTED);
    registerReceiver(PowerStatusReceiver, powerConnectedFilter);

    IntentFilter powerDisconnectedFilter = new IntentFilter(Intent.ACTION_POWER_DISCONNECTED);
    registerReceiver(PowerStatusReceiver, powerDisconnectedFilter);
Run Code Online (Sandbox Code Playgroud)

定义我们的BroadcastReceiver并将BATTERY_STATUS请求嵌入其中:

BroadcastReceiver PowerStatusReceiver = new BroadcastReceiver() {
    public void onReceive(Context context, Intent intent) {
        IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
        Intent batteryStatus = context.registerReceiver(null, ifilter);

        // Are we charging / charged?
        int status = batteryStatus.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
        isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING ||
                     status == BatteryManager.BATTERY_STATUS_FULL;
    }
};  
Run Code Online (Sandbox Code Playgroud)

此外,使用这种方法,您不必在清单中定义一个接收器...但是,最终完全取决于您,取决于用例的需要。


gau*_*erb 0

此处还进行了解释:ACTION_POWER_CONNECTED 上的电池状态

我遇到了同样的问题,并且打电话或检查电池状态的速度太快。ACTION_POWER_CONNECTED 在 ACTION_BATTERY_CHANGED 更新之前被调用,因此也许使用 AlarmManager 安排自己在几秒钟内再次醒来,然后再次检查。两秒,在我的测试中还不够长......