安卓入门--四大组件--BroadcastRecivier

来源:互联网 发布:农村淘宝怎么卖农产品 编辑:程序博客网 时间:2024/04/30 00:54

安卓广播机制:

Android 中有各式各样的广播,各种广播在Android 系统中运行,当系统/应用程序运行时便会向 Android 注册各种广播,Android 接收到广播会便会判断哪种广播需要哪种事件,然后向不同需要事件的应用程序注册事件,不同的广播可能处理不同的事件也可能处理相同的广播事件,这时就需要Android 系统为我们做筛选。

广播被分为两种不同的类型:“普通广播(Normal broadcasts)”和“有序广播(Ordered
broadcasts)”。普通广播是完全异步的,可以在同一时刻(逻辑上)被所有接收者接收到,消息传递的效率比较高,但缺点是:接收者不能将处理结果传递给下一个接收者,并且无法终止广播Intent的传播;然而有序广播是按照接收者声明的优先级别(声明在intent-filter元素的android:priority属性中,数越大优先级别越高,取值范围:-1000到1000。也可以调用IntentFilter对象的setPriority()进行设置),被接收者依次接收广播。如:A的级别高于B,B的级别高于C,那么,广播先传给A,再传给B,最后传给C。A得到广播后,可以往广播里存入数据,当广播传给B时,B可以从广播中得到A存入的数据。

Context.sendBroadcast()

发送的是普通广播,所有订阅者都有机会获得并进行处理。

Context.sendOrderedBroadcast()

发送的是有序广播,系统会根据接收者声明的优先级别按顺序逐个执行接收者,前面的接收者有权终止广播。
(BroadcastReceiver.abortBroadcast()),如果广播被前面的接收者终止,后面的接收者就再也无法获取到广播。对于有序广播,前面的接收者可以将处理结果通过setResultExtras(Bundle)方法存放进结果对象,然后传给下一个接收者,通过代码:Bundle
bundle =getResultExtras(true))可以获取上一个接收者存入在结果对象中的数据。

系统收到短信,发出的广播属于有序广播。如果想阻止用户收到短信,可以通过设置优先级,让你们自定义的接收者先获取到广播,然后终止广播,这样用户就接收不到短信了。

BroadcastReceiver的使用:

BroadcastReceiver是什么:

广播接收者(BroadcastReceiver)用于接收广播Intent,广播Intent的发送是通过调用Context.sendBroadcast()、Context.sendOrderedBroadcast()来实现的。通常一个广播Intent可以被订阅了此Intent的多个广播接收者所接收。

接收系统广播:

动态注册接收器:
新建类继承BroadcastReceiver,重写父类onReceive()即可。
代码很简单:最后记得取消注册

public class MainActivity extends AppCompatActivity {    private IntentFilter intentFilter;    private NetChangeReceiver netChangeReceiver;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        intentFilter=new IntentFilter();        intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");        netChangeReceiver=new NetChangeReceiver();        //动态注册代码        registerReceiver(netChangeReceiver,intentFilter);    }    @Override    protected void onDestroy() {        super.onDestroy();        //取消注册        unregisterReceiver(netChangeReceiver);    }    class NetChangeReceiver extends BroadcastReceiver{        @Override        public void onReceive(Context context, Intent intent) {            Toast.makeText(context,"network changes",Toast.LENGTH_LONG).show();        }    }}

然后加上权限,监听广播权限。

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

这里写图片描述
静态注册实现开机启动:
新建类继承BroadcastReceiver,同样重写onReceive()
然后在AndroidManifest.xml文件里注册。
写一个监听系统开机的广播。
类继承:

public class MyBroadcastReceiver extends BroadcastReceiver {    @Override    public void onReceive(Context context, Intent intent) {        Toast.makeText(context,"开机",Toast.LENGTH_SHORT).show();    }}

配置文件:

<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"    package="com.example.administrator.broadcastreceivertest">    <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=".MyBroadcastReceiver">            <intent-filter>                <action android:name="android.intent.action.BOOT_COMPLETED" />            </intent-filter>        </receiver>    </application></manifest>

说明:
onReceive()是不许开启线程的,所以不能做耗时间的任务。

发送自定义广播:

标准广播:

Intent intent=new Intent("com.example.broadcasttest.MY_BROADCAST);sendBroadcast(intent);

有序广播:

Intent intent=new Intent("com.example.broadcasttest.MY_BROADCAST);sendOrdereBroadcast(intent);

接收有序广播可以设定优先级:
android:priority="100"

<receiver android:name=".MyBroadcastReceiver">            <intent-filter android:priority="100">                <action android:name="android.intent.action.BOOT_COMPLETED" />            </intent-filter>        </receiver>
0 0
原创粉丝点击