广播机制----第一行代码

来源:互联网 发布:淘宝怎么开店卖东西 编辑:程序博客网 时间:2024/04/30 08:32


1、广播的类型

(1)标准广播

这是一种异步执行的广播,在广播发送出去之后,所有的广播接收器几乎都能在同一时间接收到这条广播消息,因此标准广播是没有先后顺序的,这样的广播方式效率比较高,但同时也意味着他们是不能截断的。

(2)有序广播

这是一种同步执行的广播,在广播发送出去之后,在同一时刻只能只有一个优先级高的广播接收器接收到,当这个广播接收器的逻辑执行完之后广播才能够继续传递。所以此时的广播接收器接收广播消息是有先后顺序的,优先级高的广播接收器优先接收到广播消息,并且前面的广播接收器可以截断正在传递的广播。


2、接收系统广播-----动态注册监听网络变化

Step

(1)在MainActivity中新建一个内部类NetWorkChangeReceiver让其继承自BroadcastReceiver,并实现方法onReceiver

//声明内部类让其继承自BroadcastReceiver    public class NetWorkChangeReceiver extends BroadcastReceiver {        @Override        public void onReceive(Context context, Intent intent) {            Toast.makeText(context, "network changed", Toast.LENGTH_SHORT).show();        }    }

(2)声明NetWorkChangeReceiver对象并实例化

private NetWorkChangeReceiver broadcaseReceiver = new NetWorkChangeReceiver();

(3)实例化IntentFilter对象并添加action

 //实例化IntentFilter对象并添加action        IntentFilter intentfilter = new IntentFilter();        intentfilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");

(4)注册广播接收器

//注册广播        registerReceiver(broadcaseReceiver,intentfilter);

(5)取消广播接收器的注册

 //取消注册        unregisterReceiver(broadcaseReceiver);

MainActivity.java

public class MainActivity extends BaseActivity {      private NetWorkChangeReceiver broadcaseReceiver = new NetWorkChangeReceiver();    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);                listView.setAdapter(fruitAdapter);        //实例化IntentFilter对象并添加action        IntentFilter intentfilter = new IntentFilter();        intentfilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");        //注册广播        registerReceiver(broadcaseReceiver,intentfilter);    }    @Override    protected void onDestroy() {        super.onDestroy();        ActivityCollector.removeActivity(this);        //取消注册        unregisterReceiver(broadcaseReceiver);    }    //声明内部类让其继承自BroadcastReceiver    public class NetWorkChangeReceiver extends BroadcastReceiver {        @Override        public void onReceive(Context context, Intent intent) {            Toast.makeText(context, "network changed", Toast.LENGTH_SHORT).show();        }    }    }


3、发送标准广播

Step

(1)新建一个类MyBroadcastReceiver继承自BroadcastReceiver,实现方法onReceive

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

(2)首先创建一个Intent对象,并把广播的值传递进去,然后只用sendbroadcast(intent)将广播发送出去,所以监听com.example.broadcast.MYBROADCAST这条广播消息的接收器就能接收到该消息

//发送广播        Intent intent = new Intent("com.example.broadcast.MYBROADCAST");        sendBroadcast(intent);

(3)注册广播接收器,有两种方式,一种动态注册广播接收器,另一种是在AndroidMainifest.xml中静态注册

动态注册接收器

private MyBroadcastReceiver myBroadcaseReceiver = new MyBroadcastReceiver();    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);               //实例化IntentFilter对象并添加action        IntentFilter intentfilter = new IntentFilter();        intentfilter.addAction("com.example.broadcast.MYBROADCAST");        //注册广播        registerReceiver(myBroadcaseReceiver,intentfilter);    }    public class MyBroadcastReceiver extends BroadcastReceiver {        @Override        public void onReceive(Context context, Intent intent) {            Toast.makeText(context, "received in MyBroadcastReceiver", Toast.LENGTH_SHORT).show();        }    }      @Override    protected void onDestroy() {        super.onDestroy();                //取消注册        unregisterReceiver(myBroadcaseReceiver);    }

静态注册接收器

AndroidMainifest.xml

 <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>                        <strong><receiver android:name=".MyBroadcastReceiver">            <intent-filter>                <action android:name="com.example.broadcast.MYBROADCAST"></action>            </intent-filter>        </receiver></strong>    </application>


4、发送有序广播

有序广播和标准广播的接收广播和接收广播的方式是比较类似的,只是将sendBroadcast()方法改成sendOrderedBroadcast()

(1)有序广播是可以对广播的消息进行截断的,截断的方法是在MyBroadcastReceiver中的onReceive()方法中调用方法abortBroadcast(),就表示将广播消息进行截断,后面的广播接收器就无法接收到该广播消息了。

(2)有序广播中对接收器进行设置优先级,有两种方式:动态添加和AndroidMainifest.xml中静态添加

动态添加:intentFilter.setPriority(100);

静态添加:

<receiver android:name=".MyBroadcastReceiver">
            <intent-filter android:priority="100">
                <action android:name="com.example.broadcast.MYBROADCAST"></action>
            </intent-filter>
        </receiver>





0 0