
Android 8.0(API 26)起,系统禁止在 AndroidManifest 中静态注册非豁免隐式广播(如 AIRPLANE_MODE),必须改用动态注册方式,否则无法接收广播并触发 Toast 提示。
android 8.0(api 26)起,系统禁止在 androidmanifest 中静态注册非豁免隐式广播(如 `airplane_mode`),必须改用动态注册方式,否则无法接收广播并触发 toast 提示。
在 Android 8.0(API level 26)及更高版本中,为提升系统性能与电池续航,Google 引入了后台执行限制(Background Execution Limits)。其中关键变更之一是:应用若目标 SDK ≥ 26,则不得在 AndroidManifest.xml 中为隐式广播(implicit broadcasts)声明
✅ 正确做法:在 Activity(或 Fragment/Service)中动态注册广播接收器,并在生命周期合适位置完成注册与注销,以确保安全与可靠性。
✅ 正确实现步骤
1. 移除 Manifest 中的静态声明
删除 AndroidManifest.xml 中关于 BoradCastReciever 的
2. 更新 BroadcastReceiver 类(修复逻辑缺陷)
你当前的接收器代码存在两个关键问题:
- intent.getBooleanExtra("air", false) —— AIRPLANE_MODE 广播不携带 "air" 键值,实际应使用 Intent.EXTRA_AIRPLANE_MODE;
- is_on == true 写法冗余,建议直接使用布尔值判断。
修正后的 BoradCastReciever.java:
package com.mohapp.myapplication;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;
public class BoradCastReciever extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// ✅ 正确获取飞行模式状态(注意:key 是 Intent.EXTRA_AIRPLANE_MODE)
boolean isAirplaneModeOn = intent.getBooleanExtra(Intent.EXTRA_AIRPLANE_MODE, false);
String message = isAirplaneModeOn
? "✈️ 飞行模式已开启"
: "✅ 飞行模式已关闭";
Toast.makeText(context, message, Toast.LENGTH_LONG).show();
}
}3. 在 MainActivity 中动态注册与注销
在 MainActivity.java 中声明接收器实例,并在 onResume() / onPause() 中配对注册/注销(推荐),确保仅在前台活跃时监听,避免内存泄漏与无意义唤醒:
public class MainActivity extends AppCompatActivity {
private BoradCastReciever airplaneReceiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 初始化接收器实例
airplaneReceiver = new BoradCastReciever();
}
@Override
protected void onResume() {
super.onResume();
// ✅ 动态注册:仅在 Activity 可见时监听
IntentFilter filter = new IntentFilter(Intent.ACTION_AIRPLANE_MODE_CHANGED);
registerReceiver(airplaneReceiver, filter);
}
@Override
protected void onPause() {
super.onPause();
// ✅ 必须注销,防止内存泄漏
if (airplaneReceiver != null) {
unregisterReceiver(airplaneReceiver);
}
}
}⚠️ 注意事项:
- Intent.ACTION_AIRPLANE_MODE_CHANGED 是系统广播的标准 Action 名称(不是 "android.intent.action.AIRPLANE_MODE",后者已废弃);
- 动态注册无需
,但需确保 targetSdkVersion ≥ 26 时绝不依赖 Manifest 静态注册隐式广播; - 若需长期监听(如后台服务场景),应改用 JobIntentService + AlarmManager 或 WorkManager 替代,但飞行模式变更通常只需前台响应;
- Toast 在后台线程不可直接调用:onReceive() 运行在主线程,此处安全;若后续扩展至异步逻辑,请务必切回主线程(如 runOnUiThread() 或 Handler(Looper.getMainLooper()))。
✅ 验证方法
- 运行 App 后进入主界面;
- 手动开关飞行模式(下拉通知栏快捷开关或设置中操作);
- 观察是否弹出对应 Toast —— 成功即表明动态注册生效。
通过以上调整,你的应用将完全兼容 Android 8.0 至 Android 14(API 33+),既符合平台规范,又保障功能可用性。记住核心原则:隐式广播 ≠ Manifest 注册;动态注册 + 生命周期管控 = 现代 Android 广播开发的黄金实践。









