6.Android BroadcastReceiver

前面分别讨论了ActivityService,这篇就介绍Android BroadCastReceiver,BroadCast是应用程序间通信的手段。BroadCastReceiver也是跟Intent紧密相连的,动态/静态注册了BroadCastReceiver之后,使用sendBroadcast把Intent发送之后,系统会自动把符合条件的BroadCastReceiver启动,跟嵌入式系统的中断类似。

本文主要演示了如何动态/静态注册BroadCastReceiver,向系统索取电量信息,以及枚举信息的字段。本文运行截图如下:

testBroadCastReceiver

动态注册BroadcastReceiver

上图是发送Intent至内部动态注册的BroadcastReceiver,接收到之后显示消息名称。动态注册BroadcastReceiver用到registerReceiver()。

静态注册BroadcastReceiver

上图是发送Intent至内部静态注册的BroadcastReceiver,接收到之后显示消息名称。静态注册比动态注册麻烦点,先新建一个类继承BroadcastReceiver,然后到AndroidManifest.xml 添加:

?
1
2
3
4
5
< receiver  android:name = "clsReceiver2" >
     < intent-filter >
         < action  android:name = "com.testBroadcastReceiver.Internal_2"  />
     </ intent-filter >
</ receiver >

第一个name是类名,第二个是action的名称。

Log

上图是枚举Intent消息的字段,这个功能比较适合懒人,把收到的Intent消息的字段全部分解了,再看看哪个需要的,懒得记住。实现这部分的代码如下:

?
1
2
3
4
5
6
7
8
// 当未知Intent包含的内容,则需要通过以下方法来列举
Bundle b=intent.getExtras();
Object[] lstName=b.keySet().toArray();
for ( int  i= 0 ; i < lstName.length; i++)
{
     String keyName=lstName[i].toString();
     Log.e(keyName,String.valueOf(b.get(keyName)));
}

main.xml

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<? xml  version = "1.0"  encoding = "utf-8" ?>
< LinearLayout  xmlns:android = "http://schemas.android.com/apk/res/android"
     android:orientation = "vertical"
     android:layout_width = "fill_parent"
     android:layout_height = "fill_parent" >
     < Button
         android:id = "@+id/Button01"
         android:layout_width = "wrap_content"
         android:layout_height = "wrap_content"
         android:text = "发送至内部动态注册的BroadcastReceiver"
         />
     < Button
         android:id = "@+id/Button02"
         android:layout_width = "wrap_content"
         android:layout_height = "wrap_content"
         android:text = "发送至内部静态注册BroadcastReceiver"
         />
     < Button
         android:id = "@+id/Button03"
         android:layout_width = "wrap_content"
         android:layout_height = "wrap_content"
         android:text = "发送至系统BroadcastReceiver"
         />
</ LinearLayout >

testBroadcastReceiver.java

?
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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
package  com.testBroadcastReceiver;
 
import  android.app.Activity;
import  android.content.BroadcastReceiver;
import  android.content.Context;
import  android.content.Intent;
import  android.content.IntentFilter;
import  android.os.Bundle;
import  android.util.Log;
import  android.view.View;
import  android.widget.Button;
import  android.widget.Toast;
 
public  class  testBroadcastReceiver  extends  Activity {
     Button btnInternal1, btnInternal2, btnSystem;
     static  final  String INTENAL_ACTION_1 = "com.testBroadcastReceiver.Internal_1" ;
     static  final  String INTENAL_ACTION_2 = "com.testBroadcastReceiver.Internal_2" ;
     static  final  String INTENAL_ACTION_3 = "com.testBroadcastReceiver.Internal_3" ;
 
     @Override
     public  void  onCreate(Bundle savedInstanceState) {
         super .onCreate(savedInstanceState);
         setContentView(R.layout.main);
         btnInternal1 = (Button)  this .findViewById(R.id.Button01);
         btnInternal1.setOnClickListener( new  ClickEvent());
         btnInternal2 = (Button)  this .findViewById(R.id.Button02);
         btnInternal2.setOnClickListener( new  ClickEvent());
         btnSystem = (Button)  this .findViewById(R.id.Button03);
         btnSystem.setOnClickListener( new  ClickEvent());
         // 动态注册广播消息
         registerReceiver(bcrIntenal1,  new  IntentFilter(INTENAL_ACTION_1));
     }
 
     class  ClickEvent  implements  View.OnClickListener {
 
         @Override
         public  void  onClick(View v) {
             if  (v == btnInternal1) // 给动态注册的BroadcastReceiver发送数据
             {
                 Intent intent =  new  Intent(INTENAL_ACTION_1);
                 sendBroadcast(intent);
             else  if  (v == btnInternal2) // 给静态注册的BroadcastReceiver发送数据
             {
                 Intent intent =  new  Intent(INTENAL_ACTION_2);
                 sendBroadcast(intent);
             else  if  (v == btnSystem) // 动态注册 接收2组信息的BroadcastReceiver
             {
                 IntentFilter filter =  new  IntentFilter(); //
                 filter.addAction(Intent.ACTION_BATTERY_CHANGED); // 系统电量检测信息
                 filter.addAction(INTENAL_ACTION_3); // 第三组自定义消息
                 registerReceiver(batInfoReceiver, filter);
 
                 Intent intent =  new  Intent(INTENAL_ACTION_3);
                 intent.putExtra( "Name" "hellogv" );
                 intent.putExtra( "Blog" "http://blog.csdn.net/hellogv" );
                 sendBroadcast(intent); // 传递过去
             }
         }
 
     }
 
     /*
      * 接收动态注册广播的BroadcastReceiver
      */
     private  BroadcastReceiver bcrIntenal1 =  new  BroadcastReceiver() {
 
         public  void  onReceive(Context context, Intent intent) {
             String action = intent.getAction();
             Toast.makeText(context,  "动态:"  + action,  1000 ).show();
         }
     };
 
     private  BroadcastReceiver batInfoReceiver =  new  BroadcastReceiver() {
 
         public  void  onReceive(Context context, Intent intent) {
             String action = intent.getAction();
             // 如果捕捉到的action是ACTION_BATTERY_CHANGED
             if  (Intent.ACTION_BATTERY_CHANGED.equals(action)) {
                 // 当未知Intent包含的内容,则需要通过以下方法来列举
                 Bundle b = intent.getExtras();
                 Object[] lstName = b.keySet().toArray();
 
                 for  ( int  i =  0 ; i < lstName.length; i++) {
                     String keyName = lstName[i].toString();
                     Log.e(keyName, String.valueOf(b.get(keyName)));
                 }
             }
             // 如果捕捉到的action是INTENAL_ACTION_3
             if  (INTENAL_ACTION_3.equals(action)) {
                 // 当未知Intent包含的内容,则需要通过以下方法来列举
                 Bundle b = intent.getExtras();
                 Object[] lstName = b.keySet().toArray();
 
                 for  ( int  i =  0 ; i < lstName.length; i++) {
                     String keyName = lstName[i].toString();
                     Log.e(keyName, b.getString(keyName));
                 }
             }
         }
     };
}

clsReceiver2.java

?
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
package  com.testBroadcastReceiver;
 
import  android.content.BroadcastReceiver;
import  android.content.Context;
import  android.content.Intent;
import  android.widget.Toast;
 
/**
  * 接收静态注册广播的BroadcastReceiver, step1:要到AndroidManifest.xml这里注册消息
  * <receiver android:name="clsReceiver2">
             <intent-filter>
                 <action
                     android:name="com.testBroadcastReceiver.Internal_2"/>
             </intent-filter>
         </receiver>
  * step2:定义消息的字符串
  * step3:通过Intent传递消息来驱使BroadcastReceiver触发
  */
public  class  clsReceiver2  extends  BroadcastReceiver{
     @Override
     public  void  onReceive(Context context, Intent intent) {
         String action = intent.getAction();
         Toast.makeText(context,  "静态:" +action,  1000 ).show();
         
     }
}
在uni-app中注册一个广播接收器(BroadcastReceiver),主要涉及到在前端JavaScript代码中声明和注册,以及在HBuilderX中进行配置。请按照以下步骤操作: 1. 在HBuilderX中打开你的uni-app项目。 2. 在项目根目录下的`manifest.json`文件中找到`app-plus` -> `distribute` -> `android` -> `permissions`部分。 3. 在`permissions`数组中添加你需要的权限。例如,如果你想要接收系统广播,你可能需要添加相应的权限。 4. 在`app-plus` -> `distribute` -> `android` -> `config` -> `permissions`中添加需要的权限声明。 5. 在你的前端代码中,使用`plus.runtime.registerBroadcastReceiver`方法来注册一个广播接收器。这个方法需要一个JSON对象作为参数,该对象包含`name`(广播的名称),`type`(广播类型,通常为`"normal"`),`action`(广播的动作,例如`"android.intent.action.BOOT_COMPLETED"`)等字段。 6. 提供一个事件处理函数,当接收到指定的广播时,该函数将被调用。 下面是一个简单的示例代码: ```javascript // 注册广播接收器 plus.runtime.registerBroadcastReceiver({ "name": "MyReceiver", // 接收器的名称 "type": "normal", "action": "io.dcloud.android.content.broadcastreceiver", // 广播的动作 "callback": function(data) { // 当接收到广播时的回调函数 console.log("接收到的广播内容:" + data); } }); // 注意:确保你已经通过上述的manifest.json配置了相应的权限 ``` 请确保在`action`字段中使用的是正确的广播动作,并且你已经在`manifest.json`文件中正确配置了相关的权限。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值