zoukankan      html  css  js  c++  java
  • AndroidBroadcast详解与汇总

    一、广播的实现

    1、监听短信的广播

    public class SmsBroadcastReceiver extends BroadcastReceiver{
    
    
        @Override
        public void onReceive(Context context, Intent intent) {
            Object[] pdus=(Object[])intent.getExtras().get("pdus");
            
            for(Object pdu:pdus)
            {
                byte[] date=(byte[])pdu;
                SmsMessage message=SmsMessage.createFromPdu(date);
                
                String sender=message.getOriginatingAddress();
                String body=message.getMessageBody();
                
                if(sender.equals(AppUtil.herPhone)&&body.regionMatches(0, AppUtil.herSmsText, 0, 18))
                {
                    //Toast.makeText(context, body, Toast.LENGTH_LONG).show();
                    String [] bodyArray=body.split(" ");
                    String longitude=bodyArray[3];
                    String latitude=bodyArray[4];
                    
                    Intent uiIntent=new Intent();
                    Bundle bundle=new Bundle();
                    bundle.putString("longitude", longitude);
                    bundle.putString("latitude", latitude);
                    
                    uiIntent.putExtras(bundle);
                    uiIntent.setAction("android.janmac.location");
                    Log.v("bundle", uiIntent.getExtras().getString("longitude"));
                    context.sendBroadcast(uiIntent);
                    
                    abortBroadcast();
                    
                }
            }
            
        }
    
    }

     

     

    2、嵌套在Activity内的广播实现,多用在更新Activity的UI界面。

    private  class UIReceiver extends BroadcastReceiver
        {
    
            @Override
            public void onReceive(Context context, Intent intent) {
                Log.v("location","uireceiver接受成功!");
                
                Bundle bundle=new Bundle();
                bundle=intent.getExtras();
                herLongitude=Double.valueOf(bundle.getString("longitude"));
                herLatitude=Double.valueOf(bundle.getString("latitude"));
                
                HerLocationInit();
                button.setText("获取成功!");
            }
            
        }

    二、注册广播接收

    1、静态注册

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

    <receiver android:name=".SmsBroadcastReceiver">
    <intent-filter android:priority="1000">
    <action android:name="android.provider.Telephony.SMS_RECEIVED"></action>
    </intent-filter>
    </receiver>

    2、动态注册

    uiReceiver=new UIReceiver();
    IntentFilter filter=new IntentFilter();
    filter.addAction("android.janmac.location");
    registerReceiver(uiReceiver, filter);

    三、发送广播

      

      首先在需要发送信息的地方,把要发送的信息和用于过滤的信息(如Action、Category)装入一个Intent对象,然后通过调用Context.sendBroadcast()、sendOrderBroadcast()或sendStickyBroadcast()方法,把 Intent对象以广播方式发送出去。 
         

      当Intent发送以后,所有已经注册的BroadcastReceiver会检查注册时的IntentFilter是否与发送的Intent相匹配,若 匹配则就会调用BroadcastReceiver的onReceive()方法。所以当我们定义一个BroadcastReceiver的时候,都需要实现onReceive()方法。 

    Intent uiIntent=new Intent();
    Bundle bundle=new Bundle();
    bundle.putString("longitude", longitude);
    bundle.putString("latitude", latitude);

    uiIntent.putExtras(bundle);
    uiIntent.setAction("android.janmac.location");
    Log.v("bundle", uiIntent.getExtras().getString("longitude"));
    context.sendBroadcast(uiIntent);

    四、怎么用好 BroadcastReceiver ?

    每次广播到来时,会重新创建 BroadcastReceiver 对象,并且调用 onReceive() 方法 , 执行完以后,该对象即被销毁。当 onReceive() 方法在 10 秒内没有执行完毕, Android 会认为该程序无响应。所以在BroadcastReceiver 里不能做一些比较耗时的操作 , 否侧会弹出 ANR(Application NoResponse) 的对话框。

    如果需要完成一项比较耗时的工作, 应该通过发送 Intent 给 Service, 由 Service 来完成。这里不能使用子线程来解决,因为 BroadcastReceiver 的生命周期很短 , 子线程可能还没有结束BroadcastReceiver 就先结束了。

    BroadcastReceiver 一旦结束,此时 BroadcastReceiver 的所在进程很容易在系统需要内存时被优先杀死,因为它属于空进程 ( 没有任何活动组件的进程 )。 如果它的宿主进程被杀死,那么正在工作的子线程也会被杀死。所以采用子线程来解决是不可靠的。

    五、其他

    Service通过广播Broadcast更新Activity UI

    http://www.eoeandroid.com/thread-68005-1-1.html

    关于有序广播等其他方面-Android 中的BroadCastReceiver

    http://yangguangfu.iteye.com/blog/1063732

  • 相关阅读:
    可惜老板不看程序员写的书
    《让僵冷的翅膀飞起来》系列之四——Visitor模式之可行与不可爱
    《让僵冷的翅膀飞起来》系列之二——从实例谈Adapter模式
    策略模式的应用实践
    《让僵冷的翅膀飞起来》系列之三——从Adapter模式到Decorator模式
    用Design+Blend轻松制作环形文字
    silverlight3的"伪"3D续图片横向轮换
    silverlight.net官方网站图片切换源码
    css2.1中的属性选择器(css高手请绕道)
    多线程中的ManualResetEvent
  • 原文地址:https://www.cnblogs.com/TseChiHoi/p/2665658.html
Copyright © 2011-2022 走看看