BroadcastReceiver
概述.
BroadcastReceiver也就是“广播接收者”的意思,顾名思义,它就是用来接收来自系统和应用中的广播。
在Android系统中,广播体现在方方面面,例如当开机完成后系统会产生一条广播,接收到这条广播就能实现开机启动服务的功能;当网络状态改变时系统会产生一条广播,接收到这条广播就能及时地做出提示和保存数据等操作;当电池电量改变时,系统会产生一条广播,接收到这条广播就能在电量低时告知用户及时保存进度,等等。
若发送数据频率高,或者传递大数据,绝对不能使用broadcast
Android中的广播机制设计的非常出色,很多事情原本需要开发者亲自操作的,现在只需等待广播告知自己就可以了,大大减少了开发的工作量和开发周期。而作为应用开发者,就需要数练掌握Android系统提供的一个开发利器,那就是BroadcastReceiver。
文档:
android.content.BroadcastReceiver |
http://developer.android.com/reference/android/content/BroadcastReceiver.html
新建一个BroadCastReceiver
建立一个继承 BroadCastReceiver 的类 MyBC
里面会有个onReceive方法
public class MyBC extends BroadcastReceiver
{
@Override
public void onReceive(Context context, Intent intent)
{
System.out.println("onReceive()");
}
}
再去AndroidManifest.xml的Application目录下进行注册一个Receiver结点
或者写代码,代码是这样的
<receiver android:name="MyBC"></receiver>
注意,这种方式的注册是常驻型的,也就是说当应用关闭后,如果有广播信息传来,MyReceiver也会被系统调用而自动运行。
给BroadCastReceiver发送消息
使用函数 sendBroadCast(Intent intent)
sendBroadCastBtn.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
Intent i = new Intent(MainActivity.this, MyBC.class);
sendBroadcast(i);
}
});
启动应用 发现当 点击按钮时 MyBC的 onReceive()方法被调用了
如果想传递数据 sendBroadcast之前 在 intent中加入参数就行了 ,在对应的onReceive()中取出
动态注册和注销广播接收器
当不希望接收器一直存在时 应该使用动态注册和注销 .可以随时注册和注销
首先注释掉静态注册时 在AndroidManifest中添加的Receiver结点.
动态注册广播接收器
registerReceiver(mybc, new IntentFilter(mybc.ACTION));
参数1是广播接收器对象 参数2是是一个IntentFilter,用来设置广播的地址.
这里我在MyBC中设了个字符串常量当地址.
虽然这个可以随意设置,但还是写规范点好: 广播接收器的包名.intent.action.类名
public class MyBC extends BroadcastReceiver
{
public static final String ACTION = "cn.zyh.usingbc.intent.action.mybc";
...
这种注册后发送广播可以用更便捷的方式,直接用Action构造intent,不需要类名 .
Intent i = new Intent(MyBC.ACTION);
i.putExtra("txt", "hello");
sendBroadcast(i);
动态注销广播接收器
unregisterReceiver(mybc);
============================================================
Activity
package cn.zyh.usingbc;
import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.content.IntentFilter;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class MainActivity extends Activity
{
private Button sendBroadCastBtn, regBCRBtn, unregBCRBtn;
private final MyBC mybc = new MyBC();
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
sendBroadCastBtn = (Button) findViewById(R.id.sendBtn);
regBCRBtn = (Button) findViewById(R.id.registBtn);
unregBCRBtn = (Button) findViewById(R.id.unregistBtn);
sendBroadCastBtn.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
// Intent i = new Intent(MainActivity.this, MyBC.class);
Intent i = new Intent(MyBC.ACTION);
i.putExtra("txt", "hello");
sendBroadcast(i);
}
});
regBCRBtn.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
registerReceiver(mybc, new IntentFilter(mybc.ACTION));
// IntentFilter 给接收器指定一个地址 ,向这个地址发送的广播是可以真听到的
}
});
unregBCRBtn.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
unregisterReceiver(mybc);
}
});
}
@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;
}
}
MyBC
package cn.zyh.usingbc;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
public class MyBC extends BroadcastReceiver
{
public static final String ACTION = "cn.zyh.usingbc.intent.action.mybc";
@Override
public void onReceive(Context context, Intent intent)
{
System.out.println("onReceive()");
String result = intent.getStringExtra("txt");
System.out.println(result);
}
}