Broadcast广播机制
2016-06-10 13:29
351 查看
一、接收一个系统广播:动态注册接收系统网络变化
Manifest文件注册:(允许接收网络状态)
更多声明权限:
https://developer.android.com/reference/android/Manifest.permission.html
内部类:
MainActivity中:
二、接收一个系统广播:静态注册实现开机启动
动态注册写在onCreate方法中,只能应用开启后接收,静态注册可在未开启接收。
接收器类编写:
Manifest文件注册:
(开机自启权限)
(接收器静态注册)
三、发送自定义广播:发送标准广播
标准广播:即发送广播后,所有符合的广播接收器都接收到此广播,广播不可以在中途被截断。
广播接收器类:
Manifest文件注册:
发送广播:
四、发送自定义广播:发送有序广播
只需要在标准广播的基础上改动一行代码
发送广播代码:
截断广播:
假如有两个app都能接收这个广播(另一个app只需要有一个广播接收器类同时静态注册,注册时添加同样的action)
Q:如何规定两个app的接收顺序呢?
A:在intent-filter的priority属性规定优先级,这里设置成100.
Q:如何截断广播?
A:在广播接收器中截断。
五、发送本地广播
之前我们看到的都是全局的广播,就存在许多安全上的问题,那么,我们如何发送一个只能在本app内接收的广播呢?
其实很简单,我们只需要利用LocalBroadcastManager这个类来对广播进行管理。
注:本地广播只能动态注册
内部接收器类:
发送广播,注册接收器:
Manifest文件注册:(允许接收网络状态)
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
更多声明权限:
https://developer.android.com/reference/android/Manifest.permission.html
内部类:
//内部类继承BroadcastReceiver,在onReceive内书写广播逻辑 class NetworkChangedReceiver 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, "network available", Toast.LENGTH_SHORT).show(); }else { Toast.makeText(MainActivity.this, "network not available", Toast.LENGTH_SHORT).show(); } } }
MainActivity中:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); intentFilter = new IntentFilter(); intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");//网络变化时发出的Action networkChangedReceiver = new NetworkChangedReceiver(); registerReceiver(networkChangedReceiver, intentFilter); } @Override protected void onDestroy() { super.onDestroy(); unregisterReceiver(networkChangedReceiver); }
二、接收一个系统广播:静态注册实现开机启动
动态注册写在onCreate方法中,只能应用开启后接收,静态注册可在未开启接收。
接收器类编写:
public class BootCompleteReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Toast.makeText(context, "Boot Complete", Toast.LENGTH_LONG).show(); } }
Manifest文件注册:
(开机自启权限)
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
(接收器静态注册)
<application 4000 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"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED"/> </intent-filter> </receiver> </application>
三、发送自定义广播:发送标准广播
标准广播:即发送广播后,所有符合的广播接收器都接收到此广播,广播不可以在中途被截断。
广播接收器类:
public class MyBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Toast.makeText(context, "Receive my broadcast", Toast.LENGTH_SHORT).show(); } }
Manifest文件注册:
<receiver android:name=".MyBroadcastReceiver"> <intent-filter> <action android:name="com.example.barbara.broadcast.MY_BROADCAST"/> </intent-filter> </receiver>
发送广播:
Intent intent = new Intent("com.example.barbara.broadcast.MY_BROADCAST"); sendBroadcast(intent);
四、发送自定义广播:发送有序广播
只需要在标准广播的基础上改动一行代码
发送广播代码:
Intent intent = new Intent("com.example.barbara.broadcast.MY_BROADCAST"); sendOrderedBroadcast(intent, null);
截断广播:
假如有两个app都能接收这个广播(另一个app只需要有一个广播接收器类同时静态注册,注册时添加同样的action)
Q:如何规定两个app的接收顺序呢?
A:在intent-filter的priority属性规定优先级,这里设置成100.
<receiver android:name=".MyBroadcastReceiver"> <intent-filter android:priority="100"> <action android:name="com.example.barbara.broadcast.MY_BROADCAST"/> </intent-filter> </receiver>
Q:如何截断广播?
A:在广播接收器中截断。
public class MyBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Toast.makeText(context, "Receiver another broadcast", Toast.LENGTH_SHORT).show(); abortBroadcast();//截断 } }
五、发送本地广播
之前我们看到的都是全局的广播,就存在许多安全上的问题,那么,我们如何发送一个只能在本app内接收的广播呢?
其实很简单,我们只需要利用LocalBroadcastManager这个类来对广播进行管理。
注:本地广播只能动态注册
内部接收器类:
class LocalBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Toast.makeText(context, "Receive local broadcast", Toast.LENGTH_SHORT).show(); } }
发送广播,注册接收器:
private LocalBroadcastManager localBroadcastManager; private LocalBroadcastReceiver localBroadcastReceiver; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); button2 = (Button) findViewById(R.id.button2); localBroadcastManager = LocalBroadcastManager.getInstance(this); button2.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent("com.example.barbara.broadcast.LOCAL_BROADCAST"); localBroadcastManager.sendBroadcast(intent); } }); //注册本地接收器 intentFilter = new IntentFilter(); intentFilter.addAction("com.example.barbara.broadcast.LOCAL_BROADCAST"); localBroadcastReceiver = new LocalBroadcastReceiver(); localBroadcastManager.registerReceiver(localBroadcastReceiver, intentFilter); } @Override protected void onDestroy() { super.onDestroy(); localBroadcastManager.unregisterReceiver(localBroadcastReceiver); }
相关文章推荐
- JqueryEasyUi追加自定义工具标签
- 111. Minimum Depth of Binary Tree
- MySQL-5.6.24的配置安装
- iOS视频录制、压缩导出、取帧
- STM32F0xx_PWR低功耗配置详细过程
- Java设计模式之适配器模式
- style_include_selector
- 修改tomcat服务器默认的端口号
- Codeforces Round #356 (Div. 2) D.
- SpringMVC之http请求头和响应头(四)
- YY的GCD [Bzoj 2820]
- 改变语言并重新刷新界面
- 一个简单的epoll使用例子
- JavaScript中Event.returnValue属性
- eclipse/myeclipse 使用技巧
- 即时通信技术--IM系列之二
- 约瑟夫环的实现
- Hibernate与数据库事务
- java异常体系
- hdu3666 Count the string