Android之BroadcastReceiver(广播接受者)详解
广播接受者又称全局大喇叭
分为:标准广播、有序广播。
标准广播:属于异步执行广播 ,广播发送出去以后广播接受器可以同时接收到,没有先后顺序 工作效率 无法拦截。
有序广播:属于同步执行广播 广播发出去只有一个广播接受器能接受这一条广播。
接受完毕以后广播接受器可以选择拦截或者,继续传给下一个接受器,优先级高优先收到广播 效率比较低。
广播的两种注册方式
静态:在清单文件中注册
动态:在带代码中注册,必须onDestroy时取消注册
#
1 .网络状态监听广播
MainActivity.class
public class MainActivity extends BaseActivity {
private IntentFilter filter;
private NetWorkChangeReceiver receiver;
@Override
protected int bindLayout() {
//加载布局文件
return R.layout.activity_main;
}
@Override
protected void initView() {
//初始化控件
filter = new IntentFilter();//创建意图过滤器
//添加网络变化的广播 filter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
receiver = new NetWorkChangeReceiver();//创建广播监听器
registerReceiver(receiver, filter);//注册广播
}
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(receiver);//解除注册
}
//监听网络变化的广播
class NetWorkChangeReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//判断网络连接还是没有连接
ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
if (networkInfo != null && networkInfo.isAvailable()) {
Toast.makeText(MainActivity.this, "网络已连接", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(MainActivity.this, "网络断开", Toast.LENGTH_SHORT).show();
}
}
}
}
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.androidbroadcastreceiver">
<!-- 添加网络数据权限 -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<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>
</application>
</manifest>
2.标准广播
MainActivity.class
public class MainActivity extends BaseActivity {
/*标准广播 发送标准广播(开启另一个程序) 步骤: 1.首先创建一个新项目 2.在新项目中创建广播接受器,在onReceive方法中 public void onReceive(Context context, Intent intent) { intent = new Intent(context,MainActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);//开启一个新栈 context.startActivity(intent); 3.在新项目清单中注册广播添加发送的广播频道 <action android:name="com.example.androidbroadcastreceiver.receiver.MyBroadcastReceiver" /> **在现在的程序中点击发送广播就能启动另一个程序了。** */
@Override
protected int bindLayout() {
return R.layout.activity_standard_broadcast_receiver;
}
public void standardBR(View view) {
Intent intent = new Intent("com.example.androidbroadcastreceiver.receiver.MyBroadcastReceiver");
//intent.putExtra("广播", 2);//这里可以设置传值
sendBroadcast(intent);
}
}
3.有序广播
MainActivity.class
/*有序广播 发送有序广播(优先级高的 优先接收到广播) 3.设置优先级intent-filter android:priority="100" 优先级高的优先收到广播 拦截(abortBroadcast())以后广播终端 */
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_order_broadcast_receiver);
}
public void orderBR(View view) {
//打开有序广播
Intent intent = new Intent("com.example.androidbroadcastreceiver.receiver.MyBroadcastReceiver");
intent.putExtra("广播", 3);
sendOrderedBroadcast(intent, null);//发送有序广播需要两个参数1.intent 2.权限参数设置为null
}
}
MyBroadcastReceiver.class
//广播接受器
public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getIntExtra("广播", 0) == 3) {
Toast.makeText(context, "发送有序广播(优先级高的 优先接收到广播)\n" +
"并且终止广播禁止程序启动", Toast.LENGTH_SHORT).show();
}
abortBroadcast();//广播拦截,禁止向下传递
}
}
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.androidbroadcastreceiver">
<!-- 添加网络数据权限 -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!-- 添加开机通知权限 -->
<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=".receiver.MyBroadcastReceiver" android:enabled="true" android:exported="true">
<!-- 设置优先级 -->
<intent-filter android:priority="100">
<action android:name="com.example.androidbroadcastreceiver.receiver.MyBroadcastReceiver" />
</intent-filter>
</receiver>
</application>
</manifest>
4.自定义广播
MainActivity.class
/* 自定义广播 */
public class MainActivity extends BaseActivity {
@Override
protected int bindLayout() {
return R.layout.activity_custom_broadcast_receiver;
}
public void customBR(View view) {
//打开自定义广播
Intent intent = new Intent("com.example.androidbroadcastreceiver.receiver.CustomBroadcastReceiver");
intent.putExtra("zdy", "自定义广播");
sendBroadcast(intent);
}
}
CustomBroadcastReceiver.class
/*自定义广播接受器 步骤: 1.创建广播接受器是必须勾选enabled、exported,否者接受不到广播 android:enabled="true" android:exported="true" 2.创建Intent i= new Intent("发送的广播"); 可以传值i.putString("标记","值"); sendBroadcast(intent); 然后接受器就能就收到广播啦! */
public class CustomBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, intent.getStringExtra("zdy"), Toast.LENGTH_SHORT).show();
}
}
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.androidbroadcastreceiver">
<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=".receiver.CustomBroadcastReceiver" android:enabled="true" android:exported="true">
<intent-filter>
<action android:name="com.example.androidbroadcastreceiver.receiver.CustomBroadcastReceiver" />
</intent-filter>
</receiver>
</application>
</manifest>
5.本地广播
LocalBroadcastReceiverActivity.class
/* 本地广播 步骤: 1.首先创建LocalBroadcastManager对象管理广播、IntentFilter、LocalReceiver(广播接受器) 2.通过manager来注册、和解绑广播 3.本地广播只能在自身应用程序中使用,安全性高 */
public class LocalBroadcastReceiverActivity extends AppCompatActivity {
private LocalBroadcastManager manager;
private IntentFilter filter;
private LocalReceiver receiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_local_broadcast_receiver);
manager = LocalBroadcastManager.getInstance(this);
filter = new IntentFilter();
filter.addAction("com.example.androidbroadcastreceiver.activity.LocalBroadcastReceiverActivity.LocalReceiver");
receiver = new LocalReceiver();
manager.registerReceiver(receiver, filter);
}
public void localBR(View view) {
//打开本地广播 安全不能跳转到别的程序
Intent intent = new Intent("com.example.androidbroadcastreceiver.activity.LocalBroadcastReceiverActivity.LocalReceiver");
intent.putExtra("bd", "我是刚创建的本地广播\n" +
"不能走出这个应用程序");
manager.sendBroadcast(intent);
}
@Override
protected void onDestroy() {
super.onDestroy();
manager.unregisterReceiver(receiver);
}
class LocalReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, intent.getStringExtra("bd"), Toast.LENGTH_SHORT).show();
}
}
}
End!
还没有评论,来说两句吧...