Android Studio中飞行模式监听BroadcastReceiver无法弹出Toast问题
解决飞行模式切换监听无Toast提示的问题
问题根源
- 静态广播注册限制:从Android 8.0(API 26)开始,系统禁止大部分隐式广播的静态注册,
android.intent.action.AIRPLANE_MODE属于这类广播,因此Manifest中静态注册的接收器无法被触发。 - 状态获取键错误:你使用
"air"作为获取状态的extra键,而系统传递飞行模式状态的正确键是Intent.EXTRA_AIRPLANE_MODE_ON,导致状态判断逻辑失效。 - 权限冗余:监听飞行模式切换不需要
READ_PHONE_STATE权限,可直接移除。
修正步骤
1. 修改Manifest文件
移除静态注册的Receiver和冗余权限:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"> <application android:allowBackup="true" android:dataExtractionRules="@xml/data_extraction_rules" android:fullBackupContent="@xml/backup_rules" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/Theme.MyApplication" tools:targetApi="31"> <activity android:name=".MainActivity" android:exported="true"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
2. 修正BroadcastReceiver代码
替换状态获取的键为系统常量:
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) { boolean isAirplaneModeOn = intent.getBooleanExtra(Intent.EXTRA_AIRPLANE_MODE_ON, false); if (isAirplaneModeOn) { Toast.makeText(context, "飞行模式已开启", Toast.LENGTH_LONG).show(); } else { Toast.makeText(context, "飞行模式已关闭", Toast.LENGTH_LONG).show(); } } }
3. 在MainActivity中动态注册Receiver
在Activity生命周期内注册/注销接收器,避免内存泄漏:
package com.mohapp.myapplication; import android.content.IntentFilter; import android.os.Bundle; import androidx.appcompat.app.AppCompatActivity; public class MainActivity extends AppCompatActivity { private BoradCastReciever airplaneModeReceiver; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); airplaneModeReceiver = new BoradCastReciever(); } @Override protected void onResume() { super.onResume(); IntentFilter filter = new IntentFilter(Intent.ACTION_AIRPLANE_MODE_CHANGED); registerReceiver(airplaneModeReceiver, filter); } @Override protected void onPause() { super.onPause(); unregisterReceiver(airplaneModeReceiver); } }
注意事项
- 动态注册的接收器生命周期依赖于注册它的组件,只有当MainActivity处于前台或resumed状态时,才能接收飞行模式切换广播。
- 测试时需确保App处于运行状态(MainActivity在前台),切换飞行模式才能看到Toast提示。
内容的提问来源于stack exchange,提问作者Mohammed Amine
相关产品推荐
相关产品推荐

