0%

Android四大组件(二) | BroadcastReceiver

Andorid四大组件(二) | BroadcastReceiver

广播接收器 不要在Onreceive中 添加过多的耗时逻辑,因为在广播接受器中不允许开启线程

动态注册(接收广播)

动态接收广播不需要在AndroidManifest 声明

  1. 创建一个类 继承自 BroadcastReceiver 并重写 onReceive

  2. 实例化上面这个类

  3. 添加IntentFilter

  4. 注册广播

    注意:对于一些敏感的广播内容(网络状态等) 需要在在AndroidManifest 声明

  5. 注销广播

  6. 完整代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    public class MainActivity extends AppCompatActivity {
    private IntentFilter intentFilter;
    NetworkReceiver receiver;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    //***************2*******************
    receiver = new NetworkReceiver();
    //***************3*******************
    intentFilter = new IntentFilter();
    intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
    //***************4*******************
    registerReceiver(receiver, intentFilter);
    }

    @Override
    protected void onDestroy() {
    super.onDestroy();
    //***************5*******************
    unregisterReceiver(receiver);
    }

    //***************1*******************
    class NetworkReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
    ConnectivityManager manager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo networkInfo = manager.getActiveNetworkInfo();
    if (networkInfo != null && networkInfo.isAvailable()) {
    Toast.makeText(MainActivity.this, "已联网", Toast.LENGTH_SHORT).show();
    } else {
    Toast.makeText(MainActivity.this, "网络异常", Toast.LENGTH_SHORT).show();
    }

    }
    }
    }

静态注册(接收广播)

模拟机不支持静态注册,动态注册只有在APP开启的时候才可以接收到广播,如果想不开启APP就收到广播 需要静态注册广播

静态注册广播需要在AndroidManifest中声明,并且需要声明 itentfilter中的action,表明监听哪种广播

  1. 创建一个类 继承自 BroadcastReceiver 重写 onreceive方法

  2. 在AndroidManifest中注册 上面这个广播

  3. 在注册中添加action,也就是想要监听的广播

  4. 添加一定的权限声明,根据不同的需求

  5. 全部代码(监听手机开机)

    MyReceiver类

    1
    2
    3
    4
    5
    6
    7
    public class MyReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
    Toast.makeText(context, "接受到广播", Toast.LENGTH_SHORT).show();
    }
    }

    MainActivity类中 不需要修改

    AndroidManifest 中注册 receiver,添加权限声明

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.littlestone.broadcastreceiver_static">

    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>

    <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/Theme.BroadcastReceiver_Static">
    <activity android:name=".MainActivity">
    <intent-filter>
    <action android:name="android.intent.action.MAIN" />

    <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
    </activity>

    <receiver
    android:name=".MyReceiver"
    android:enabled="true"
    android:exported="true">
    <intent-filter>
    <action android:name="android.intent.action.BOOT_COMPLETED"/>
    </intent-filter>
    </receiver>
    </application>

    </manifest>

发送标准广播

发送广播前,需要定义一个接收该广播的类MyReceiver,静态注册

1
2
3
4
5
6
7
8
9
public class MyReceiver extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "收到标准广播", Toast.LENGTH_SHORT).show();
//下边这个是有序广播中 拦截广播
abortBroadcast();
}
}

如何发送广播?

  1. 将上面这个静态注册的广播在AnroidMnifest注册

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.littlestone.broadcastreceiver_sendstandard">

    <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/Theme.BroadcastReceiver_sendStandard">
    <activity android:name=".MainActivity">
    <intent-filter>
    <action android:name="android.intent.action.MAIN" />

    <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
    </activity>

    <receiver
    android:name=".MySecondReceiver"
    android:enabled="true"
    android:exported="true">
    <intent-filter>
    <action android:name="com.littlestone.broadcast.mine" />
    </intent-filter>
    </receiver>

    <receiver
    android:name=".MyReceiver"
    android:enabled="true"
    android:exported="true">
    <intent-filter android:priority="100">
    <action android:name="com.littlestone.broadcast.mine" />
    </intent-filter>
    </receiver>
    </application>

    </manifest>
  2. 定义一个要发送的广播的Intent

  3. 发送广播(sendBroadcast(intent))

  4. 全部代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    public class MainActivity extends AppCompatActivity {
    private Button btn_standard, btn_order;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    btn_standard = findViewById(R.id.btn_standard);
    btn_order = findViewById(R.id.btn_order);

    btn_standard.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
    Intent intent = new Intent("com.littlestone.broadcast.mine");
    //标准广播
    sendBroadcast(intent);
    }
    });

    btn_order.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
    Intent intent = new Intent("com.littlestone.broadcast.mine");
    //有序广播 第二个参数为权限相关 设为null即可
    sendOrderedBroadcast(intent, null);
    }
    });
    }
    }

发送有序广播

发送有序广播与标准广播大体上类似,只不过是sendorderBroadcast(intent)

既然是有序广播,就可以定义广播接收器的优先级,在intentfilter标签中 android:priority=”100” 就定义优先级的大小

代码将上述 第二个Button的点击事件处理,以及 AndroidMnifest中两个接收的注册声明

发送本地广播

发送本地广播需要在 build.gradle中添加依赖

1
implementation 'androidx.localbroadcastmanager:localbroadcastmanager:1.0.0'

发送本地广播

  1. 需要先实例化一个LocalBroadcastManager 通过LocalBroadcastManager.getInstance(Context context) 实例化

  2. 发送本地广播与 发送系统广播没有大的差别 只不过需要通过上面的manager来发送 而不是 Context类中来发送

接收本地广播

接收本地广播 采用动态注册的方式 进行接收广播,为什么采用动态注册 而不是静态,静态注册APP不启动时也可以收到广播,但是我们接受的是本地广播,本来就需要我们APP在启动的状态下发送,静态注册就没有意义了

  1. 实例化一个IntentFilter

  2. 为IntentFilter添加action 也就是监听什么广播

  3. 使用localBroadCastManager.registerReceiver(intentfilter)来注册广播

  4. 使用localBroadCastManager.unregisterReceiver(intentfilter)来注销广播

全部代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
public class MainActivity extends AppCompatActivity {
private IntentFilter filter;
private LocalBroadcastReceiver localBroadcastReceiver;
private LocalBroadcastManager localBroadcastManager;
private Button button;

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

//发送本地广播
button = findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent("com.littlestone.localbroadcast");
localBroadcastManager.sendBroadcast(intent);
}
});

//接收本地广播相关代码 动态注册接收广播
filter = new IntentFilter();
filter.addAction("com.littlestone.localbroadcast");
localBroadcastReceiver = new LocalBroadcastReceiver();
localBroadcastManager = LocalBroadcastManager.getInstance(this);
localBroadcastManager.registerReceiver(localBroadcastReceiver, filter);

}

@Override
protected void onDestroy() {
super.onDestroy();
localBroadcastManager.unregisterReceiver(localBroadcastReceiver);
}

class LocalBroadcastReceiver extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "收到本地广播", Toast.LENGTH_SHORT).show();
}
}
}