Android充电意图没有额外的数据

3
我将尝试在特定的Activity中显示警报,当充电状态发生变化时。 这是我的receiver类:
public class BatteryChargeReceiver extends BroadcastReceiver {
private String TAG = "receiver";
private ChargeReceiverCallback callback;

public BatteryChargeReceiver(ChargeReceiverCallback callback) {

    this.callback =callback;
    Log.v(TAG,"Inside  Constructor (Callback)");
}

public interface ChargeReceiverCallback {
    public void onReceive(Intent intent);
}

@Override
public void onReceive(Context context, Intent intent) {
    callback.onReceive(intent); 

}

以下是我在MainActivity的onResume中实例化它的方式。MainActivity实现了我的接口并重写了onReceive(intent)方法。我发现无论何时,intent.getIntExtra(BatteryManager.EXTRA_STATUS, -1) 都不会返回除-1以外的任何内容。

BatteryChargeReceiver batteryReceiver = new BatteryChargeReceiver(this);
    IntentFilter filterPower = new IntentFilter("android.intent.action.ACTION_POWER_CONNECTED");
    registerReceiver(batteryReceiver, filterPower);

1
使用 BatteryManager.EXTRA_PLUGGEDintent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1) - ozbek
1
您可能还想要监听"android.intent.action.ACTION_POWER_DISCONNECTED"广播。 - ozbek
抱歉,我在提问时没有提到我简化了我的代码。我正在尝试Shoe Rat建议的两件事情,但没有成功。 - Kepedizer
  1. 如果您正在使用 EXTRA_PLUGGED 额外参数(而不是 EXTRA_STATUS),您应该相应地更新您的问题内容。
  2. 您为什么需要这个接口?看起来这就是您的问题所在:广播接收器及其对象会在 onReceive() 中的代码运行完毕后立即被销毁。
- ozbek
  1. 我会修复它
  2. 我只是试图在电池被拔出时让我的活动显示一个小提示,没什么太花哨的。
- Kepedizer
2个回答

3

Intent.ACTION_POWER_CONNECTED无法传递当前插入状态 - 这可能是API工作方式的变化,但我在文档中找不到任何关于这种变化的提及。

广播Intent.ACTION_POWER_CONNECTED从来没有意味着接收当前插入类型,而只是让电源连接的接收端知道(参考)。实际上,在BatteryService.java中,广播纯粹的意图,没有任何额外的值(截至本文撰写时的410~412行):

Intent statusIntent = new Intent(Intent.ACTION_POWER_CONNECTED);
statusIntent.setFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT);
mContext.sendBroadcastAsUser(statusIntent, UserHandle.ALL);

然而,以下代码使用

<uses-sdk
    android:minSdkVersion="10"
    android:targetSdkVersion="19" />

曾在 Nexus 5 上工作:

public class MainActivity extends Activity {
    private static final String TAG = "PowerReceiver";

    private final BroadcastReceiver mPowerReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            final String action = intent.getAction();
            if (Intent.ACTION_POWER_CONNECTED.equals(action)) {
                Log.d(TAG, "Power connected");
                checkPluggedState(context, intent);
            } else if (Intent.ACTION_POWER_DISCONNECTED.equals(action)) {
                Toast.makeText(context, "Power disconnected", Toast.LENGTH_SHORT).show();
            } else {
                Log.wtf(TAG, "Unknown action: " + action);
            }
        }
    };

    private void checkPluggedState(Context context, Intent intent) {
        Intent chargingIntent = registerReceiver(null, new IntentFilter(
                Intent.ACTION_BATTERY_CHANGED));
        final int pluggedState = chargingIntent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);
        final String msg;
        switch (pluggedState) {
            case 0:
                msg = "The device is running on battery";
                break;
            case BatteryManager.BATTERY_PLUGGED_AC:
                msg = "Plugged into AC charger";
                break;
            case BatteryManager.BATTERY_PLUGGED_USB:
                msg = "Plugged into USB charger";
                break;
            case BatteryManager.BATTERY_PLUGGED_WIRELESS:
                msg = "Plugged into wireless charger";
                break;
            default:
                msg = "Unknown state: " + pluggedState;
        }

        Toast.makeText(context, msg, Toast.LENGTH_SHORT).show();
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    protected void onResume() {
        super.onResume();

        IntentFilter filter = new IntentFilter();
        filter.addAction(Intent.ACTION_POWER_CONNECTED);
        filter.addAction(Intent.ACTION_POWER_DISCONNECTED);
        registerReceiver(mPowerReceiver, filter);
    }

    @Override
    protected void onPause() {
        super.onPause();
        unregisterReceiver(mPowerReceiver);
    }
}

希望这可以帮到您。

2

如果我理解正确,ACTION_POWER_CONNECTED与此处相似: http://developer.android.com/training/monitoring-device-state/battery-monitoring.html#MonitorChargeState 以及这里: http://developer.android.com/reference/android/content/Intent.html#ACTION_POWER_CONNECTED - Kepedizer
但是没有地方说明 ACTION_POWER_CONNECTED 应该接收 EXTRA_STATUS。 - Gabe
在相关的BroadcastReceiver实现中,您可以提取当前的充电状态和方法,就像之前注册ACTION_POWER_CONNECTED接收器时描述的一样。 - Kepedizer
1
教程文档通常比单独的javadocs有更多的错误。这对我来说看起来像是一个错误。如果你查看创建广播的代码(https://github.com/android/platform_frameworks_base/blob/master/services/java/com/android/server/BatteryService.java#L409),你会发现EXTRA_STATUS从未被设置。它只在ACTION_BATTERY_CHANGED中设置(https://github.com/android/platform_frameworks_base/blob/master/services/java/com/android/server/BatteryService.java#L477)。 - Gabe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接