您的位置:首页 > 其它

安卓四大组件-----广播机制

2017-03-22 21:17 330 查看
广播机制

关于广播,安卓提供了一整套的API,通过使用API,允许应用程序自由的发送和接收。

广播使用实例

1)监听网络变化

public class MainActivity extends AppCompatActivity {

    private IntentFilter intentFilter;

    private NetworkChangeReceiver networkChangeReceiver;

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        intentFilter = new IntentFilter();//创建了一个IntentFilter实例

        intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");//添加action 告诉广播接收器要监听网络变化

        networkChangeReceiver = new NetworkChangeReceiver(); //创建了一个NetworkChangeReceiver的实例

        registerReceiver(networkChangeReceiver, intentFilter);//将NetworkChangeReceiver的实例和IntentFilter实例都传进去,实现监听网络变化的功能

    }

    @Override

    protected void onDestroy() {

        super.onDestroy();

       unregisterReceiver(networkChangeReceiver);//动态广播接收器要注意取消注册  在这里(onDestroy())被调用

           }


/****************************准确告诉用户当前有网络还是没有网络**********************************************/

    class NetworkChangeReceiver extends BroadcastReceiver {

     @Override

        public void onReceive(Context context, Intent intent) {


           ConnectivityManager connectionManager = (ConnectivityManager)

        getSystemService(Context.CONNECTIVITY_SERVICE);//通过getSystemService()方法得到了ConnectivityManager的实例(一个系统服务类)

NetworkInfo networkInfo = connectionManager.getActiveNetworkInfo();//得到NetworkInfo实例

if (networkInfo != null && networkInfo.isAvailable()) {//调用 NetworkInfo的isAvailable()方法,判断出当前是否有网络

    Toast.makeText(context, "network is available",

            Toast.LENGTH_SHORT).show();

} else {

    Toast.makeText(context, "network is unavailable",

            Toast.LENGTH_SHORT).show();

}

       }  


注意读取网络状态需要权限,因此在androidManifest.xml文件中加入以下权限

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

2)应用程序实现开机自启

应用要想实现开机启动,需要接收一条开机广播。当接收到这条广播时,可在onReceive()方法里执行相应的逻辑,从而实现开机启动的功能。

首先创建一个广播接收器,右击com.example.broadcasttest包,在Other选项上选择Broast Receiver,给广播接收器命名为BootCompleteReceiver,点击finish完成创建。

然后修改BootCompleteReceiver里面的代码

 @Override

    public void onReceive(Context context, Intent intent) {

        Toast.makeText(context, "Boot Complete", Toast.LENGTH_LONG).show();//在onReceive()方法中使用Toast弹出一段提示信息

}

在创建广播接收者的时候在AndroidManifest.xml里面会自动生成这段代码 所有的静态广播接收器都是在这里进行注册的。

name 表示具体注册哪一个广播接收
cd89


<receiver

            android:name=".BootCompleteReceiver"  

            android:enabled="true"

            android:exported="true">

            <intent-filter>

                <action android:name="android.intent.action.BOOT_COMPLETED" />

            </intent-filter>

        </receiver>

上面的黑体字
因为安卓系统启动完成之后会发出一条值为android.intent.action.BOOT_COMPLETED的广播,因此我们需要在 <intent-filter>标签里面添加相应的action。


并且监听系统开机广播也是需要声明权限的即:   <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

3)发送自定义广播

在应用程序中发送自定义广播。广播有两种类型:标准广播和有序广播

3.1)发送标准广播

发送广播之前首先定义一个广播接收器来准备接收这个广播。新建一个MyBroadcastReceiver代码如下

public class MyBroadcastReceiver extends BroadcastReceiver {

    @Override

public void onReceive(Context context, Intent intent) {

/*

     当MyBroadcastReceiver收到自定义广播的时候,就会弹出"received in MyBroadcastReceiver"这一信息

*/

        Toast.makeText(context, "received in MyBroadcastReceiver", Toast.LENGTH_SHORT).show();

        abortBroadcast();

    }

}

然后在AndroidManifest.xml中对这个广播接收器进行修改:

 <receiver

            android:name=".MyBroadcastReceiver"

            android:enabled="true"

            android:exported="true">

            <intent-filter android:priority="100">

                <action android:name="com.example.broadcasttest.MY_BROADCAST"/>

            </intent-filter>

        </receiver>

注意黑体字,让MyBroadcastReceiver接收一条值为 om.example.broadcasttest.MY_BROADCAST 的广播,待会再发送广播的时候,我们需要发出这样一条广播。

接下来修改activity_main.xml里面的代码,如下所示:

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:orientation="vertical"

    android:layout_width="match_parent"

    android:layout_height="match_parent" >

    <Button

        android:id="@+id/button"

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:text="Send Broadcast"

        />

</LinearLayout>

布局中添加了一个按钮,用于作为发送广播的触发点。修改MainActivity里面的代码

 @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        Button button = (Button) findViewById(R.id.button);

        button.setOnClickListener(new View.OnClickListener() {

            @Override

            public void onClick(View v) {

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

                sendBroadcast(intent);

            }

        });

}

在点击事件中加入发送自定义广播的逻辑。首先构造出一个Intent的对象,并把要发送的广播的值传入,然后调用了Context的sendBroadcast()方法将广播发送出去,所有监听此com.example.broadcasttest.MY_BROADCAST广播的广播接收器就会接受到消息。并且还可以在Intent中携带一些数据传递给广播接收器

3.2)发送有序广播

新建一个BroadTest2的项目,在项目中定义一个广播接收器,用于接收上节中的自定义广播。新建AnotherBroastcastReceiver,代码如下:

public class AnotherBroadcastReceiver extends BroadcastReceiver {

    @Override

    public void onReceive(Context context, Intent intent) {

        Toast.makeText(context, "received in AnotherBroadcastReceiver",

                Toast.LENGTH_SHORT).show();

    }

}

跟标准广播一样,仍然是在广播接收器的onReceive()方法中弹出了一段基本信息。然后在AndroidManifest.xml中对广播接收器进行修改

<receiver

            android:name=".AnotherBroadcastReceiver"

            android:enabled="true"

            android:exported="true">

            <intent-filter>

                <action android:name="com.example.broadcasttest.MY_BROADCAST" />

            </intent-filter>

        </receiver>

从粗体字中可以看到,AnotherBroadcastReceiver同样接收com.example.broadcasttest.MY_BROADCAST这条广播

回到BroastcastTest项目在MainActivity 添加以下代码

button.setOnClickListener(new View.OnClickListener() {

            @Override

            public void onClick(View v) {

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

                sendOrderdBroadcast(intent,null);//改动的地方

            }

        });

跟标准广播之间区别
: 1)有序广播将标准广播中的sendBroascast()方法改成sendOrderedBroadcast()方法。此方法接收两个参数 一个是 Intent 另一个是 与权限相关的字符串,这里传入 null。


                 2)使用有序广播,广播接收器有先后顺序(而且前面的广播还可以将广播截断,阻止其继续传播)-----设定广播优先级

即 <receiver

            android:name=".AnotherBroadcastReceiver"

            android:enabled="true"

            android:exported="true">

            <intent-filter android:priority="100">  通过android:priority属性将优先级设为100

                <action android:name="com.example.broadcasttest.MY_BROADCAST" />

            </intent-filter>

        </receiver>

3.3)本地广播接收器跟上面的一样 不过使用LocalBroadcastManager来对广播进行管理,并提供发送广播和注册广播接收器的方法

4)实现强制下线的功能

(源代码:http://blog.csdn.net/error/404.html?from=http%3a%2f%2fblog.csdn.net%2fqq_27262727%2farticle%2fdetails%2f64929989)

 或者到我博客里面学习
http://blog.csdn.net/qq_27262727
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: