Android基础(5)BroadcastReceiver

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);
 }

    //用于接收网络状态改变时发出的广播
    
        
    

六. 如何通过广播拦截和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();
            }
        }
    }




    

        

            

                
            
        
    
    

    


七. 广播中可以打开网络?

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

你可能感兴趣的:(Android基础(5)BroadcastReceiver)