• Android 学习 笔记_08. 广播机制


    1、广播机制

       (1、广播接收者在Android中注册

       (2、当一个事件产生后,它可以发送一个广播信息,然后这些接收者来接收这些信息

       (3、广播接收者的实现一般是写成一个类,该类继承Android提供的类BroadcastReceiver,并且复写该类的onCreate方法,在该方法中实现接收到信息后的处理过程

    2、实例

        例1:采用在 Mainifest.xml文件中注册BroadcastReceiver

               首先在发送端Main.java建立一个intent,然后通过它的setAction方法设置接收器的action类型,

               最后在activity中启动broadcast,即sendBroadcast(intent)函数

                              

       TestReceiver.java

     1 package zzl.broadcast_01;
     2 
     3 import android.content.BroadcastReceiver;
     4 import android.content.Context;
     5 import android.content.Intent;
     6 
     7 public class TestReceiver extends BroadcastReceiver{
     8     
     9     public TestReceiver()
    10     {
    11         System.out.println("TestReceiver");
    12         
    13     }
    14     @Override
    15     public void onReceive(Context arg0, Intent arg1) {
    16         System.out.println("OnReceiver");
    17         
    18     }
    19 }

        Main.java

     1 package zzl.broadcast_01;
     2 
     3 import android.app.Activity;
     4 import android.content.Intent;
     5 import android.os.Bundle;
     6 import android.view.Menu;
     7 import android.view.View;
     8 import android.view.View.OnClickListener;
     9 import android.widget.Button;
    10 
    11 public class Main extends Activity {
    12 
    13     private Button insert = null;
    14     @Override
    15     protected void onCreate(Bundle savedInstanceState) {
    16         super.onCreate(savedInstanceState);
    17         setContentView(R.layout.activity_main);
    18         
    19         insert=(Button)findViewById(R.id.insert);
    20         insert.setOnClickListener(new MyStartOnClickListener());
    21     }
    22     public class MyStartOnClickListener implements OnClickListener
    23     {
    24 
    25         public void onClick(View arg0) {
    26             // TODO Auto-generated method stub
    27             
    28             //采用intent发送数据
    29             Intent intent = new Intent();
    30             //只发送给action为ACTION_EDIT的对象,对应Manifest中的action
    31             intent.setAction(Intent.ACTION_EDIT);
    32             //*通过广播方式发送该intent,只有特定action的接收者才能收到该广播信息*/
    33             Main.this.sendBroadcast(intent);
    34         }
    35     }
    36     @Override
    37     public boolean onCreateOptionsMenu(Menu menu) {
    38         // Inflate the menu; this adds items to the action bar if it is present.
    39         getMenuInflater().inflate(R.menu.activity_main, menu);
    40         return true;
    41     }
    42 
    43 }

    结果:

       

    3、实例1总结

         需要在Android中注册,也就是说在Manifest中,需要在<application/>中有这样的代码:

    1        <receiver 
    2             android:name=".TestReceiver">
    3             <intent-filter>
    4                 <action android:name="android.intent.action.EDIT"/>
    5             </intent-filter>
    6         </receiver>

    4、实例2

          (1、 BroadcastReceive用于监听被广播的事件(intent),为此它必须进行注册,与例子1中在Manifest.xml当中进行注册的注册方法不同,

    例子2将引入第二种方法,在应用程序的代码中进行注册。在例1中,如果应用程序已经关闭,BroadcastReceive都会处于活动状态,都会接收到广播信息。这个就需要各取所需

    了。

          (2、如果一个BroadcastReceive用于更新UI,则采用在代码中进行注册:Activity启动时注册,关闭时取消注册。

               【注册】 registerReceiver(receiver ,filter) ; 【取消注册】 unregisterRecevier(receiver);

                            

    MainActivity.java

     1 package zzl.broadcast_02;
     2 
     3 import android.app.Activity;
     4 import android.content.IntentFilter;
     5 import android.os.Bundle;
     6 import android.view.Menu;
     7 import android.view.View;
     8 import android.view.View.OnClickListener;
     9 import android.widget.Button;
    10 
    11 public class MainActivity extends Activity {
    12 
    13     private Button registe=null;
    14     private Button unregiste=null;
    15     private SMSReceiver smsReceiver=null;
    16     private static final String SMS_ACTION="android.provider.Telephony.SMS_RECEIVED";
    17     @Override
    18     protected void onCreate(Bundle savedInstanceState) {
    19         super.onCreate(savedInstanceState);
    20         setContentView(R.layout.activity_main);
    21         
    22         registe=(Button)findViewById(R.id.regiest);
    23         unregiste=(Button)findViewById(R.id.unregiest);
    24         
    25         registe.setOnClickListener(new RegisterRecevierListener());
    26         unregiste.setOnClickListener(new UnRegisterRecevierListener());
    27     }
    28 
    29     class RegisterRecevierListener implements OnClickListener{
    30 
    31         @Override
    32         public void onClick(View v) {
    33             // TODO Auto-generated method stub
    34             /* 1、生成一个BroadcastRecevier对象
    35              * 2、生成一个intentFilter对象(和Manifest中的Filter)
    36              * 3、为IntentFilter添加一个Action:SMS_ACTION
    37              * (只有filter中的action和intent中的action一样)
    38              * 4、将BroadcastRecevier对象注册到系统当中
    39              * */
    40             smsReceiver =new SMSReceiver();
    41             IntentFilter filter=new IntentFilter();
    42             filter.addAction(SMS_ACTION);
    43             MainActivity.this.registerReceiver(smsReceiver,filter);
    44             System.out.println("promise to receive message");
    45         }
    46     }
    47     class UnRegisterRecevierListener implements OnClickListener{
    48 
    49         @Override
    50         public void onClick(View v) {
    51             // TODO Auto-generated method stub
    52             //解除BroadcastRecevier对象注册
    53             MainActivity.this.unregisterReceiver(smsReceiver);
    54             System.out.println("unpromise to receive message");
    55         }
    56     }
    57     
    58     
    59     @Override
    60     public boolean onCreateOptionsMenu(Menu menu) {
    61         // Inflate the menu; this adds items to the action bar if it is present.
    62         getMenuInflater().inflate(R.menu.activity_main, menu);
    63         return true;
    64     }
    65 
    66 }

    SMSReceiver.java

     1 package zzl.broadcast_02;
     2 
     3 import android.content.BroadcastReceiver;
     4 import android.content.Context;
     5 import android.content.Intent;
     6 import android.os.Bundle;
     7 import android.telephony.SmsMessage;
     8 
     9 
    10 public class SMSReceiver extends BroadcastReceiver{
    11 
    12     @Override
    13     public void onReceive(Context context, Intent intent) {
    14         // TODO Auto-generated method stub
    15         System.out.println("receive message");
    16         
    17         //通过intent获得bundle对象中的数据
    18         Bundle bundle = intent.getExtras();
    19         //在bundle对象中有个名为“pdus”的属性,这个属性的值是object数组
    20         Object[] myOBJpdus = (Object[])bundle.get("pdus");
    21         //新建一个SmsMessage数组:用于存储消息内容的
    22         SmsMessage[] messages = new SmsMessage[myOBJpdus.length];
    23         System.out.println(messages.length);
    24         for(int i = 0; i < messages.length; i++)
    25         {
    26             //使用object数组当中的对象创建SmsMessage对象:
    27             messages[i] = SmsMessage.createFromPdu((byte[])myOBJpdus[i]);
    28             //调用SmsMessage对象的getDisplayMessageBody()方法,就可以得到消息的内容
    29             System.out.println(messages[i].getDisplayMessageBody());
    30         }
    31     }
    32 }

    结果:

                                

     5、实例2总结

         (1、 设置的action过滤为"android.provider.Telephony.SMS_RECEIVED",即只有具备该action的广播接收器才能给接收到短信。

         (2、 发送短信采用的是DDMS来模拟的,即该短信的发送是由另外的程序执行的。

               DDMS发送出来的短信息是通过intent发送的,intent里面就自带了名为"android.provider.Telephony.SMS_RECEIVED"的action。

                   

         (3、要使自己写的android程序能够收到短信息来临的广播,则不管是在应用程序中注册broadcastReceiver还是在Manifest.xml中注册,

              在manifest.xml文件中必须添加一句代码:

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

              并且该代码是和application平级的,也就是说是manifest的直接子标签.如果没有改句,即使程序中注册过广播接收,同样也收不到短信的。

             一开始没有意识到这个问题,导致程序在测试过程中,出现了bug,百度过后才找到原因,以此为戒。

  • 相关阅读:
    hdu 2089 不要62(数位dp)
    hdu 3555 Bomb(数位dp)
    hdu 4544 湫湫系列故事——消灭兔子(优先队列)
    STL Algorithms 之 unique
    hdu 1075 What Are You Talking About(map)
    hdu 4268 Alice and Bob(贪心+multiset)
    hdu 4302 Holedox Eating(优先队列/线段树)
    9-16Jenkins-4节点
    9-16Jenkins-3可用的环境变量、参数化构建和依赖
    9-16Jenkins-2定时任务
  • 原文地址:https://www.cnblogs.com/daomul/p/2935960.html
Copyright © 2020-2023  润新知