今天我们将讨论并实现Android框架中一个非常重要的组件--Android BroadCastReceiver。
Android BroadCastReceiver
Android BroadCastReceiver是Android的休眠组件,可以监听系统范围的广播事件或intents.当这些事件中的任何一个发生时,它都会通过创建状态栏通知或执行任务来启动应用程序。与活动不同,AndroidBroadCastReceiver
不包含任何用户界面。广播接收器通常被实现为根据接收到的意图数据的类型将任务委托给服务。以下是系统范围内生成的一些重要意图。
1.android.intent.action.BATTERY_LOW :设备电量不足。 2.android.intent.action.BOOT_COMPLETED :系统引导完成后播放一次 3.android.intent.action.CALL :调用数据指定的对象 4.android.intent.action.DATE_CHANGED :日期已更改 5.android.intent.action.REBOOT :重启设备 6.android.net.Conn.CONNECTIVITY_CHANGE :移动网络或WiFi连接改变(或重置)
Android中的直播接收器
要在Android应用程序中设置广播接收器,我们需要做以下两件事。
1.创建BroadCastReceiver 2.注册BroadCastReceiver
创建BroadcastReceiver
让我们快速实现一个定制的BroadCastReceiver,如下所示。
1public class MyReceiver extends BroadcastReceiver {
2 public MyReceiver() {
3 }
4
5 @Override
6 public void onReceive(Context context, Intent intent) {
7
8 Toast.makeText(context, "Action: " + intent.getAction(), Toast.LENGTH_SHORT).show();
9 }
10}
BroadcastReceiver是一个[abstract class](/community/tutorials/abstract-class-in-java),其onReceiver()
方法是抽象的。当任何事件发生时,首先在注册的广播接收器上调用onReceiver()
方法。Intent对象与所有其他数据一起传递。Context对象也是可用的,用于分别使用context.startActivity(myIntent);
或context.startService(myService);
启动Activity或服务。
在Android APP中注册BroadCastReceiver
可以通过两种方式注册BroadCastReceiver。
1.通过在AndroidManifest.xml
文件中定义它,如下所示。
1<receiver android:name=".ConnectionReceiver" >
2 <intent-filter>
3 <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
4 </intent-filter>
5</receiver>
使用意图过滤器,我们告诉系统任何与我们的子元素匹配的意图都应该被传递到特定的广播接收器。通过以编程方式定义它 下面的代码片段显示了以编程方式注册广播接收器的示例。
1IntentFilter filter = new IntentFilter();
2intentFilter.addAction(getPackageName() + "android.net.conn.CONNECTIVITY_CHANGE");
3
4MyReceiver myReceiver = new MyReceiver();
5registerReceiver(myReceiver, filter);
要在活动的onStop()
或onPue()
中取消注册广播接收器,可以使用以下代码片段。
1@Override
2protected void onPause() {
3 unregisterReceiver(myReceiver);
4 super.onPause();
5}
从Activity发送Broadcast Intent
以下代码片段用于向所有相关的BroadCastReceiver发送意图。
1Intent intent = new Intent();
2 intent.setAction("com.journaldev.CUSTOM_INTENT");
3 sendBroadcast(intent);
不要忘记将上述操作添加到清单的意图过滤器标记中,或以编程方式添加。让我们开发一个应用程序,它可以监听网络更改事件,也可以监听定制意图,并相应地处理数据。
Android项目结构中的BroadCastReceiver
中的广播接收器
Android BroadCastReceiver代码
active_main.xml
由中央的一个发送广播意图的按钮组成。
1<?xml version="1.0" encoding="utf-8"?>
2<RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android"
3 xmlns:tools="https://schemas.android.com/tools"
4 android:layout_width="match_parent"
5 android:layout_height="match_parent"
6 android:paddingBottom="@dimen/activity_vertical_margin"
7 android:paddingLeft="@dimen/activity_horizontal_margin"
8 android:paddingRight="@dimen/activity_horizontal_margin"
9 android:paddingTop="@dimen/activity_vertical_margin"
10 tools:context="com.journaldev.broadcastreceiver.MainActivity">
11
12 <Button
13 android:layout_width="wrap_content"
14 android:layout_height="wrap_content"
15 android:id="@+id/button"
16 android:text="Send Broadcast"
17 android:layout_centerVertical="true"
18 android:layout_centerHorizontal="true" />
19</RelativeLayout>
MainActivity.java
如下所示。
1package com.journaldev.broadcastreceiver;
2
3import android.content.Intent;
4import android.content.IntentFilter;
5import android.support.v7.app.AppCompatActivity;
6import android.os.Bundle;
7import android.util.Log;
8import android.view.View;
9import android.widget.Button;
10
11import butterknife.ButterKnife;
12import butterknife.InjectView;
13import butterknife.OnClick;
14
15public class MainActivity extends AppCompatActivity {
16 ConnectionReceiver receiver;
17 IntentFilter intentFilter;
18
19 @Override
20 protected void onCreate(Bundle savedInstanceState) {
21 super.onCreate(savedInstanceState);
22 setContentView(R.layout.activity_main);
23
24 ButterKnife.inject(this);
25
26 receiver = new ConnectionReceiver();
27 intentFilter = new IntentFilter("com.journaldev.broadcastreceiver.SOME_ACTION");
28
29 }
30
31 @Override
32 protected void onResume() {
33 super.onResume();
34 registerReceiver(receiver, intentFilter);
35
36 }
37
38 @Override
39 protected void onDestroy() {
40 super.onDestroy();
41
42 unregisterReceiver(receiver);
43 }
44
45 @OnClick(R.id.button)
46 void someMethod() {
47
48 Intent intent = new Intent("com.journaldev.broadcastreceiver.SOME_ACTION");
49 sendBroadcast(intent);
50 }
51}
在上面的代码中,我们以编程方式注册了另一个自定义操作。ConnectionReceiver在androidManifest.xml
文件中定义如下。
1<?xml version="1.0" encoding="utf-8"?>
2<?xml version="1.0" encoding="utf-8"?>
3<manifest xmlns:android="https://schemas.android.com/apk/res/android"
4 package="com.journaldev.broadcastreceiver">
5
6 <uses-permission android:name="android.permission.INTERNET" />
7 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
8
9 <application
10 android:allowBackup="true"
11 android:icon="@mipmap/ic_launcher"
12 android:label="@string/app_name"
13 android:supportsRtl="true"
14 android:theme="@style/AppTheme">
15 <activity android:name=".MainActivity">
16 <intent-filter>
17 <action android:name="android.intent.action.MAIN" />
18 <category android:name="android.intent.category.LAUNCHER" />
19 </intent-filter>
20 </activity>
21
22 <receiver android:name=".ConnectionReceiver">
23 <intent-filter>
24 <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
25 </intent-filter>
26 </receiver>
27
28 </application>
29</manifest>
ConnectionReceiver.java类定义如下。
1public class ConnectionReceiver extends BroadcastReceiver {
2 @Override
3 public void onReceive(Context context, Intent intent) {
4
5 Log.d("API123",""+intent.getAction());
6
7 if(intent.getAction().equals("com.journaldev.broadcastreceiver.SOME_ACTION"))
8 Toast.makeText(context, "SOME_ACTION is received", Toast.LENGTH_LONG).show();
9
10 else {
11 ConnectivityManager cm =
12 (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
13
14 NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
15 boolean isConnected = activeNetwork != null &&
16 activeNetwork.isConnectedOrConnecting();
17 if (isConnected) {
18 try {
19 Toast.makeText(context, "Network is connected", Toast.LENGTH_LONG).show();
20 } catch (Exception e) {
21 e.printStackTrace();
22 }
23 } else {
24 Toast.makeText(context, "Network is changed or reconnected", Toast.LENGTH_LONG).show();
25 }
26 }
27 }
28
29}
在上面的代码中,我们检查触发onRecept()
方法的意图操作,并在此基础上显示祝酒词。注意 :如果想让外部应用程序无法使用广播接收器,可以在清单中添加android:EXPORTED=FALSE
属性。当我们发送广播时,外部应用程序也有可能接收到它们。这可以通过指定此限制来防止。运行中的输出应用程序如下所示。这带来了Android BroadCastReceiver教程的结束。您可以从下面的链接下载最终的BroadCastReceiver项目。