• Android中BroadcastReceiver广播


    BroadCastReceiver 简介

    广播接收者( BroadcastReceiver )用于接收广播 Intent ,广播 Intent 的发送是通过调用 Context.sendBroadcast() 、 Context.sendOrderedBroadcast() 来实现的。通常一个广播 Intent 可以被订阅了此 Intent 的多个广播接收者所接收。 

    广播是一种广泛运用的在应用程序之间传输信息的机制 。而 BroadcastReceiver 是对发送出来的广播进行过滤接收并响应的一类组件; 

    来自普通应用程序,如一个应用程序通知其他应用程序某些数据已经下载完毕。

     BroadcastReceiver 自身并不实现图形用户界面,但是当它收到某个通知后, BroadcastReceiver 可以启动 Activity 作为响应,或者通过 NotificationMananger 提醒用户,或者启动 Service 等等。

    生命周期

        一个BroadcastReceiver 对象只有在被调用onReceive(Context, Intent)的才有效的,当从该函数返回后,该对象就无效的了,结束生命周期。
        因此从这个特征可以看出,在所调用的onReceive(Context, Intent)函数里,不能有过于耗时的操作,不能使用线程来执行。对于耗时的操作,请start service来完成。因为当得到其他异步操作所返回的结果时,BroadcastReceiver 可能已经无效了。
     
    使用BroadcastReceiver

    编写类继承BroadcastReceiver,复写onReceiver()方法

    package com.example.receive;

    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    import android.util.Log;

    public class MyReceivceReg extends BroadcastReceiver {

    private static final String TAG = "MyReceivce";

    public MyReceivceReg(){
    Log.i(TAG,"MyReceivceReg");

    }
    @Override
    public void onReceive(Context context, Intent intent) {
    Log.i(TAG,"onReceiveReg");
    }

    }

    在Manifest.xml中注册BroadcastReceiver
    <receiver android:name="com.example.receive.MyReceivce">
                <intent-filter >
                    <action android:name="android.provider.Telephony.SMS_RECEIVED"/>
                </intent-filter>
            </receiver>

    要接收某些action,需要在AndroidManifest.xml里面添加相应的permission。例如接收SMS:

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

    界面:

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
            android:orientation="vertical"
        tools:context=".AndroidBroadcastServiceActivity" >
    
        <Button
            android:id="@+id/btnStartBroad"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="启动Broadservice"
             >
        </Button>
          
         <Button
            android:id="@+id/btnRegisterBroad"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="注册RegisterBroad"
             >
        </Button>
        
          <Button
            android:id="@+id/btnUnRegisterBroad"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="取消RegisterBroad"
             >
        </Button>
    
    </LinearLayout>

    构建Intent,发送

    package com.example.androidbroadcastservice;
    
    import com.example.receive.MyReceivceReg;
    
    import android.os.Bundle;
    import android.app.Activity;
    import android.content.Intent;
    import android.content.IntentFilter;
    import android.view.Menu;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    
    public class AndroidBroadcastServiceActivity extends Activity {
        protected static final String ACTION = "android.provider.Telephony.SMS_RECEIVED";//广播类型。其实是对应Manifest.xml中<action android:name="android.provider.Telephony.SMS_RECEIVED"/>
        private Button btnStartBroad,btnRegisterBroad,btnUnRegisterBroad;
        private MyReceivceReg receivece;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_android_broadcast_service);
            btnStartBroad = (Button) this.findViewById(R.id.btnStartBroad);
            btnStartBroad.setOnClickListener(onclick);
    
            btnRegisterBroad = (Button) this.findViewById(R.id.btnRegisterBroad);
            btnRegisterBroad.setOnClickListener(new OnClickListener() {
                
                @Override
                public void onClick(View v) {
                    receivece=new MyReceivceReg();
                    IntentFilter filter=new IntentFilter();
                    filter.addAction(ACTION);
                    registerReceiver(receivece, filter);
                }
            });
            
            btnUnRegisterBroad = (Button) this.findViewById(R.id.btnUnRegisterBroad);
            btnUnRegisterBroad.setOnClickListener(new OnClickListener() {
                
                @Override
                public void onClick(View v) {
                    //MyReceivceReg receivece=new MyReceivceReg();
                    //IntentFilter filter=new IntentFilter(ACTION);
                    unregisterReceiver(receivece);
                }
            });
        }
        private OnClickListener onclick = new OnClickListener() {
    
            @Override
            public void onClick(View v) {
                    Intent intent=new Intent();
                    intent.setAction(ACTION);
                    sendBroadcast(intent);
            }
        };
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            // Inflate the menu; this adds items to the action bar if it is present.
            getMenuInflater().inflate(R.menu.activity_android_broadcast_service,
                    menu);
            return true;
        }
    
    }
  • 相关阅读:
    MyBatis:分页的实现
    Mybatis之配置文件
    Java之创建线程的方式四:使用线程池
    Java之创建线程的方式三:实现Callable接口
    Java之线程通信的应用:经典例题:生产者/消费者问题
    Java之线程通信的方法
    Java之解决线程安全问题的方式三:Lock锁
    Java之同步方法处理实现Runnable接口的线程安全问题
    Java之同步方法处理继承Thread类的线程安全问题
    01 while 循环输入1 2 3 4 5 6 8 9 10
  • 原文地址:https://www.cnblogs.com/zhangs1986/p/3602323.html
Copyright © 2020-2023  润新知