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;
    }

}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏编程之路

羊皮书APP(Android版)开发系列(五)APP引导页实现

13850
来自专栏向治洪

顺序广播和无序广播

普通广播(Normal Broadcast): 一,优缺点:和有序广播的优缺点相反! 二,发送广播的方法:sendBroadcast() 有序广播(Or...

24390
来自专栏编程之路

羊皮书APP(Android版)开发系列(七)Android沉浸通知栏

8930
来自专栏非著名程序员

Android快速开发框架 roboguice

我记得推过一篇文章也是快速开发框架的,今天再来一篇! 1、roboguice 效果 ---- ? 图文无关 2、roboguice 说明 ---- robo...

21080
来自专栏沃趣科技

Oracle 12c系列(7)| Non-CDB转换为PDB

当我们需要将Non-CDB数据库类型更改为PDB数据库类型时,可以使用Cloning的方式将其复制到现有的CDB中,但是该方法需要将Non-CDB中的数据文件复...

41590
来自专栏非著名程序员

Android 表单验证框架:AValidations

AValidations 是 一个免费的、开源的、简易的、遵循Apache Licence 2.0开源协议发布,超级容易扩展的android表单验证的小框架 ?...

22670
来自专栏Android干货

浅谈SnackBar(Toast大兄弟)

16740
来自专栏项勇

笔记39 | 数据存储之SharedPreferences的介绍及使用

16140
来自专栏Android学习之路

ViewPager 获取当前显示的Fragment

20480
来自专栏分享达人秀

探究Fragment生命周期

一个Activity可以同时组合多个Fragment,一个Fragment也可被多个Activity 复用。Fragment可以响应自己的输入事件,并拥有...

36240

扫码关注云+社区

领取腾讯云代金券