Broadcast分类
java
注册方式:android
动态广播安全
在代码中注册receiverapp
必定要手动在onDestroy()时调用unregisterReveiver()来取消注册ide
静态广播this
在AndroidManifest.xml中注册receiver(主要是设定action)spa
动态广播:.net
1. 在代码中设置receiver、监听的广播类型并进行注册:code
public class MainActivity extends Activity { private NetworkChangeReceiver receiver; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE"); receiver = new NetworkChangeReceiver(); registerReceiver(receiver, intentFilter); } @Override protected void onDestroy() { unregisterReceiver(receiver);//remember to unregister manually super.onDestroy(); } }
2. 定义receiver的行为:继承BroadcastReceiver并在覆写onReceiver()时定义好接收到广播时处理的逻辑:
orm
public class NetworkChangeReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo networkInfo = manager.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(); } }
3. 在AndroidManifest.xml中定义必要的权限,主要<uses-permission>标签位于<manifest>的下一级,即与<application>同级:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
静态广播(以开机启动的广播为例)
1. 定义receiver的行为:
public class BootCompleteReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Toast.makeText(context, "Boot complete.", Toast.LENGTH_LONG).show(); } }
2. 在AndroidManifest.xml中定义receiver(与<activity>同级,<application>的子元素):
<receiver android:name=".MyBroadcast"> <intent-filter android:priority="100"> <action android:name="com.scv.lawrence.MY_BROADCAST"/> </intent-filter> </receiver>
3. 在AndroidManifest.xml中添加相应权限(<application>同级,<manifest>的子元素):
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
接收顺序:
标准(Normal broadcast)
默认的广播方式,即broadcast发出后,全部receiver几乎在同时接收到。
有序(Ordered broadcast)
receiver根据设定的优先级(priority)来决定broadcast的传递顺序,较高优先级的receiver能够选择拦截该broadcast阻止其向后传播
两者区别
发送广播时,标准广播调用的是sendBroadcast(),有序广播调用的是sendOrderedBroadcast()
接收广播时(在AndroidManifest.xml中注册receiver),标准广播不用在<intent-filter>中设置android:priority属性,有序广播则须要设定一个整数,数值越大priority越高
在代码中发送自定义的标准/无序广播:
Button sendBroadcast = (Button) findViewById(R.id.broadcast); sendBroadcast.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent("com.scv.lawrence.MY_BROADCAST"); sendBroadcast(intent); // sendOrderedBroadcast(intent, null); } });
在AndroidManifest.xml中定义(父元素为<application>,即与<activity>同级):
<receiver android:name=".MyBroadcast"> <intent-filter android:priority="100"> <action android:name="com.scv.lawrence.MY_BROADCAST"/> </intent-filter> </receiver>
广播范围:
全局广播
非LocalBroadcastManager进行发送或接收的广播即为全局广播
本地广播
发送/接收的broadcast只限于当前app范围内,安全性比全局高
与全局广播的区别在于本地广播依靠LocalBroadcastManager进行注册、发送及注销receiver
本地广播:
1. 定义接收到广播的行为:
public class LocalBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Toast.makeText(context, "Get the local broadcast.", Toast.LENGTH_SHORT).show(); } }
2. 和动态广播差很少,区别主要在使用LocalBroadcastManager的实例来进行操做:
public class MainActivity extends Activity { private LocalBroadcastManager localBroadcastManager; private LocalBroadcastReceiver localReceiver; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //Local Broadcast localBroadcastManager = LocalBroadcastManager.getInstance(MainActivity.this); final Button localBroadcast = (Button) findViewById(R.id.local_broadcast); localBroadcast.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent("com.scv.lawrence.LOCAL_BROADCAST"); localBroadcastManager.sendBroadcast(intent); } }); IntentFilter localIntentFilter = new IntentFilter(); localIntentFilter.addAction("com.scv.lawrence.LOCAL_BROADCAST"); localReceiver = new LocalBroadcastReceiver(); localBroadcastManager.registerReceiver(localReceiver, localIntentFilter); } @Override protected void onDestroy() { localBroadcastManager.unregisterReceiver(localReceiver); super.onDestroy(); } }
3. 在AndroidManifest.xml中配置permission. (若有必要)
参考: 《第一行代码:Android》 郭霖(著)