zoukankan      html  css  js  c++  java
  • 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发送短信到模拟器

  • 相关阅读:
    OSG-提示“error reading file e:1.jpg file not handled”
    OSG-加载地球文件报0x00000005错误,提示error reading file simple.earth file not handled
    QT-找开工程后,最上方提示the code model could not parse an included file, which might lead to incorrect code completion and highlighting, for example.
    我的书《Unity3D动作游戏开发实战》出版了
    java中无符号类型的第三方库jOOU
    Windows批处理备份mysql数据
    使用 DevTools 时,通用Mapper经常会出现 class x.x.A cannot be cast to x.x.A
    Java版本,Java版本MongoDB驱动,驱动与MongoDB数据库,Spring之间的兼容性
    Jrebel本地激活方法
    wget下载指定网站目录下的所有内容
  • 原文地址:https://www.cnblogs.com/qadada/p/4515290.html
Copyright © 2011-2022 走看看