android - ACTION_POWER_CONNECTED 的问题

标签 android

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

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

所以我的 list 中有:

    <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>

我的类(class)是这样的:

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
    }

}

但是 isCharging 始终为 false,无论电源是否已连接或断开。我显然在调试时遇到了问题,因为我必须保持(断开)连接 USB 电缆才能触发事件。

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

最佳答案

如@gnichola 所建议,引用 this post是正确答案:

public class PowerReceiver extends BroadcastReceiver {

    @Override public void onReceive(Context context, Intent intent) {
        if(intent.getAction() == Intent.ACTION_POWER_CONNECTED) {
            //Handle power connected
        } else if(intent.getAction() == Intent.ACTION_POWER_DISCONNECTED){
            //Handle power disconnected
        }
    }
}

下面是另一种(尽管不正确)的方法:

我遇到了与其他人提到的相同的问题。我的解决方案是在 ACTION_POWER_CONNECTEDACTION_POWER_DISCONNECTED 广播接收器中调用 ACTION_BATTERY_CHANGED 阻塞 Intent :

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);

定义我们的 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;
    }
};  

此外,使用这种方法,您不必在 list 中定义接收者...但这最终完全取决于您的用例需求。

关于android - ACTION_POWER_CONNECTED 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10211609/

相关文章:

javascript - 根据其键聚焦特定元素

android - 将位置从 ListView 传递到新 Activity

android - 在 Android 应用程序中运行网络服务器

java - SonarQube 和 Jacoco 无法识别 kotlin-classes 目录

java - Android:使用单选按钮更改 TextView 的内容

android - 阻止 Android 请求使用蜂窝数据

android - 在 Android App 12500 中实现 Google 登录时出错

android - 更改 AChartEngine 中的图例大小

android - 应用程序在后台时未调用 Firebase onMessageReceived

Android VideoView,需要快速切换视频