Broadcast广播机制
来源:互联网 发布:自由之战末那之冠淘宝 编辑:程序博客网 时间:2024/06/03 22:45
一、接收一个系统广播:动态注册接收系统网络变化
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 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); }
0 0
- Android 广播机制---BroadCast
- Android 广播机制 Broadcast
- BroadCast 广播机制
- android广播机制Broadcast
- Broadcast广播机制
- Broadcast 广播机制总结
- Broadcast广播内部机制
- 【Android】广播机制 Broadcast
- Broadcast广播机制
- Broadcast --- 广播机制
- Android广播机制 Broadcast
- BroadCast广播机制
- Broadcast Receiver 广播机制
- 广播(Broadcast内部机制讲解)
- 广播(Broadcast内部机制讲解)
- Android广播机制Broadcast详解
- Android广播机制-Broadcast Receiver
- Broadcast广播机制--学习笔记
- CSS3实现炫酷进度条
- iOS视频录制、压缩导出、取帧
- JqueryEasyUi追加自定义工具标签
- 正则表达式小总结
- 关于图的常用算法——Dijkstra单源最短路径、Floyd多源最短路径、Prim和Kruskal最小生成树算法
- Broadcast广播机制
- SpringMVC之http的状态码(五)
- meter度量值,也可用作进度条
- [企业管理]员工生育保障问题的讨论
- 设计模式---简单工场模式
- 如何将latex模板中的照片框去掉?
- LeetCode:House Robber III
- ACM:蓝桥杯:开灯问题
- 算法与数据结构之简单排序