美文网首页
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