美文网首页
Android基础(5)BroadcastReceiver

Android基础(5)BroadcastReceiver

作者: perry_Fan | 来源:发表于2019-02-19 19:28 被阅读0次

1)请描述一下广播BroadcastReceiver的理解
2)广播的分类
3)广播使用的方式和场景
4)在manifest 和代码中如何注册和使用BroadcastReceiver?
5)本地广播和全局广播有什么差别?(应用内和应用外)
6)如何通过广播拦截和abort一条短信?
7)广播是否可以请求网络?

一.理解:

用于监听(接收)应用发出的广播消息,并做出响应

二. 分类:

普通、系统、有序、本地、粘性广播。

三. 方式:
  1. 自定义广播接收者BroadcastReceiver子类,并复写onRecvice()方法;
  2. 通过Binder机制向AMS(Activity Manager Service)进行注册; 分为静态和动态。
  3. 广播发送者通过Binder机制向AMS发送广播;
  4. AMS查找符合相应条件(IntentFilter/Permission等)的BroadcastReceiver,将广播发送到
  5. BroadcastReceiver(一般情况下是Activity)相应的消息循环队列中;
  6. 消息循环执行拿到此广播,回调BroadcastReceiver中的onReceive()方法。

场景:

四. 动态与静态
@Override
  protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);

    //实例化BroadcastReceiver子类 &  IntentFilter
     mBroadcastReceiver mBroadcastReceiver = new mBroadcastReceiver();
     IntentFilter intentFilter = new IntentFilter();

    //设置接收广播的类型
     intentFilter.addAction(android.net.conn.CONNECTIVITY_CHANGE);

    //调用Context的registerReceiver()方法进行动态注册
     registerReceiver(mBroadcastReceiver, intentFilter);
 }
<receiver 
    //此广播接收者类是mBroadcastReceiver
    android:name=".mBroadcastReceiver" >
    //用于接收网络状态改变时发出的广播
    <intent-filter>
        <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
    </intent-filter>
</receiver>
六. 如何通过广播拦截和abort一条短信?
public class SmsReceiver extends BroadcastReceiver {
        // 当接收到短信时被触发
        @Override
        public void onReceive(Context context, Intent intent) {
            // 如果是接收到短信
            if (intent.getAction().equals("android.provider.Telephony.SMS_RECEIVED")) {
                // 取消广播(这行代码将会让系统收不到短信)
                abortBroadcast();
                StringBuilder sb = new StringBuilder();
                // 接收由SMS传过来的数据
                Bundle bundle = intent.getExtras();
                // 判断是否有数据
                if (bundle != null) {
                    // 通过pdus可以获得接收到的所有短信消息
                    Object[] pdus = (Object[]) bundle.get("pdus");
                    // 构建短信对象array,并依据收到的对象长度来创建array的大小
                    SmsMessage[] messages = new SmsMessage[pdus.length];
                    for (int i = 0; i < pdus.length; i++) {
                        messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
                    }
                    // 将送来的短信合并自定义信息于StringBuilder当中
                    for (SmsMessage message : messages) {
                        sb.append("短信来源:");
                        // 获得接收短信的电话号码
                        sb.append(message.getDisplayOriginatingAddress());
                        sb.append("\n------短信内容------\n");
                        // 获得短信的内容
                        sb.append(message.getDisplayMessageBody());
                    }
                }
                Toast.makeText(context, sb.toString(), 5000).show();
            }
        }
    }

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="wuchen.broadcastReceiver"
    android:versionCode="1"
    android:versionName="1.0" >

    <application
        android:icon="@drawable/icon"
        android:label="@string/app_name" >

        <receiver android:name=".SmsReceiver" >

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

                <action android:name="android.provider.Telephony.SMS_RECEIVED" />
            </intent-filter>
        </receiver>
    </application>
    <!-- 授予程序接收短信的权限 -->

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

</manifest>
七. 广播中可以打开网络?

需要单开子线程否则容易导致ANR 。 Broadcast 10s

相关文章

网友评论

      本文标题:Android基础(5)BroadcastReceiver

      本文链接:https://www.haomeiwen.com/subject/lmjmeqtx.html