美文网首页
Android四大组件--BroacastReceiver

Android四大组件--BroacastReceiver

作者: 木木不哭_8be4 | 来源:发表于2019-06-16 09:15 被阅读0次

Android四大组件--BroacastReceiver

本质上就是一个全局监听器,用于监听系统全局广播消息,因此它可以方便地实现系统内不同组件的通信。

1.BroacastReceiver简介

BroacastReceiver用于接收程序所发出的Broadcast Intent,创建方式分为两步:

  1. 构建需要启动的BroacastReceiverIntent

  2. 调用ContextsendBroadcast() 或者sendOrderedBroadcast()方法来启动指定的Broadreceiver

当程序发出一个Broadcast Intent之后所有匹配该IntentBroadReceiver都有可能被启动.

2.创建广播接收器

继承BroadReceiver类并实现其onReceive()方法

public class DemoBroadReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        //一个广播接收器
        Log.e("test", "onReceive: 接收器工作了" );
        Log.i("test", "onReceive: "+context.getPackageName());
        Log.i("test", "onReceive: "+intent.getAction());
    }
}

2.指定广播接收器

两种方式(这里我使用的是系统自带的广播发送器,当我修改飞行模式状态的时候会触发我的接收器):

  1. 使用代码指定

    public class MainActivity extends AppCompatActivity {
        BroadcastReceiver myBroadcastReceiver=new DemoBroadReceiver();
    
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            //指定一个广播接收器 动态方式
            IntentFilter intentFilter=new IntentFilter();
            intentFilter.addAction("android.intent.action.AIRPLANE_MODE");
            registerReceiver(myBroadcastReceiver,intentFilter);
    
        }
    
        @Override
        protected void onDestroy() {
            super.onDestroy();
            //手动卸载广播
            unregisterReceiver(myBroadcastReceiver);
        }
    }
    
  2. 在xml中进行配置(与activity标签平级)

    
    <receiver android:name="com.lhp.broadcast.DemoBroadReceiver">
                <intent-filter>
                    <action android:name="android.intent.action.AIRPLANE_MODE"></action>
                </intent-filter>
    </receiver>
    

两者的区别:

  1. 动态的方式由于是写在app的onCreae()方法内所以只有在程序运行的时候才会生效
  2. 写在xml中不论自己的程序是否在运行,都会生效

3.普通广播和无序广播

1.普通广播(Normal Broadcast) :异步传播,同一时刻所有接收者都可以接到。传递的效率较高,缺点是不能对收到的广播信息进行处理

2..无序广播 (Ordered Broadcast):Ordered Broadcast的接收者必须按照预先声明的顺序依次接收。如果同时有三个接收者A,B,C。默认是优先级别是其在xml中注册的顺序从上之下依次变低,也可以通过android:priority="numer" 来指定,数值在-1000~1000之间,数值越大,优先级越高。同时也可以通过IntentFilter对象的setPriority()来设置。 无序广播的接收者可以对收到的信息进行修改,还可以终止广播(abortBroadcast()),优先级比它低的就看不到广播信息。

案例3.1--发送一个有序广播

mainActivity

public class OrderedBroadcast extends AppCompatActivity {
    Button btn;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_ordered_broadcast);
        //初始化按钮
        btn=findViewById(R.id.btn_send);
        //点击按钮发送广播
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent=new Intent();
                //自定义的Action
                intent.setAction("com.lhp.orderedbroadcast.OrderedBroadcast.MY_ACTION");
                intent.putExtra("msg","最初的广播");
                //发送有序广播
                sendOrderedBroadcast(intent,null);
                //发送无序广播
                //sendBroadcast(intent);

            }
        });
    }
}

Receiver01


public class Receiver01 extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Log.e("haha", "进入了Receiver01" );
        String msg=intent.getStringExtra("msg");
        Log.e("haha", "onReceive: "+msg );
        Bundle bundle=new Bundle();
        bundle.putString("first","Receiver01存入的消息");
        setResultExtras(bundle);
        //中断广播
        //abortBroadcast();
        Log.e("haha", "离开了Receiver01" );
    }
}

Receiver02


public class Receiver02 extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Log.e("haha", "onReceive: 进入了 Receiver02");
        String msg=intent.getStringExtra("msg");
        Log.e("haha", "onReceive: msg"+msg );
        Bundle resultExtras = getResultExtras(true);
        String first=resultExtras.getString("first");
        Log.e("haha", "onReceive: first "+first );

    }
}

AndroidManifest.xml(重点是两个receiver)

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.lhp.orderedbroadcast">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".OrderedBroadcast">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <receiver android:name="com.lhp.receivers.Receiver01" >
            <intent-filter android:priority="20">
                <action android:name="com.lhp.orderedbroadcast.OrderedBroadcast.MY_ACTION"></action>
            </intent-filter>
        </receiver>
        <receiver android:name="com.lhp.receivers.Receiver02" >
            <intent-filter android:priority="10">
                <action android:name="com.lhp.orderedbroadcast.OrderedBroadcast.MY_ACTION"></action>
            </intent-filter>
        </receiver>
    </application>
</manifest>

点击发送后的运行结果:

Receiver02收到广播信息

如果取消掉Receiver01中的 中断广播注释,结果为:

Receiver02未收到广播信息

3.其他

  • 不建议在广播接收器内做耗时操作,原因是广播发送者所在的线程,进程与接收者所在的线程进程均为同一个,若超过10秒未处理完毕,系统会判定为ANR(Application no Response)与此同时在等待期间,当前activity的输入框也无法点击。

相关文章

网友评论

      本文标题:Android四大组件--BroacastReceiver

      本文链接:https://www.haomeiwen.com/subject/fgywfctx.html