Broadcast Receiver

概述:
是一种在应用程序之间传输信息的机制。
过程:
1.在发送消息处,用Intent包装发送的信息和用于过滤的消息;
2.调用Context.sendBroadcast()、sendOrderBroadcast()或sendStickyBroadcast()方法,把Intent对象以广播方式发送出去;
3.Intent发送后,所有已注册的BroadcastReceiver会检查注册时的IntentFiter是否与发送的Intent相匹配,如果匹配则调用onReceiver()方法。
注册的两种方式:
1.静态注册:在AndroidManifest.xml用标签注册,并设置过滤器。在程序未启动的情况下就能接收到广播,可实现开机启动。

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<receiver android:name=".BootCompleteReceiver" >
            <intent-filter >
                <action android:name="android.intent.action.BOOT_COMPLETED" />
            </intent-filter>
        </receiver>
public class BootCompleteReceiver extends BroadcastReceiver{

    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context, "Boot Complete", Toast.LENGTH_LONG).show();

    }

}

动态注册:在代码中注册
1.代码中预先设置好一个IntentFilter对象;
2.在需要注册的地方调用Context.registReceiver()方法,取消注册调用Context.unregisterReceiver()方法。Context对象被销毁时,BroadcastReceiver也自动取消注册。
代码示例(第一行代码):

public class MainActivity extends Activity {
    private IntentFilter intentFilter;
    private NetworkChangeReceiver networkChangeReceiver ;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button button = (Button) findViewById(R.id.button);
        button.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                Intent intent = new Intent("com.wangweiwei.java.MY_BROADCAST");
                sendOrderedBroadcast(intent, null);

            }
        });
        intentFilter = new IntentFilter();
        intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
        networkChangeReceiver = new NetworkChangeReceiver();
        registerReceiver(networkChangeReceiver, intentFilter);
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(networkChangeReceiver);

    }

    // 网络改变监听
    class NetworkChangeReceiver 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(context, "网络可用", Toast.LENGTH_SHORT).show();
            } else {
                Toast.makeText(context, "网络不可用",Toast.LENGTH_SHORT ).show();

            }
        }       
    }
}

加入权限:

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

应用场景:
多数广播由系统发起,如电量不足、来电来信等。
Broadcast Receiver可以通过多种方式通知用户:启动Activity、使用通知、打开LED灯、震动、铃声等。
发送自定义标准广播:

public class MyBroadcastReceiver extends BroadcastReceiver{

    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context, "received in MyBroadcastReceiver", Toast.LENGTH_SHORT).show();
        abortBroadcast();// 截断广播
    }
}
<receiver android:name=".MyBroadcastReceiver" >
            <intent-filter android:priority="100">
                <action android:name="com.wangweiwei.java.MY_BROADCAST" />
            </intent-filter>
        </receiver>

在MainActovity中发送:

@Override
            public void onClick(View v) {
                Intent intent = new Intent("com.wangweiwei.java.MY_BROADCAST");
                sendBroadcast(intent);

            }

发送有序广播:同步执行的广播,有先后顺序,依次传递
只需改动一行代码:

@Override
            public void onClick(View v) {
                Intent intent = new Intent("com.wangweiwei.java.MY_BROADCAST");
                // sendBroadcast(intent);
                sendOrderedBroadcast(intent, null);

            }

使用本地广播:可简单的解决广播的安全性问题。

public class LocalBroadcast extends Activity {
    private IntentFilter intentFilter;
    private LocalReceiver localReceiver;
    private LocalBroadcastManager localBroadcastManager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 获取实例
        localBroadcastManager = LocalBroadcastManager.getInstance(this);

        Button button = (Button) findViewById(R.id.button);
        button.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                Intent intent = new Intent("com.wangweiwei.java.LOCAL_BROADCAST");
                // 发送本地广播
                localBroadcastManager.sendBroadcast(intent);
            }
        });
        intentFilter = new IntentFilter();
        intentFilter.addAction("com.wangweiwei.java.LOCAL_BROADCAST");
        localReceiver = new LocalReceiver();
        // 注册本地广播监听器
        localBroadcastManager.registerReceiver(localReceiver, intentFilter);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(localReceiver);

    }

    // 本地广播
    class LocalReceiver extends BroadcastReceiver {

        @Override
        public void onReceive(Context context, Intent intent) {

            Toast.makeText(context, "received local broadcast", Toast.LENGTH_SHORT).show();

        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值