• Android学习笔记(广播机制)


    1.Android的广播机制介绍

         收听收音机也是一种广播,在收音机中有很多个广播电台,每个广播电台播放的内容都不相同。接受广播时广播(发送方)并不在意我们(接收方)接收到广播时如何处理。好比我们收听交通电台的广播,电台中告诉我们现在在交通状况如何,但它并不关心我们接收到广播时做如何做出处理,这不是广播应该关心的问题,OK,到这里我们从生活中的一些小例子浅浅的理解了一下广播,那么Android 中的广播是如何操作的呢?
         在 Android 里面有各种各样的广播,比如电池的使用状态,电话的接收和短信的接收都会产生一个广播,应用程序开发者也可以监听这些广播并做出程序逻辑的处理。
          一个经典的电话黑名单,首先通过将黑名单号码保存在数据库里面,当来电时,我们接收到来电广播并将黑名单号码与数据库中的某个数据做匹配,如果匹配的话则做出相应的处理,比如挂掉电话、比如静音等等

    2.BroadcaseReceiver的作用

      1.同一app内部的同一组件内的消息通信(单个或多个线程之间);
      2.同一app内部的不同组件之间的消息通信(单个进程);
      3.同一app具有多个进程的不同组件之间的消息通信;
      4.不同app之间的组件之间消息通信;
      5.Android系统在特定情况下与App之间的消息通信。

    3.BroadcaseRecevier的实现方法

       1.创建一个类,继承BroadcastRecevier,并重写onRecevier()方法,onRecevier方法为接收到监听事件的回调方法

    package com.example.broadcasereceiverdemo;
    
    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    
    public class TestReceiver extends BroadcastReceiver{
    
        public TestReceiver(){
            System.out.println("TestReceiver create");
        }
        @Override
        public void onReceive(Context context, Intent intent) {
            // TODO Auto-generated method stub
            System.out.println("onReceive///");
        }
    
    }

      2.注册广播

          注册广播有两种方法

            1.在AndroidManifrst.xml文件中注册     

                 说明:创建一个receiver标签,intentfilter,设置接听的事件类型,Android:name:类名,Intent-filter:用来过滤发送的广播事件,只有符合里面的action的事件,才会被接收处理
                 例如:监听电池状态,就需要使用这样的方法进行注册

            2.在程序代码中进行注册

               注册方法比较灵活,当想使用的时候进行注册,不使用的时候进行关闭方法
              1.registerReceiver(receiver,filter);注册, reciver对象,过滤的事件
              2.unregisterReceiver(receiver);取消注册, reciver对象
              如果一个BroadcaseReceiver用于更新UI,那么通常会使用这样的方法,在启动的时候进行注册,在不可见的时候进行取消注册

    // TODO Auto-generated method stub
    //1.创建一个广播接收器对象
    TestBroadcastRecevier test = new TestBroadcastRecevier();
    //2.创建一个Intent-filter
    IntentFilter filter = new IntentFilter();
    //3.为Intent-Filter添加Action
    filter.addAction("android.provider.Telephony.SMS_RECEIVED");
    //4.注册广播接收器
    MainActivity.this.registerReceiver(test, filter);

    4. Android内置的BroadcaseAction

    5.练习例子

     1.在Activity中发出广播

       1.定义一个类,继承BroadcastRecevier,重新onRecevier方法

    package com.example.broadcastrecevierdemo;
    
    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    
    public class TestBroadcastRecevier extends BroadcastReceiver {
    
        public TestBroadcastRecevier(){
            System.out.println("TestBroadcastRecevier 对象创建");
        }
        @Override
        public void onReceive(Context arg0, Intent arg1) {
            // TODO Auto-generated method stub
            System.out.println("onReceiver");
        }
        
    }

        2.注册广播

    <application
            android:allowBackup="true"
            android:icon="@drawable/ic_launcher"
            android:label="@string/app_name"
            android:theme="@style/AppTheme" >
            <activity
                android:name=".MainActivity"
                android:label="@string/app_name" >
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
            <!-- 注册广播监听器 -->
            <receiver android:name=".TestBroadcastRecevier">
                <intent-filter>
                    <action android:name="android.inent.action.EDIT"/>
                </intent-filter>
            </receiver>
        </application>

       3.发送广播事件

    protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            sendBtn = (Button) findViewById(R.id.sendBtn);
            sendBtn.setOnClickListener(new OnClickListener() {
                
                @Override
                public void onClick(View arg0) {
                    // TODO Auto-generated method stub
                    Intent intent = new Intent();
                    intent.setAction(Intent.ACTION_EDIT);
                    MainActivity.this.sendBroadcast(intent);
                }
            });
        }

       点击按钮,程序运行结果

    声明周期说明:从上面的Demo中可以看出,点击一次调用一次构造方法,然后调用onReceive方法,可知道当处理完成之后,广播接收器对象就会失效,下次再次调用,重新创建对象

     2.接收系统广播

      1.定义一个类,继承BroadcastRecevier,重新onRecevier方法,并实现短信内容的接收

    public class TestBroadcastRecevier extends BroadcastReceiver{
    
        @Override
        public void onReceive(Context context, Intent intent) {
            // TODO Auto-generated method stub
            System.out.println("xx");
            //接收参数
            Bundle bundle = intent.getExtras();
            Object[] obj = (Object[]) bundle.get("pdus");
            SmsMessage[] message = new SmsMessage[obj.length];
            System.out.println(message.length);
            for(int i=0 ; i<obj.length ; i++){
                message[i]  = SmsMessage.createFromPdu((byte[])obj[i]);
                System.out.println(message[i].getDisplayMessageBody());
                Toast.makeText(context, message[i].getDisplayMessageBody(), Toast.LENGTH_SHORT).show();
            }
        }
    
    }

     2.绑定广播接收类的监听代码

        /**
         * 绑定广播事件处理
         * @author Administrator
         *
         */
        class MyRegistClick implements OnClickListener{
    
            @Override
            public void onClick(View arg0) {
                // TODO Auto-generated method stub
                //1.创建一个广播接收器对象
                test = new TestBroadcastRecevier();
                //2.创建一个Intent-filter
                IntentFilter filter = new IntentFilter();
                //3.为Intent-Filter添加Action
                filter.addAction(SMS_ACTION);
                //4.注册广播接收器
                MainActivity.this.registerReceiver(test, filter);
                Toast.makeText(MainActivity.this, "绑定成功", Toast.LENGTH_SHORT).show();
            }
            
        }

       解除绑定的点击事件监听代码

    /**
         * 解除广播
         * @author Administrator
         *
         */
        class MyUnRegistClick implements OnClickListener{
    
            @Override
            public void onClick(View arg0) {
                // TODO Auto-generated method stub
                MainActivity.this.unregisterReceiver(test);
                Toast.makeText(MainActivity.this, "解除绑定成功", Toast.LENGTH_SHORT).show();
            }
            
        }

     3.增加接收短信权限

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.broadcastreciverdemo"
        android:versionCode="1"
        android:versionName="1.0" >
    
        <uses-sdk
            android:minSdkVersion="14"
            android:targetSdkVersion="14" />
        <uses-permission android:name="android.permission.RECEIVE_SMS"/>
        <application
            android:allowBackup="true"
            android:icon="@drawable/ic_launcher"
            android:label="@string/app_name"
            android:theme="@style/AppTheme" >
            <activity
                android:name=".MainActivity"
                android:label="@string/app_name" >
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
        </application>
    
    </manifest>


    4.使用Emalator Controller实现Eclipse发送短信到模拟器

  • 相关阅读:
    ~随笔A016~分布式技术发展
    BoF图像检索
    立体匹配-----NCC视差匹配
    对极几何与基础矩阵
    相机标定
    图像的拼接----RANSAC算法
    SIFT特征提取与检索
    Harris角点检测
    Python---图像基础处理
    PSO算法
  • 原文地址:https://www.cnblogs.com/qadada/p/4515290.html
Copyright © 2020-2023  润新知