初步理解BroadcastReceiver

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对象,关于这个对象改天有好的实例我再来总结总结吧,刚开始学,都很零散,需要有好的实例来总结,不然忘记的快。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值