BroadcastReceiver的介绍
BroadcastReceiver创建步骤及方法
正常广播和有序广播的创建及区别和关键字
Broadcast实例:利用Broadcast在Activity和Service之间传递数据
——————-BroadcastReceiver 介绍———————
1、作为安卓四大组件之一,BroadcastReceiver 本质上一个全局监听器,他可以在后台监听应用程序和系统程序发出的特定指定,并根据指定实现具体的动作,可以实现不同组件之间的数据通信,他根据传播的过程根据有序OrderBroadcast 和普通广播NormalBroadcast。
2、注意BroadcastReceiver是系统监听器,具有全局权限,拥有自己的进程,只要有与监听器(BroadcastReceiver)相匹配的广播传出,就会触发想要的动作(在onReceiver()中指定具体动作), 而前面学习的onXXXListener() 只是程序级监听器,这些监听器运行在指定的程序所在的进程中,当程序退出随之也关闭。
3、当系统发出一条广播,而没有对应的广播接收器或者说没有相匹配的监听器,那么系统并不像Activity 那样出现异常,这里不出现异常。
4、监听器中需要重载方法onReceiver()方法,并在该方法内实现相应的动作,系统默认在10秒内必须完成onReceiver()逻辑处理,超过10秒,对不起,就会出现跳出对话框提出异常!所以不建议将耗时任务放在onReceiver 中,如果确实需要再这里处理,书上建议通过Intent来启动一个Service 来搞定。
5、与 Activity ,Service有完整的生命周期不同,BroadcastReceiver只是系统监听器,他只负责监听各程序发出的 Broadcast
——————-BroadcastReceiver创建步骤及方法———————-
1、创建一个广播监听器分为两部分,首先是广播发送者,然后注册监听器
A: 发送广播
发送广播如下:
class BroadcastReceiverActivity extends Activity
{
@Override
protected onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.BroadcastReceiverActivity);
Button send = (Button)findViewById(R.id.send);
send.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View resource){
Intent intent = new Intent();
intent.setAction("这里的String如果和监听器注册相同,就会触发监听动作");
intent.putExtra("msg","传递一些数据给监听器,通过onReceiver(Context context,Intent intent)的intent来取出");
sendBroadcast(intent);
}
});
}
}
手写的例子,为了方便看,没有实际意义
发送广播,下面是监听器注册了,监听器注册有两种形式,分java代码和manifest添加两种
A、首先写出监听器代码
public class MyBroadcastReceiver extends BroadcastReceiver
{
@Override
public void onReceiver(Context context,Intent intent){
String msg = intent.getStringExtra("msg");
Toast.makeText(context,msg,Toast.LENGTH_LONG).show();
}
}
简单的监听器代码
B、为了上面的监听器,我们需要注册一下,首先是JAVA代码注册如下:
MyBroadcastReceiver myBroadcastReceiver = new MyBroadcastReceiver();
IntentFilter filter = new IntentFilter();
filter.addAction("这里如果与前面 intent 中的action 一样,就触发监听器");
registerReceiver(myBroadcastReceiver,filter);
在manifest 中注册如下:
<receiver android:name=".MyBroadcastReceiver">
<intent-filter>
<action android:name="这里如果与前面 intent 中的action 一样,就触发监听器"/>
</intent-filter>
</receiver>
记住,这里的标签是receiver就可以了,其他和Activity一样
——————————————正常广播和有序广播的创建及区别和关键字———————————————
根据广播传递方式不同,Broadcast氛围NormalBroadcast 和 OrdeBroadcast,从字面上就可以理解了,
NormalBroadcast:广播发送出去原则上所有BroadcastReceiver 同时接受到,消息传递的效率比较高,确定是无法在不同广播接收器中按照顺序来接受,无法让不同广播接收器传递数据,并且无法主动终止广播,NormalBroadcast 发送广播格式sendBroadcast();
OrderBroadcast:有序广播的监听器不会同一时间接受到广播,而是根据设置的权限(-1000~1000)来从大到小挨个传递,设置权限也有两种方式,如下:
<receiver android:name=".MyBroadcastReceiver">
<intent-filter **android:priority="50"**>
<action android:name="这里如果与前面 intent 中的action 一样,就触发监听器"/>
</intent-filter>
</receiver>
数字越大,权限越大,最大为1000,最小为-1000
或者在java 代码中设置:
MyBroadcastReceiver receiver = new MyBroadcastReceiver();
IntentFilter filter = new IntentFilter();
filter.addAction="这里如果与前面 intent 中的action 一样,就触发监听器";
filter.setPriority="50";
registerReceiver(receiver,filter);
OrderBroadcast接收器接收到之后可以调用abortBroadcast()来终止广播,后面权限低的广播接收器就不会接收到;另一方面前面的广播接收器可以利用利用方法setResultExtras(Bundle bundle)传递值给后面的广播接收器,例如下面的示例:
SendBroadcastExample:
Button button = (Button) findViewById(R.id.author);
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View resourece) {
Intent intent = new Intent();
intent.setAction(HAHA);
intent.putExtra("msg", "this is a test");
sendOrderedBroadcast(intent, null);
}
});
FirstBroadcastReceiver:
myReceiver = new MyActivityBroadcastReceiver();
IntentFilter filter = new IntentFilter();
filter.setPriority(100);
filter.addAction(HAHA);
registerReceiver(myReceiver, filter);
........................
public class MyActivityBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, intent.getStringExtra("msg"),
Toast.LENGTH_LONG).show();
Bundle bundle = new Bundle();
bundle.putString("msg1", "this is a test for OrderBroadcast ");
setResultExtras(bundle);
}
}
SecondBroadcastReceiver:
// 再注册一个权限小于MyActivityBroadcastReceiver的监听器,优先级别50;
mySecondReceiver = new MyActivityBroadcastReceiverSecond();
IntentFilter filterSecond = new IntentFilter();
filterSecond.addAction(HAHA);
filterSecond.setPriority(50);
registerReceiver(mySecondReceiver, filterSecond);
..............
public class MyActivityBroadcastReceiverSecond extends
BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, intent.getStringExtra("msg1"),
Toast.LENGTH_LONG).show();
Bundle bundle = getResultExtras(true);//这里取值,setResultExtras(bundle);
String strs = bundle.getString("msg1");
Toast.makeText(context, strs, Toast.LENGTH_LONG).show();
abortBroadcast();//取消广播
}
}
————————Broadcast实例:利用Broadcast在Activity和Service之间传递数据——————————-
书上的例子:活动(MainActivity.class)
package com.example.broadcastexample03;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageButton;
import android.widget.TextView;
public class MainActivity extends Activity implements OnClickListener {
private ActivityReceiver activityReceiver;
TextView title,author;
ImageButton play,stop;
String [] titleStrs={"大象和猴子","老鹰抓小鸡","熊猫咪咪","猪八戒上月亮"};
String [] authorStrs = {"刘大妈","刘二妈","刘三妈","刘四妈"};
int status = 0x11;//传递播放状态
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//注册广播事件,当收到action=dangqianbofangshinayishou的广播时,触发ActivityReceiver接收器
activityReceiver = new ActivityReceiver();
IntentFilter filter = new IntentFilter();
filter.addAction("dangqianbofangshinayishou");
registerReceiver(activityReceiver,filter);
title = (TextView)findViewById(R.id.title);
author = (TextView)findViewById(R.id.author);
play = (ImageButton)findViewById(R.id.play);
stop = (ImageButton)findViewById(R.id.stop);
play.setOnClickListener(this);
stop.setOnClickListener(this);
Intent intent = new Intent(this,MusicService.class);
startService(intent);
}
public class ActivityReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
int update = intent.getIntExtra("update", -1);
int current = intent.getIntExtra("current", -1);
if(current>=0){
title.setText(titleStrs[current]);
author.setText(authorStrs[current]);
Log.e("xxx","daozhelile");
}
switch(update){
case 0x11:
play.setImageResource(R.drawable.play01);
status = 0x11;
break;
case 0x12:
play.setImageResource(R.drawable.play02);
status = 0x12;
break;
case 0x13:
play.setImageResource(R.drawable.play01);
status = 0x13;
break;
}
context.unregisterReceiver(this);
}
}
@Override
public void onClick(View source) {
Intent intent = new Intent();
intent.setAction("kaishifangge");
switch(source.getId()){
case R.id.play:
intent.putExtra("control", 1);
break;
case R.id.stop:
intent.putExtra("control", 2);
break;
}
sendBroadcast(intent);
}
}
Service代码:MusicService.class
package com.example.broadcastexample03;
import java.io.IOException;
import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.res.AssetFileDescriptor;
import android.content.res.AssetManager;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.os.IBinder;
import android.util.Log;
public class MusicService extends Service {
private MediaPlayer player;
private int current = 0;
int status = 0x11;
String[] musics = new String[] { "daxianghehouzi.mp3", "laoyingzhuaxiaoji.mp3", "xiongmaomimi.mp3",
"zhubajieshagnyueliang.mp3", };
AssetManager am;
MyReceiver myReceiver;
@Override
public IBinder onBind(Intent arg0) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
am = getAssets();
myReceiver = new MyReceiver();
IntentFilter filter = new IntentFilter();
filter.addAction("kaishifangge");
registerReceiver(myReceiver,filter);
player = new MediaPlayer();
player.setOnCompletionListener(new OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
current ++;
Log.e("xxx","daozhelile1111111111111");
if(current >=4){
current =0;
}
Intent sendIntent = new Intent();
sendIntent.setAction("dangqianbofangshinayishou");
sendIntent.putExtra("current", current);
Log.e("xxx","daozhelile");
sendBroadcast(sendIntent);
prepareAndPlay(musics[current]);
}
});
}
public class MyReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
int control = intent.getIntExtra("control", -1);
switch(control){
case 1:
if(status == 0x11){
prepareAndPlay(musics[current]);
status = 0x12;
}else if(status == 0x12){
player.pause();
status = 0x13;
}else if(status == 0x13){
player.start();
status =0x12;
}
break;
case 2:
if(status ==0x12 || status == 0x13){
player.stop();
status =0x11;
}
}
Intent sendIntent = new Intent();
sendIntent.setAction("dangqianbofangshinayishou");
sendIntent.putExtra("update", status);
sendIntent.putExtra("current", current);
sendBroadcast(sendIntent);
}
}
private void prepareAndPlay(String music){
try{
AssetFileDescriptor afd = am.openFd(music);//AssetManager asset = getAssets();
player.reset();
player.setDataSource(afd.getFileDescriptor(),afd.getStartOffset(),afd.getLength());
player.prepare();
player.start();
}catch(IOException e){
e.printStackTrace();
}
}
@Override
public void onDestroy() {
super.onDestroy();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return super.onStartCommand(intent, flags, startId);
}
@Override
public boolean onUnbind(Intent intent) {
return super.onUnbind(intent);
}
}
上面的例子主要是通过Broadcast来实现Activity组件和Service组件的通讯,用内部类的形式来实现,主要的监听注册都是用java代码的形式来实现的,我觉得很有意义,基本上让我理解了组件BroadcastReceiver的发送和接受,以及三大组件的来回传递,比其他实例好玩,不枯燥。同时再次学习了播放器对象MediaPlayer对象,关于这个对象改天有好的实例我再来总结总结吧,刚开始学,都很零散,需要有好的实例来总结,不然忘记的快。