android广播接收器中未调用onReceive()进行静态广播

Posted

技术标签:

【中文标题】android广播接收器中未调用onReceive()进行静态广播【英文标题】:onReceive() is not called in android broadcast-receiver for static broadcasts 【发布时间】:2019-03-05 07:52:49 【问题描述】:

我正在学习 Broadcastreceiver。我在清单文件中声明了接收者,并且有类 MyBroadcastReceiver 来接收意图,但我无法接收任何意图。 onRecive() 函数永远不会被调用,例如当飞行模式改变或耳机插入或拔出时。以下是清单代码。

<receiver
        android:name=".MyBroadCastReceiver"
        android:exported="true">
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED" />
            <action android:name="android.intent.action.INPUT_METHOD_CHANGED" />
            <action android:name="android.intent.action.HEADSET_PLUG" />
            <action android:name="android.intent.action.AIRPLANE_MODE" />
        </intent-filter>
    </receiver>

以下是 BroadCastReceiver 类的代码。

public class MyBroadCastReceiver extends BroadcastReceiver 
private static final String TAG = "MyBroadcastReceiver";
@Override
public void onReceive(Context context, Intent intent) 
    StringBuilder sb = new StringBuilder();
    sb.append("Action: " + intent.getAction() + "\n");
    sb.append("URI: " + intent.toUri(Intent.URI_INTENT_SCHEME).toString() + "\n");
    String log = sb.toString();
    Log.d(TAG, log);
    Toast.makeText(context, log, Toast.LENGTH_LONG).show();

【问题讨论】:

需要更多逻辑,例如您如何启动服务 @AravindV 我没有任何服务,我只想在更改飞行模式或插入或拔出耳机时接收广播。 【参考方案1】:

如果您的应用面向 8.0 或更高版本。您不能再在清单中为隐式广播注册广播接收器,android.intent.action.AIRPLANE_MODE 是隐式广播。更多详情read this

作为一种解决方法,您仍然可以在运行时使用Context.registerReceiver() 动态注册隐式和显式广播。但是您的应用需要处于活动状态才能接收它。

【讨论】:

以上是关于android广播接收器中未调用onReceive()进行静态广播的主要内容,如果未能解决你的问题,请参考以下文章

Android - 从广播接收器 onReceive() 获取上下文以发送到

BroadcastReceiver的onReceive方法是否会在动态注册时被调用?

Android 广播

如何从广播接收器类调用颤振方法?

如果我关闭活动,从 BroadcastReceiver.onReceive 调用 peekService 将返回 null

Android学习笔记(十七) BroadcastReceiver