Android四大组件之一:广播

一、广播上Android的四大组件之一,广播是通过intent发送的。可以分为三类:标准广播、有序广播、粘性广播:
标准广播(Normal roadcast):完全异步执行的广播,广播发出之后所有应用同时接收到广播,效率高无法被截断
有序广播(Ordered broadcast):同步广播,同一时刻只有一个广播接收器收到,并且等广播接收器中的逻辑执行完毕,后才可以继续传递;是可以截断的,阻止广播传递;存在广播的优先级

二、广播接收器可以有两种注册方式:Andriodmainfest.xml静态注册;代码动态注册
1)、静态注册

<receiver
    android:name=".MyBroadcastReceiver"
    android:enabled="true"
    android:exported="true">
    <intent-filter>
        <action android:name="com.example.broadcastTest.MY_BROADCAST"/>
    </intent-filter>
</receiver>

2)、动态注册

package com.example.mrdouya.mybroadcasttest;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    private IntentFilter intentFilter;
    private NetworkChangeReceiver networkChangeReceiver;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //intentFilter中添加广播接受器需要接受的广播
        intentFilter = new IntentFilter();
        intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
        //初始化自定义的广播接受器NetworkChangeReceiver
        networkChangeReceiver = new NetworkChangeReceiver();
        //注册广播接受器
        registerReceiver(networkChangeReceiver,intentFilter);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        //取消注册广播接受器NetworkChangeReceiver
        unregisterReceiver(networkChangeReceiver);
    }

    //自定义广播接受器NetworkChangeReceiver
    private class NetworkChangeReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            Toast.makeText(context,"net work changes",Toast.LENGTH_LONG).show();
        }
    }
}

三、如何发送广播?
1.发送标准广播
a.8.0之前可以隐式发送广播

Intent intent = new Intent("com.example.broadcastTest.MY_BROADCAST");
sendBroadcast(intent);

b.8.0需要显示发送广播

Intent intent = new Intent();
intent.setAction("com.example.broadcastTest.MY_BROADCAST");
intent.setComponent(new ComponentName(MainActivity.this,MyBroadcastReceiver.class));
sendBroadcas
sendBroadcast(intent);

这种显示发送广播,居然可以不配置Action(因为指定了广播接收器吗?)。发送有序广播之后,跨进程接收时,广播接收器必然需要动态注册(除了少数系统广播外,是无法接收的,因为需要显示调用)。
2.发送有序广播

Intent intent = new Intent();
intent.setAction("com.example.mrdouya.mybroadcaettest2.MY_ANATHOR_BROADCAST");
//intent.setComponent(new ComponentName(MainActivity.this,MyBroadcastReceiver.class));
sendOrderedBroadcast(intent,null);

3.截断广播

abortBroadcast();

4.在AndroidManif中设置广播接收器的优先级

<intent-filter android:priority="25">

5.发送本地广播
本地广播只允许广播在广播所在程序内部进行传递,使安全性得到了保证,与有序广播相比只多了一个LocalBroadcastManager,其它使用方式一致

//声明
private LocalBroadcastManager localBroadcastManager;
//获取实例、注册、取消注册、发送广播
localBroadcastManager = LocalBroadcastManager.getInstance(MainActivity.this);
localReceiver = new LocalReceiver();
myLocalIntentFilter = new IntentFilter();
myLocalIntentFilter.addAction("com.example.broadcastTest.MY_LOCAL_BROADCAST");
localBroadcastManager.registerReceiver(localReceiver,myLocalIntentFilter);
localBroadcastManager.unregisterReceiver(localReceiver);
Intent intent = new Intent("com.example.broadcastTest.MY_LOCAL_BROADCAST");
localBroadcastManager.sendBroadcast(intent);

四、adb命令发送广播、键值
1.发送广播

adb shell am broadcast -a 广播

2.发送键值

adb shell input keyevent 键值(手机的按键对应的键值,可在farmework中的keyevent.java中查询)

3.发送带各种类型的参数

adb shell am broadcast -a com.Android.test --es test_string "this is test string" --ei test_int 100 --ez test_boolean true
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值