【Android】Android中广播的基本使用
16lz
2022-06-05
接受系统广播
动态注册
在Java代码中指定IntentFilter,然后想监听什么广播就添加对应的Action。动态注册的广播,一定要调用unregisterReceiver()方法取消注册。
下面用动态注册监听网络变化
在AndroidManifest.xml中添加权限:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
Activity的Java代码:
public class MainActivity extends AppCompatActivity { private IntentFilter intentFilter; private NetworkChangeReceiver networkChangeReceiver; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //动态接受网络变化的广播接收器 intentFilter = new IntentFilter(); intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE"); networkChangeReceiver = new NetworkChangeReceiver(); registerReceiver(networkChangeReceiver, intentFilter); } @Override protected void onDestroy() { super.onDestroy(); //取消动态网络变化广播接收器的注册 unregisterReceiver(networkChangeReceiver); } //自定义接受网络变化的广播接收器 class NetworkChangeReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { ConnectivityManager connectionManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo networkInfo = connectionManager.getActiveNetworkInfo(); if (networkInfo != null && networkInfo.isAvailable()) { Toast.makeText(context, "network is available", Toast.LENGTH_SHORT).show(); } else { Toast.makeText(context, "network is unavailable", Toast.LENGTH_SHORT).show(); } } }}
静态注册
动态注册需要程序启动之后才能接收广播,静态广播就弥补了这个短板。在AndroidManifest中指定IntentReceiver就可以在程序未启动的情况下接收到广播
下面用静态注册接受开机广播
新建一个广播接收器
public class MyBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Toast.makeText(context, "received in MyBroadcastReceiver", Toast.LENGTH_SHORT).show(); }}
在AndroidManifest.xml中添加权限、注册广播接收器和添加Action
<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.broadcasttest"> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> intent-filter> activity> <receiver android:name=".BootCompleteReceiver" android:enabled="true" android:exported="true"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> intent-filter> receiver> application>manifest>
发送广播
发送标准广播
接收器的Java代码:
public class MyBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Toast.makeText(context, "received in MyBroadcastReceiver", Toast.LENGTH_SHORT).show(); }}
接收器的注册代码:
<receiver android:name=".MyBroadcastReceiver" android:enabled="true" android:exported="true"> <intent-filter> <action android:name="com.example.broadcasttest.MY_BROADCAST" /> intent-filter>receiver>
Activity的Java代码
public class MainActivity extends AppCompatActivity { private Button button; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //发送自定义广播 button = (Button) findViewById(R.id.button); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent("com.example.broadcasttest.MY_BROADCAST"); sendBroadcast(intent); } }); } @Override protected void onDestroy() { super.onDestroy(); //取消动态网络变化广播接收器的注册 unregisterReceiver(networkChangeReceiver); } }
发送有序广播
发送有序广播的方法:
sendOrderedBroadcast(intent, null);
设置广播接收器的先后顺序,在AndroidManifest.xml中receiver的intent-filter的priority属性,优先级可选值:-1000~1000
android:priority="100"
使用本地广播
主要是用LocalBroadcastManager来对广播进行管理,提供了发送广播和注册广播接收器的方法如下:
- LocalBroadcastManager.getInstance()获得实例
- ~.registerReceiver()注册广播
- ~.sendBroadcast()发送广播
- ~.unregisterReceiver()取消广播
注意事项:
- 本地广播无法通过静态注册来接收,相比系统全局广播更加高效
- 在广播中启动活动需要添加FLAG_ACTIVITY_NEW_TASK的标记
- 在广播中弹出AlertDialog需要添加TYPE_SYSTEM_ALERT
Java代码:
public class MainActivity extends AppCompatActivity { private IntentFilter intentFilter; private LocalReceiver localReceiver; private LocalBroadcastManager localBroadcastManager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //得到本地广播管理器的实例 localBroadcastManager = LocalBroadcastManager.getInstance(this); //动态注册本地广播接收器 intentFilter = new IntentFilter(); intentFilter.addAction("com.example.broadcasttest.LOCAL_BROADCAST"); localReceiver = new LocalReceiver(); localBroadcastManager.registerReceiver(localReceiver, intentFilter); //发送本地广播 Button button = (Button) findViewById(R.id.button); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent("com.example.broadcasttest.LOCAL_BROADCAST"); localBroadcastManager.sendBroadcast(intent); } }); } @Override protected void onDestroy() { super.onDestroy(); //取消动态网络变化广播接收器的注册 localBroadcastManager.unregisterReceiver(localReceiver); } class LocalReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Toast.makeText(context, "received local broadcast", Toast.LENGTH_SHORT).show(); } }}
更多相关文章
- Android一键锁屏代码
- Android(安卓)入门知识点梳理之一 四大组件
- 初学Android,开机自启动的Service(七十三)
- Android的framework层音量控制原理分析--hot(key)处理
- androidの亮屏,灭屏,解锁广播使用
- android与java web交互完成简单的登录和注册
- Android02--debug.keystore的注册信息
- Android四大基本组件介绍与生命周期
- 系出名门Android(4) - 活动(Activity), 服务(Service), 广播(Bro