Android| |广播机制

1、Android的广播机制介绍

机制:广播接收者通过注册到Android系统,然后接收Android发送的消息

大概和设计模式之观察者模式有点相像,大家可以相互对比来学习

 

2、BroadcastReceiver的作用

例如当开机完成后系统会产生一条广播,接收到这条广播就能实现开机启动服务的功能;当网络状态改变时系统会产生一条广播,接收到这条广播就能及时地做出提示和保存数据等操作;当电池电量改变时,系统会产生一条广播,接收到这条广播就能在电量低时告知用户及时保存进度,等等。

3、BroadcastReceiver的编写方法

Demo:一个简单的栗子

启动广播程序的类

要想启动一个BroadcastReceiver(把一个广播发送出去),必须调用sendBroadcast这个方法(然后在需要接收广播的activity中添加相应的intent-filter,当然在Receiver接收者中也要重写onReceiver方法)

public class TestActivity extends AppCompatActivity {
    private Button sendButton;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test);
        sendButton=(Button)findViewById(R.id.sendButton);
        sendButton.setOnClickListener(new BroadcastListener());
    }

    class BroadcastListener implements View.OnClickListener{
        @Override
        public void onClick(View v) {
            TestReceiver tr=new TestReceiver();
            Intent intent=new Intent();
            intent.setAction(Intent.ACTION_EDIT);
            TestActivity.this.sendBroadcast(intent);
        }
    }
}

如果我们想要实现广播的接收,首先就需要创建一个继承BroadcastReceiver的一个类

public class TestReceiver extends BroadcastReceiver {
    public TestReceiver(){
        System.out.println("TestReceiver");
    }
    @Override
    public void onReceive(Context context, Intent intent) {
        System.out.println("onReceiver");
    }
}

然后在Manifest.xml文件中注册,通过Receiver标签来注册,通过intent-filter来确定需要需要接收广播的对象

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="chao.pers.testbc">
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".TestActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <receiver android:name="chao.pers.testbc.TestReceiver">
            <intent-filter>
                <action android:name="android.intent.action.EDIT"/>
            </intent-filter>
        </receiver>
    </application>
    <uses-sdk android:minSdkVersion="4"/>
    <uses-permission android:name="android.permission.RECEIVE_SMS"/>

</manifest>

如果成功匹配到接收者后,那么接收者会创建一个实例,并且调用自己的onReceive方法,每次接收广播都会生成一个新的Receiver

4、BroadcastReceiver的生命周期

BroadcastReceiver的实例是每触发一次就新建一次的,而且和程序是在同一个进程同一线程内.

5、注册BroadcastReceiver的方法

BroadcastReceiver用于监听被广播的事件(Intent)为了达到这个目的,BroadcastReceiver必须进行注册,注册的方法有以下两种:

1、在应用程序的代码当中进行注册

特点:适合使用广播机制来更新一些控件的状态

比如:如果一个BroadcastReceiver用于更新UI,那么通常会使用这种方法进行注册,在Activity启动的时候注册BroadcastReceiver,在Activity不可见以后取消注册

注册BroadcastReceiver:registerReceiver(receiver,filter);

取消注册BroadReceiver:unregisterReceiver(receiver);

Demo代码如下:

public class SMSReceiver extends BroadcastReceiver{
    @Override
    public void onReceive(Context context, Intent intent) {
        System.out.println("receiver message");
    }
}

 

public class TestBC2Activity extends AppCompatActivity {
    private SMSReceiver smsReceiver=null;
    private Button registerButton;
    private Button unregisterButton;
    //接收短消息的Action
    private static final String SMS_ACTION="android.provider.Telephony.SMS_RECEIVED";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test_bc2);
        registerButton=(Button)findViewById(R.id.register);
        registerButton.setOnClickListener(new RegisterReceiverListener());
        unregisterButton=(Button)findViewById(R.id.unregister);
        unregisterButton.setOnClickListener(new UnRegisterReceiverListener());

    }

    class RegisterReceiverListener implements View.OnClickListener{
        @Override
        public void onClick(View v) {
            //生成一个BroadcastReceiver对象
            smsReceiver=new SMSReceiver();
            //生成一个IntentFilter对象
            IntentFilter filter=new IntentFilter();
            //为IntentFilter添加一个Action
            filter.addAction(SMS_ACTION);
            //将BroadastReceiver对象注册到系统当中
            TestBC2Activity.this.registerReceiver(smsReceiver,filter);
        }
    }

    class UnRegisterReceiverListener implements View.OnClickListener{
        @Override
        public void onClick(View v) {
            //解除BroadcastReceiver对象的注册
            TestBC2Activity.this.unregisterReceiver(smsReceiver);
        }
    }
}

接收到短消息后,我们也可以进行某些处理,则我们就在SMSReceiver中重新复写onReceiver方法

public class SMSReceiver extends BroadcastReceiver{
    @Override
    //intent  就是广播的内容
    public void onReceive(Context context, Intent intent) {
        System.out.println("receiver message");
        //接收Intent对象中的数据
        Bundle bundle=intent.getExtras();
        //在Bundle对象中有一个属性名为pdus,这个属性的值是一个Object数组
        Object[] myObjects=(Object[])bundle.get("pdus");
        //创建一个
        SmsMessage[] messages=new SmsMessage[myObjects.length];
        System.out.println(messages.length);
        for (int i = 0; i < myObjects.length; i++) {
            messages[i]=SmsMessage.createFromPdu((byte[])myObjects[i]);
            System.out.println(messages[i].getDisplayMessageBody());
        }
    }
}

2、在AndroidManifest.xml当中进行注册

特点:即使应用程序没有启动或者已经关闭,还是会时刻监听广播事件,一直处于活动状态(比如监听电池的状态)

 <receiver android:name="chao.pers.testbc.TestReceiver">
            <intent-filter>
                <action android:name="android.intent.action.EDIT"/>
            </intent-filter>
  </receiver>

6、Android内置的Broadcast Actions

内置的监听手机上所发生的各种事件,以下是比较常用的Action,完整列表可以参考:

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值