广播机制简介
标准广播

有序广播

接收系统广播
动态注册监听网络变化
简易版
首先先创建一个类,按例子来是建立一个内部类,并在里面重写父类的onReceive()方法。
然后在onCreate()方法中首先创建一个IntentFilter的实例,并给他添加一个值为”android.net.conn.CONNECTIVITY_CHANGE”的action,为什么添加这个值,就是因为当网络状态发生变化时,系统发出的正是一条值为”android.net.conn.CONNECTIVITY_CHANGE”的广播,也就是说想监听什么广播就要添加相应的action。接下来创建内部类实例然后调用 registerReceiver()方法进行注册,然后把NetworkChangeReceiver实例和IntentFilter实例都传进去。
最后记的也要取消注册,在onDestroy()中调用 unregisterReceiver实现。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| public class MainActivity extends AppCompatActivity { private IntentFilter intentFilter; private NetworkChangeReceiver networkChangeReceiver; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); 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) { Toast.makeText(context, "network changes", Toast.LENGTH_SHORT).show(); } } }
|
优化版
使提醒网络发生变化更人性化,可以进一步修改:
1 2 3 4 5 6 7 8 9 10 11 12 13
| 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(context, "network is available", Toast.LENGTH_SHORT).show(); } else{ Toast.makeText(context, "network is unavailable", Toast.LENGTH_SHORT).show(); } } }
|
首先通过getSystemService()方法得到ConnectivityManager实例,这是一个系统服务类,专门用于管理网络连接。然后调用他的getActiveNetworkInfo方法得到NetworkInfo实例,然后用它的isAvailable()方法判断是否有网络
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
静态注册实现开机启动
动态注册的广播必须在程序启动之后才能实现,而静态注册的可以实现开机启动。
先用Android Studio提供的快捷方式来创建一个广播接收器<右击包->New->Other->Broadcast Receiver>,然后修改其中代码,作为广播内容。
其次静态注册的广播需要在Androidmanifest.xml中进行注册<快捷方式创建,注册自动完成>,然后在注册的receiver里面添加一条action
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
最后也要添加一项权限
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
自定义广播
发送标准广播
首先新建一个广播接收器
1 2 3 4 5 6 7
| public class MyBroadcastReceiver extends BroadcastReceiver {
@Override public void onReceive(Context context, Intent intent) { Toast.makeText(context, "received in MyBroadcastReceiver", Toast.LENGTH_SHORT).show(); } }
|
然后在AndroidManifest中 添加一条action
1 2 3
| <intent-filter> <action android:name="com.example.broadcasttest.MY_BROADCAST"/> </intent-filter>
|
接着可以定义一个按钮作为触发点
然后修改主活动中的代码,首先构建出来一个Intent对象,并把要发送的广播的值传入,然后调用sendBroadcast()方法将广播消息发送,这样所有监听”com.example.broadcasttest.MY_BROADCAST”这条广播的接收器都会收到消息
1 2 3 4 5 6 7 8 9 10
| Button button=(Button) findViewById(R.id.button); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent intent=new Intent("com.example.casttest.MY_BROADCAST"); intent.setPackage(getPackageName()); sendBroadcast(intent); } }); }
|
发送有序广播
先新建一个广播接收器,用于接收自定义广播。并在广播接收器中添加想要显示的内容
1 2 3 4 5 6 7
| public class AnotherBroadcastReceiver extends BroadcastReceiver {
@Override public void onReceive(Context context, Intent intent) { Toast.makeText(context, "received in AnotherBroadcastReceiver", Toast.LENGTH_SHORT).show(); } }
|
然后在AndroidManifest.xml中对该接收器进行修改添加一条action
1 2 3
| <intent-filter> <action android:name="com.example.broadcasttest.MY_BROADCAST"/> </intent-filter>
|
使用sendOrderedBroadcast()发送有序广播
1 2 3
| Intent intent=new Intent("com.example.broadcasttest.MY_BROADCAST"); intent.setPackage(getPackageName()); sendOrderedBroadcast(intent,null);
|
设置优先级(在AndroidManifest中使用android:priority=””设置优先级,优先级大的先执行)并利用abortBroadcast截断广播
<intent-filter android:priority="100">
在优先级高的广播接收器中使用abortBroadcast方法
本地广播
基本上和之前动态注册广播一样,只是首先通过LocalBroadcastManager的getInstance()方法获取一个他的实例,然后注册的时候调用LocalBroadcastManager的registerReceiver()方法,发送广播的时候调用LocalBroadcastManager的sendBroadcast()方法,仅此而已。
以下是完整的代码展示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| 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); Button button = (Button) findViewById(R.id.button); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent intent = new Intent("com.example.broadcasttest.LOCAL_BROADCAST"); localBroadcastManager.sendBroadcast(intent); } }); intentFilter = new IntentFilter(); intentFilter.addAction("com.example.broadcasttest.LOCAL_BROADCAST"); localReceiver = new LocalReceiver(); localBroadcastManager.registerReceiver(localReceiver, intentFilter); }
@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(); } } }
|