Android组件之BroadCast简单实践

作为Android的四大组件之一,没有理由不介绍一下BroadCast,BroadCast中文简单翻译就是广播,前阵子浙江某大学的啦啦操,广场舞的大妈,其中大妈和学生从喇叭和音响上听到的声音就是事件源,接收者就是这些大妈和学生,程序源自实践,Android中BroadCast,有事件广播者也有事件接收者,Broadcast是一种广泛运用的在应用程序之间传输信息的机制,BroadcastReceiver是对发送出来的 Broadcast进行过滤接受并响应的一类组件,也就是接收者。讲完了基本的概念,可以开始基本的实践:

自定义广播的两种实现方式

两种实现方式,一种是静态,一种是动态,先看下静态的实现过程:

定义一个BookBroadCast接收者(有几个判断添加是系统广播需要的):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public  class  BookBroadCast  extends  BroadcastReceiver {
 
     private  String tag =  "BookBroadCast" ;
 
     @Override
     public  void  onReceive(Context context, Intent intent) {
         // TODO Auto-generated method stub
         String actionString = intent.getAction();
         String name = intent.getStringExtra( "Name" );
         if  (actionString.equals(Intent.ACTION_TIME_CHANGED)) {
             Log.i(tag,  "Name:"  + name +  "--Action:"  + actionString
                     "--哥们,时间改变了~" );
         else  if  (actionString.equals(Intent.ACTION_BATTERY_CHANGED)) {
             Log.i(tag,  "Name:"  + name +  "--Action:"  + actionString
                     "--哥们,电量变了~" );
         else  {
             Log.i(tag,  "Name:"  + name +  "--Action:"  + actionString);
         }
     }
 
}

  看下App页面:

 

 

静态广播对应第一个按钮,点击事件:

1
2
3
Intent intent =  new  Intent( "com.google.broadcast.BookBroadCast.static" );
         intent.putExtra( "Name" "静态广播" );
         sendBroadcast(intent);

  静态广播需要在AndroidManifest.xml中注册一下:

1
2
3
4
5
6
7
<receiver android:name= "com.google.broadcast.BookBroadCast" >
          <intent-filter >
              <action android:name= "com.google.broadcast.BookBroadCast.static" />
                 <action android:name= "android.intent.action.TIME_SET" />
          </intent-filter>
      </receiver>

  结果如下:

动态调用就是不需要在AndroidManifest.xml注册,在程序中动态生成filter设置action,在activity中的onStart注册,onStop终止:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@Override
protected  void  onStop() {
     // TODO Auto-generated method stub
     super .onStop();
     unregisterReceiver(bookReceiver);
}
 
@Override
protected  void  onStart() {
     // TODO Auto-generated method stub
     super .onStart();
     IntentFilter intentFilter =  new  IntentFilter();
     intentFilter.addAction( "com.google.broadcast.BookBroadCast.dymanic" );
     bookReceiver =  new  BookBroadCast();
     registerReceiver(bookReceiver, intentFilter);
 
}

  动态调用事件,对应第二个按钮:

1
2
3
Intent dintent =  new  Intent( "com.google.broadcast.BookBroadCast.dymanic" );
         dintent.putExtra( "Name" "动态广播" );
         sendBroadcast(dintent);

  结果如下:

两种系统广播调用方式

关于系统广播的各种事件网上一找一堆,我就没必要贴在这里了,先来实现第三个和第四个按钮的事件,第三个是系统事件的改变,第四个是电池电量的改变:

第三个action的常量的和Intent枚举出来的名称有出入:

1
<action android:name= "android.intent.action.TIME_SET" />

  调用的时候是这样的:

1
2
3
Intent sintent =  new  Intent(Intent.ACTION_TIME_CHANGED);
         sintent.putExtra( "Name" "不被保护系统广播" );
         sendBroadcast(sintent);

  结果如下:

这个其实都没有什么大的问题,然后按照静态注册方式没法搞定第四个电池电量的问题,先来看第四个是如何实现的:

1
2
3
IntentFilter systemintentFilter =  new  IntentFilter(Intent.ACTION_BATTERY_CHANGED);
         systembookReceiver =  new  BookBroadCast();
         registerReceiver(systembookReceiver, systemintentFilter);

 首先可以看出不是静态注册的,需要动态注册,然后不需要调用sendBroadcast,结果如下:

这个问题解决都弄了一个多小时,最终的Google的API找到对应的解释:

地址:http://developer.android.com/reference/android/content/Intent.html#ACTION_TIME_TICK

本文转自Fly_Elephant博客园博客,原文链接:http://www.cnblogs.com/xiaofeixiang/p/4083288.html,如需转载请自行联系原作者

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值