Android学习之路——Broadcast Receiver

Broadcast Receiver是Android四大组件之一,是Android操作系统给我们提供的一个在组件和组件之间通信的机制。Broadcast Receiver不仅可以在一个程序内部进行通信,还可以再应用程序之间进行通信。比如在某个程序消耗电量非常的多时候,可以添加这个组件进行监听,当低电量的时候可以关闭该功能。也可以监听短信的接受,当收到短信时,可以对用户进行提醒。还有就是操作系统启动完成,同样可以监听到,进而进行一系列操作。
特点:传递的信息小,频率低
Broadcast Receiver不能用来传递大数据或者高频率数据,否则会造成程序运行速度慢、等等一系列问题。

使用:

Broadcast Receiver的注册分为两种:静态注册,动态注册。

静态注册

静态注册非常简单,只需要在AndroidManifest.xml文件中添加注册信息即可。例如:在application中添加:

<receiver android:name="MyBC"></receiver>

接着创建一个BroadcastReceiver类,用来接收广播即可,如:

public class MyBroadcast extends BroadcastReceiver {

    // 广播接收器收到消息,执行下面的方法
    @Override
    public void onReceive(Context context, Intent intent) {
        System.out.println("onReceive");
    }
}

最后就是在需要发送广播的地方添加sendbroadcast(Intent)方法即可,例如此处我是用MainActivity发送广播,并且携带信息:

                Intent i = new Intent(MainActivity.this,MyBroadcast.class);
                i.putExtra("txt", "Hello World!");
                // 发送一个广播
                sendBroadcast(i);

从MyBroadcast中的onReceive()方法中得到MainActivity传来的消息:

        System.out.println("onReceive,data = "+intent.getStringExtra("txt"));

就可以得到Activity传来的信息了。

动态注册:

下面是Activity和Service之间的通信:
MainActivity:

public class MainActivity extends ActionBarActivity implements OnClickListener {

    private Button btnActivitySendBC,btnServiceSendBC,btnRegBC,btnUnRegBC;
    //实例化一个Broadcast对象
    private static final MyBroadCast ActivityBC = new MyBroadCast(); 
    private IntentFilter filter = new IntentFilter();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 获得控件
        btnActivitySendBC = (Button) findViewById(R.id.btnActivitySendBC);
        btnServiceSendBC = (Button) findViewById(R.id.btnServiceSendBC);
        btnRegBC = (Button) findViewById(R.id.btnRegBC);
        btnUnRegBC = (Button) findViewById(R.id.btnUnRegBC);
        // 对控件进行监听
        btnActivitySendBC.setOnClickListener(this);
        btnServiceSendBC.setOnClickListener(this);
        btnRegBC.setOnClickListener(this);
        btnUnRegBC.setOnClickListener(this);

        // 发送广播的时候,定义这一个广播的动作,可以理解为一个地址
        filter.addAction(MyBroadCast.ATS);
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public void onClick(View v) {
        // 监听按钮
        switch (v.getId()) {
        case R.id.btnActivitySendBC:
            // 发送一个广播
            sendBroadcast(new Intent(MyBroadCast.ATS));
            System.out.println("btnActivitySendBC");
            break;
        case R.id.btnServiceSendBC:
            // 启动Service
            startService(new Intent(MainActivity.this, MyService.class));
            System.out.println("btnServiceSendBC");
            break;  
        case R.id.btnRegBC:
            // 注册一个广播
            System.out.println("btnRegBC");
            registerReceiver(ActivityBC, filter);
            break;
        case R.id.btnUnRegBC:
            // 注销一个广播
            System.out.println("btnUnRegBC");
            unregisterReceiver(ActivityBC);
            break;
        }
    }

    @Override
    protected void onDestroy() {
        //Activity停止的时候,注销Service
        stopService(new Intent(MainActivity.this, MyService.class));
        super.onDestroy();
    }
}

MyService:

public class MyService extends Service {

    private static final MyBroadCast ServiceBC = new MyBroadCast(); // 实例化一个广播对象
    private IntentFilter serviceFilter = new IntentFilter();


    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        System.out.println("onStartCommand");

        serviceFilter.addAction(MyBroadCast.STA); // 添加动作
        registerReceiver(ServiceBC, serviceFilter); // 注册Broadcast
        sendBroadcast(new Intent(MyBroadCast.STA));// 发送Broadcast

        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public void onDestroy() {
        // Service停止的时候,注销BroadcastReceiver
        unregisterReceiver(ServiceBC);
        System.out.println("onDestroy");
        super.onDestroy();
    }

}

一个继承BroadcastReceiver的类MyBroadcast:

public class MyBroadCast extends BroadcastReceiver{
    // 定义两个动作,命名规则:“包名.intent.action.动作名称”
    public static final String STA = "com.edu.usingbc.intent.action.STA";
    public static final String ATS = "com.edu.usingbc.intent.action.ATS";

    @Override
    public void onReceive(Context context, Intent intent) {
        // 判断是谁给谁发广播
        if (intent.getAction() == STA) {
            System.out.println("Service Send a BroadCast to Activity!");
        }else if (intent.getAction() == ATS) {
            System.out.println("Actiity Send a BroadCast to Service!");
        }
    }

}

Activity_main.xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.edu.usingbcagains.MainActivity" >

    <Button
        android:id="@+id/btnActivitySendBC"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="ActivitySendBroadCast" />

    <Button
        android:id="@+id/btnServiceSendBC"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="ServiceSendBroadCast" />

    <Button
        android:id="@+id/btnRegBC"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="RegBC" />

    <Button
        android:id="@+id/btnUnRegBC"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="UnRegBC" />

</LinearLayout>

下面是程序运行截图:这里写图片描述

测试:首先点击RegBC按钮,注册广播,然后点击ActivitySendBC按钮,可以看到Logcat输出信息为:Actiity Send a BroadCast to Service,点击UnRegBC按钮注销掉Activity的Broadcast。点击ServiceSendBC,可以看到Logcat输出信息为:Service Send a BroadCast to Activity。
小结
注册一个动态的BroadcastReceiver步骤:
registerReceiver(ActivityBC, filter); // ActivityBC为一个Broadcast的实例对象 , filter为一个动作
sendBroadcast(intent);// intent为一个动作,向哪个动作发送广播
最后就是在onReceive()方法中进行接收广播了。(所有的广播都在这个方法中,判断Action,可以分别出不同广播)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值