Android:ACTION_POWER_CONNECTED事件未发送到我的BroadcastReceiver

abithluo  于 2023-04-10  发布在  Android
关注(0)|答案(4)|浏览(165)

我想在手机放入充电器后做一些事情。所以我创建了ChargingOnReciever

public class ChargingOnReceiver extends BroadcastReceiver { 
    public void onReceive(Context context, Intent intent) { 
        context.startActivity(someActivity);
        Log.d(TAG, "Phone was connected to power");
    } 
}

我想让我的接收器监听android.intent.action.ACTION_POWER_CONNECTED,所以我把它放入清单:

<reciever android:name=".ChargingOnReceiver"
          android:enabled="true"
          android:exported="true">
    <intent-filter>
        <action android:name="android.intent.action.ACTION_POWER_CONNECTED" />
    </intent-filter>
</reciever>

ChargingOnReceiver显然是没有启动时,我把我的G1充电器(连接到我的笔记本电脑通过USB电缆)。任何帮助是非常感谢。

of1yzvn4

of1yzvn41#

我花了5个小时才找到这个愚蠢的bug。我认为Android Eclipse插件应该在清单xml中做一些语法检查。

wgx48brx

wgx48brx2#

对于任何试图注册“android.intent.action.ACTION_POWER_CONNECTED”和“android.intent.action.ACTION_POWER_DISCONNECTED”接收器的人,我想添加:
作为Android 8.0(API级别26)后台执行限制的一部分,面向API级别26或更高级别的应用不能再在其清单中为隐式广播注册广播接收器。但是,目前有几个广播不受这些限制的限制。无论应用的目标是哪个API级别,应用都可以继续为豁免的广播注册侦听器。
上述两项广播已不在豁免广播名单内。请参阅以下文件:
https://developer.android.com/guide/components/broadcast-exceptions

kninwzqo

kninwzqo3#

1.不要从BroadcastReceiver启动Activity。
1.您是否在插入USB电缆时检查了LogCat,以查看是否有任何记录的消息可以解释您的问题?

zi8p0yeb

zi8p0yeb4#

似乎我们无法在post android 8上以the answer的形式接收ACTION_POWER_CONNECTED和ACTION_POWER_DISCONNECTED事件,即使在运行时或后台。现在唯一的方法是使用计时器手动检查

private var countDownTimer: CountDownTimer? = null

private fun listenForChargeEvents() {
    countDownTimer = object : CountDownTimer(CHARGING_STATUS_CHECK_TIMER.toLong(), 1000) {
        override fun onTick(millisUntilFinished: Long) {
            if (ChargingState.isCharging(context)) return
            // Execute for ACTION_POWER_DISCONNECTED
        }

        override fun onFinish() {}
    }.start()
}

override fun onCleared() {
    super.onCleared()
    countDownTimer?.cancel()
}

object ChargingState {
    fun isCharging(context: Context): Boolean {
        val batteryStatus: Intent? =
            IntentFilter(Intent.ACTION_BATTERY_CHANGED).let { intentFilter ->
                context.registerReceiver(null, intentFilter)
            }
        val status: Int = batteryStatus?.getIntExtra(BatteryManager.EXTRA_STATUS, -1) ?: -1
        return (status == BatteryManager.BATTERY_STATUS_CHARGING
                || status == BatteryManager.BATTERY_STATUS_FULL)
    }
}

如果有更好的方法,请分享。

相关问题