Android深入浅出系列之广播机制—2-Android中的广播机制
前言
1.1 在上节课我们讲了在项目定义文件AndroidManifest.xml中注册BroadcastReceiver广播接收器的方法,今天我们介绍在代码中注册BroadcastReceiver广播接收器的方法。在项目定义文件AndroidManifest.xml中注册BroadcastReceiver广播接收器的话,即使你的应用程序已经被关闭了,这个BroadcastReceiver广播接收器依然会接收到广播,比如:你的这个应用程序是监听拍照事件,每次拍照后BroadcastReceiver广播接收器接收到后会弹出一个提示框“您已拍了图片,图片已保存”,当你开着这个应用程序是能收到广播的这是没有问题的,但是你把这个应用程序关闭掉了依然能收到广播,依然要弹出“您已拍了图片,图片已保存”,这在有的场景中不是我们需要的了,所以我们要换一种注册BroadcastReceiver广播接收器的方法。
1.2 了解安卓系统当中出现什么情况的时候会发出广播,以便我们对安卓操作系统当中的事件进行控制,所以我们要了解Android内置的这些BroadcastReceiver Actions。这里我就不再写了,可以去参考Android SDK 里面很全而且都有说明。
思路
BroadcastReceive用于监听被广播的事件,这种事件是以Intent对象广播出来的,所以必须在我们的安卓系统中注册BroadcastReceive类。今天我们介绍在代码中注册BroadcastReceiver广播接收器的方法。
实现步骤
一:布局文件编写
1.1:布局文件main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="绑定广播接收器"
android:id="@+id/start"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="取消绑定的广播接收器"
android:id="@+id/end"
/>
</LinearLayout>
二:代码文件编写
2. 1:MainActivity.java
package com.menglin.broadcastreceiver;
import android.app.Activity;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class MainActivity extends Activity
{
protected static final String SMS_Action = "android.provider.Telephony.SMS_RECEIVED";
//声明两个Button对象
private Buttonbtn_start,btn_end;
//声明一个我们自定义的BroadcastReceiver类的对象
BroadcastReceiver br;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
//加载布局文件main.xml
setContentView(R.layout.main);
//通过findViewById()方法得到两个按钮对象
btn_start= (Button)findViewById(R.id.start);
btn_end= (Button)findViewById(R.id.end);
//给两个按钮绑定监听单击事件
btn_start.setOnClickListener(btn_start_listener);
btn_end.setOnClickListener(cannellistener);
}
//监听单击事件
private OnClickListener btn_start_listener= new OnClickListener()
{
@Override
public void onClick(View v)
{
//创建一个BroadcastReceiver对象
br = new BroadcastReceiver();
//创建一个IntentFilter对象
IntentFilter intentfilter = new IntentFilter();
//为IntentFilter对象添加Action,也相当于在AndroidManifest.xml定义一样,定义的目的是过滤器只许当安卓的操作系统产生短消息的事件咱们自定义的这个BroadcastReceiver类才能来接收短消息这个广播,我们才能进行代码的进一步处理
intentfilter.addAction(SMS_Action);
//注册广播接收器
registerReceiver(br, intentfilter);
}
};
//监听单击事件
private OnClickListener btn_end_listener= new OnClickListener()
{
@Override
public void onClick(View v)
{
//取消注册的广播接收器
unregisterReceiver(br);
}
};
}
2.2 BroadcastReceiver .java
package com.menglin.broadcastreceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
public class BroadcastReceiver extends android.content.BroadcastReceiver
{
private static final String Tag = "BroadcastReceiver";
//构造函数
public BroadcastReceiver()
{
Log.i(Tag, "构造函数");
}
@Override
public void onReceive(Context context, Intent intent)
{
Log.i(Tag, "已接收");
}
}
三:项目定义文件
AndroidMainfest.xml
在<appliacation/>节点下面加上具有接收短信的权限节点<uses-permission android:name="android.permission.RECEIVE_SMS"/>,我之前写成<uses-permission android:name="android.permission.SMS_RECEIVE"/>,系统总是提醒我permission denial: receiving intent{act=intent
android.provider.Telephony.SMS_RECEIVED},我还是总是纳闷了,怎么回事,不是权限加上了吗,最后查看SDK发现是两单词写反了。
执行流程
但我们单击“注册广播接收器”按钮后,我们通过“Emulator Control“面板给模拟器发送个短消息,此时我们的Log日志会输出“已接收”,这个“已接收”就是我们在我们自定义的广播接收器类中输出的,我们再次单击“取消广播接收器”按钮后,我们再次通过“Emulator Control”面板给模拟器发送个短消息,Log日志就输不出了“已接收”了。
运行机制
当我们把这个我们写好的广播接收器类注册到Android的操作系统上面后,当系统接收到短消息后,就会自动调用我们写的这个BroadcastReceiver.java类中的onReceive()方法,当onReceive()方法中的代码处理完毕以后,这个广播接收器对象的生命就销毁了。当系统拍照或者收到电话等事件的广播不会调用我们写的BroadcastReceiver.java类中的onReceive()方法,因为我们写过intentfilter.addAction(SMS_Action);这行代码的意思是我们的广播接收器只对当系统接收到短消息会产生兴趣,不对系统的其他事件的广播感兴趣。
运行效果如下