- 2016年12月8日,Google中国开发者大会在京举行,同时正式上线了Google中国开发者网站Google Developers,查看官方学习资源再也不用爬梯子了
- 简介
- 生命周期
- 自定义广播
简介
在Android中,Broadcast是一种广泛运用的在应用程序之间传输信息的机制。而BroadcastReceiver是对发送出来的Broadcast进行过滤接受并响应的一类组件。
广播接收者(BroadcastReceiver)用于接收广播Intent的, 广播Intent的发送是通过调用sendBroadcast/sendOrderedBroadcast来实现的。通常一个广播Intent可以被订阅了此Intent的多个广播接收者所接收。
生命周期
广播接收者也是运行在主线程中,所以在广播接收者的onReceive方法内不能有耗时的操作,需要放在子线程中做,但是onReceive的生命周期很短,有可能广播接收者结束,子线程还没有结束,这时广播接收者所在进程很有可能被杀掉,这样子线程就会出问题,所以耗时操作最好放到service服务中。
广播接收者的生命周期是非常短暂的,在接收到广播的时候创建,onReceive()方法结束之后销毁。
广播接收者中不要做一些耗时的工作,否则会弹出ANR错误对话框。
最好也不要在广播接收者中创建子线程做耗时的工作,因为广播接收者被销毁后进程就成为了空进程,很容易被系统杀掉。
自定义广播
无序广播:
所有接收无序广播的广播接收者在此广播被发送时均能接收到此广播,并且是同时接收到。无序广播不可以被拦截,如果被拦截的话会报错:
BroadcastReceiver trying to return result during a non-ordered broadcast
public void sendBroadcast(View view){
//定义一个意图
Intent intent = new Intent();
//设置Action
intent.setAction("com.gunther.broadcast");
//绑定数据
intent.putExtra("data", "我是无序广播数据");
//发送无序广播
sendBroadcast(intent);
}
注意:
- 符号某广播条件的所有广播接收者的特点,无序,无优先级,不可中断,不可传递数据。
- 广播时可设置接收者权限,仅当接收者含有权限才能接收。
- 接收者的<receiver>也可设置发送方权限,只接收含有权限应用的广播Receiver节点增加属性permission。
- 发送广播时,通过intent.setFlags(intent.flag_include_stopped_pakeages),包含从未启动过的程序,这样设置,可以让从未启动的接收者也收到广播。
有序广播:
- 无序广播使用sendOrderedBroadcast方法来发送。
- 接收者可以在<intent-filter>中定义android:priority定义优先级,数字越大优先级越高,优先级的取值范围是: 1000(最高) ~ -1000(最低)谷歌规定最大是1000,但是他的类型其实是int。
系统默认优先级是0,那么想在系统程序之前接收到广播,那么就设置大于0的数,相同优先级下,接收的顺序要看在清单文件中声明注册的顺序。 - 有序广播可以被拦截或添加数据,优先级高的接收者可以拦截优先级低的 ,使用abortBroadcast方法拦截, 添加数据:通过bundle传递。
前面的接收者可以将数据通过setResultExtras(Bundle)方法存放进结果对象,
然后传给下一个接收者,下一个接收者通过代码:Bundle bundle = getResultExtras(true))可以获取上一个接收者存入在结果对象中的数据。
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void sendOrder(View view) {
Intent intent = new Intent();
intent.setAction("com.gunther.data");
sendOrderedBroadcast(intent, null, null,
null, RESULT_OK, "1万元钱", null);
}
public class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
String resultData = getResultData();
Toast.makeText(context, "MyReceiver接收到"+action+"发布的广播:"+resultData, 1).show();
}
}