📜  Android-广播接收器

📅  最后修改于: 2021-01-05 04:52:27             🧑  作者: Mango


广播接收器仅响应来自其他应用程序或系统本身的广播消息。这些消息有时称为事件或意图。例如,应用程序还可以启动广播,以使其他应用程序知道某些数据已下载到设备中并可供他们使用,因此,这是广播接收器,它将拦截此通信并启动适当的操作。

要使BroadcastReceiver用于系统的广播意图,需要执行以下两个重要步骤-

  • 创建广播接收器。

  • 注册广播接收器

如果要实现您的自定义意图,还有另外一个步骤,那么您将必须创建并广播这些意图。

创建广播接收器

广播接收器被实现为BroadcastReceiver类的子类,并且重写了onReceive()方法,在该方法中,每个消息均作为Intent对象参数被接收。

public class MyReceiver extends BroadcastReceiver {
   @Override
   public void onReceive(Context context, Intent intent) {
      Toast.makeText(context, "Intent Detected.", Toast.LENGTH_LONG).show();
   }
}

注册广播接收器

应用程序通过在AndroidManifest.xml文件中注册广播接收器来侦听特定的广播意图。考虑一下,我们将为系统生成的事件ACTION_BOOT_COMPLETED注册MyReceiver ,一旦Android系统完成启动过程,系统就会触发该事件。

广播

广播接收器


   
   
      
         
         
      
   
   

现在,每当您的Android设备启动时,它将被BroadcastReceiver MyReceiver拦截,并且将执行onReceive()中的已实现逻辑。

Intent类中,有几个系统生成的事件定义为最终的静态字段。下表列出了一些重要的系统事件。

Sr.No Event Constant & Description
1

android.intent.action.BATTERY_CHANGED

Sticky broadcast containing the charging state, level, and other information about the battery.

2

android.intent.action.BATTERY_LOW

Indicates low battery condition on the device.

3

android.intent.action.BATTERY_OKAY

Indicates the battery is now okay after being low.

4

android.intent.action.BOOT_COMPLETED

This is broadcast once, after the system has finished booting.

5

android.intent.action.BUG_REPORT

Show activity for reporting a bug.

6

android.intent.action.CALL

Perform a call to someone specified by the data.

7

android.intent.action.CALL_BUTTON

The user pressed the “call” button to go to the dialer or other appropriate UI for placing a call.

8

android.intent.action.DATE_CHANGED

The date has changed.

9

android.intent.action.REBOOT

Have the device reboot.

广播自定义意图

如果您希望应用程序本身应生成并发送自定义意图,则必须使用活动类中的sendBroadcast()方法来创建并发送这些意图。如果您使用sendStickyBroadcast(Intent)方法,则该Intent是粘性的,这意味着您要发送的Intent在广播完成后仍然存在。

public void broadcastIntent(View view) {
   Intent intent = new Intent();
   intent.setAction("com.tutorialspoint.CUSTOM_INTENT");
   sendBroadcast(intent);
}

这个意图com.tutorialspoint.CUSTOM_INTENT也可以通过类似于我们重新注册系统生成的意图的方式进行注册。


   
   
      
         
         
      
   
   

本示例将向您说明如何创建BroadcastReceiver来拦截自定义意图。熟悉自定义意图后,即可对应用程序进行编程以拦截系统生成的意图。因此,让我们按照以下步骤修改我们在“ Hello World示例”一章中创建的Android应用程序-

Step Description
1 You will use Android studio to create an Android application and name it as My Application under a package com.example.tutorialspoint7.myapplication as explained in the Hello World Example chapter.
2 Modify main activity file MainActivity.java to add broadcastIntent() method.
3 Create a new java file called MyReceiver.java under the package com.example.tutorialspoint7.myapplication to define a BroadcastReceiver.
4 An application can handle one or more custom and system intents without any restrictions. Every intent you want to intercept must be registered in your AndroidManifest.xml file using tag
5 Modify the default content of res/layout/activity_main.xml file to include a button to broadcast intent.
6 No need to modify the string file, Android studio take care of string.xml file.
7 Run the application to launch Android emulator and verify the result of the changes done in the application.

以下是修改后的主要活动文件MainActivity.java的内容。该文件可以包括每个基本生命周期方法。我们添加了broadcastIntent()方法以广播自定义意图。

package com.example.tutorialspoint7.myapplication;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;

public class MainActivity extends Activity {

   /** Called when the activity is first created. */
   @Override
   
   public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
   }


   // broadcast a custom intent.
      
   public void broadcastIntent(View view){
      Intent intent = new Intent();
      intent.setAction("com.tutorialspoint.CUSTOM_INTENT"); sendBroadcast(intent);
   }
}

以下是MyReceiver.java的内容:

package com.example.tutorialspoint7.myapplication;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;

/**
 * Created by TutorialsPoint7 on 8/23/2016.
 */
public class MyReceiver extends BroadcastReceiver{
   @Override
   public void onReceive(Context context, Intent intent) {
      Toast.makeText(context, "Intent Detected.", Toast.LENGTH_LONG).show();
   }
}

以下将修改AndroidManifest.xml文件的内容。在这里,我们添加了标记以包括我们的服务:




   
        
      
         
            

            
         
      
   
      
         
            
            
         

      
   


以下是res / layout / activity_main.xml文件的内容,其中包括一个用于广播我们的自定义意图的按钮-


   
   
      
   
      
   
      
   


让我们尝试运行修改后的Hello World!我们刚刚修改的应用程序。我假设您在进行环境设置时已创建了AVD 。要从Android Studio运行该应用,请打开您项目的活动文件之一,然后点击运行Eclipse运行图标工具栏中的图标。 Android Studio将应用程序安装在您的AVD上并启动它,如果设置和应用程序一切正常,它将显示在“模拟器”窗口下面-

Android广播演示

现在要广播我们的自定义意图,让我们单击“广播意图”按钮,这将广播我们的自定义意图“ com.tutorialspoint.CUSTOM_INTENT” ,它将被我们注册的BroadcastReceiver即MyReceiver拦截,并且根据我们实现的逻辑,祝酒词将出现在底部模拟器的如下-

Android广播意图

您可以尝试实现其他BroadcastReceiver来拦截系统生成的意图,例如系统启动,更改日期,电池电量低等。