HardBirch

Android提高第六篇之BroadcastReceiver

时间:10-11-10 栏目:安卓入门与提高 作者:张飞不张,文采横飞 评论:32 点击: 11,880 次

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

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


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

 


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






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

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



for(int i=0;i<lstName.length;i++)
{
String keyName=lstName[i].toString();
Log.e(keyName,String.valueOf(b.get(keyName)));
}

main.xml的代码如下:




<Button android:id="@+id/Button01" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:text="发送至内部动态注册的BroadcastReceiver"></Button>
<Button android:id="@+id/Button02" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:text="发送至内部静态注册BroadcastReceiver"></Button>
<Button android:id="@+id/Button03" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:text="发送至系统BroadcastReceiver"></Button>
</LinearLayout>

testBroadcastReceiver.java的代码如下:

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的代码如下:

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();

}
}

声明: 本文由( 张飞不张,文采横飞 )原创编译,转载请保留链接: Android提高第六篇之BroadcastReceiver

Android提高第六篇之BroadcastReceiver:目前有32 条留言

  1. 32楼
    steven_chan:

    [e01],GV继续。

    2010-11-10 10:15 [回复]
  2. 31楼
    kf156:

    [e01]强力顶上

    2010-11-10 10:18 [回复]
  3. 30楼
    hmc1985:

    [e01]不错!希望继续!

    2010-11-10 10:20 [回复]
  4. 29楼
    zyl8219302:

    [e03]不错

    2010-11-11 16:55 [回复]
  5. 28楼
    loveisbusyz:

    拜读了 好文章

    2010-11-12 11:59 [回复]
  6. 27楼
    yahier:

    [e03][e03][e03]

    2010-11-15 01:04 [回复]
  7. 26楼
    woshilaolao:

    要是能详细介绍一下android 的系统架构就好了!

    2010-11-16 15:27 [回复]
  8. 25楼
    renfujiang:

    不错的,看看,以之鼓励!

    2010-11-16 17:26 [回复]
  9. [e01]

    2010-11-17 18:53 [回复]
  10. 23楼
    bjwj8:

    [e03]讲的很不错 [e01]

    2010-11-18 16:30 [回复]
  11. 22楼
    CODER_TAL:

    [e04]

    2010-11-18 23:44 [回复]
  12. 21楼
    CODER_TAL:

    [e03]

    2010-11-18 23:44 [回复]
  13. 20楼
    CODER_TAL:

    [e02]

    2010-11-18 23:45 [回复]
  14. 19楼
    dota1000:

    [e01][e03]继续啊

    2010-12-08 15:31 [回复]
  15. 18楼
    student_cui:

    厉害
    好文章
    学习了
    谢谢搂主分享!

    2010-12-10 10:52 [回复]
  16. 跟着你走

    2010-12-21 14:28 [回复]
  17. 16楼
    koldurma:

    yahshiken

    2011-01-27 17:23 [回复]
  18. 15楼
    wtw11897:

    [e01][e03][e04]

    2011-05-15 22:41 [回复]
  19. [e10]

    2011-05-23 10:27 [回复]
  20. 13楼
    zuolongsnail:

    麻烦问一个问题哈。如果电量低时,这个Intent.ACTION_BATTERY_CHANGED是由系统来自动发送广播消息吗?

    2011-05-27 15:55 [回复]
  21. 12楼
    hellogv:

    回复 zuolongsnail:
    没做过,不过应该是

    2011-05-27 16:46 [回复]
  22. 11楼
    L_G_L:

    2011-07-11 16:07 [回复]
  23. 10楼
    jinbbk:

    不错的文章

    2011-07-15 13:59 [回复]
  24. 9楼
    Z870903:

    还好

    2011-08-10 11:25 [回复]
  25. 8楼
    sada09:

    果断顶起

    2011-08-18 11:36 [回复]
  26. 嗯,不错,受益匪浅!拜读

    2011-09-05 15:59 [回复]
  27. 一后开发时会用到

    2011-09-30 11:49 [回复]
  28. 5楼
    ying_jia:

    不错!学习了

    2011-10-31 11:27 [回复]
  29. 博主不错,你若是把你有关android的博文整理成一本书就好了,那让别人直接下个电子版的,对新手应该挺有帮助

    2011-11-04 16:15 [回复]
  30. 地板
    hellogv:

    [reply]aishen012800[/reply]
    这个很耗时,最近工作都非常忙了

    2011-11-04 23:12 [回复]
  31. 板凳
    hubenshan:

    关注。。。

    2012-02-16 13:56 [回复]
  32. 沙发
    pascal1982:

    很详细啊

    2012-06-29 16:21 [回复]

发表评论


QQ群互动

Linux系统与内核学习群:194051772

WP建站技术学习交流群:194062106

魔豆之路QR

魔豆的Linux内核之路

魔豆的Linux内核之路

优秀工程师当看优秀书籍

优秀程序员,要看优秀书!

赞助商广告

友荐云推荐