组件------BroadcastReceiver
1、Broadcast(广播)介绍:
---是一种广泛运用在程序之间传输信息的机制。
2、-BroadcastReceiver广播接收者:
---是对发送出来的广播进行过滤接收并相应的一类组件,他就是用来接收来自系统和应用的广播。
3、用途:减少工作量和开发周期
---开机完成后系统会产生一条广播;(开机启动)
---当网络状态改变时系统会产生一条广播;()
---电量改变系统会发送一个广播
普通广播(无序)特点:
——同级别接收先后是随机的
——级别低的后收到广播
——接收器不能截断广播的继续传播,也不能处理广播。
——同级别动态注册高于静态注册
有序广播特点:
——同级别接受顺序是随机的。
——能截断广播的继续传播,高级别的广播接收器收到该广播后,可以决定是否截断
——接收器能截断广播的继续传播,也能处理广播
——同级别动态注册高于静态注册
补充:四大组件只有广播有两种注册方式!!!!
使用方法:
1、发送:
——首先在需要发送信息的地方,把要发送的信息和用于过滤的信息(如Action、Category)装入一个intent对象,
——然后通过调用:
Context.sendBroadcast()——//发送一条无序的广播
sendOrderBroadcast()——//发送一条有序的广播
sendStickyBroadcast()——//发送一条异步的广播
某一个方法,把Intent对象以广播方式发送出去。
2、接收:
——当Intent发送以后,所有已注册的BroadcastReceiver会检查注册时的IntentFilter是否与发送的Intent相匹配,
——若匹配则就会调用BroadcastReceivce的onReceiver()方法。
注意:BroadcastReceivce需要注册(静态或动态) 一些详细步骤:
静态注册:<receiver android:name="com.zxx.service.Reeciver">
设置优先级: <intent-filter android:priority="100"/>——默认是(-1000,1000)
设置过滤: <action android:name="zxx" />
动态注册:(代码没执行不会接收广播) ——>结束时一定要取消注册;
IntentFilter filter=new IntentFilter("aaaa");
Reeciver mreeciver=new Reeciver();
registerReceiver(mreeciver,filter);
????动态设置优先级???
数据处理:
Bundle类
bundle.putString("test", "广播处理的数据");
setResultExtras(bundle);
getResultExtras(true);
截断广播:abortBroadcast();
异步广播:(粘滞性滞留广播)当处理完厚度Intent,任然存在。这时候registerReceiver(reeciver,filter)还能收到他的值
直到你把他去掉,不能将处理结果传给下一个接收者,无法终止广播。
异步广播要加权限 : <uses-permission android:name="android.permission.BROADCAST_STICKY" />'
发送异步广播:sendStickyBroadcast(intent3);
!!!!注意!!!!:
——BroadcastReceiver生命周期只有10秒左右
——在BroadcastReceiver不能做比较耗时的操作
——应该通过发送Intent给Service让Service完成
——不能子线程
代码:
import android.app.Activity;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
IntentFilter filter = new IntentFilter("zxx");
BCR2 bcr2 = new BCR2();
registerReceiver(bcr2, filter);
}
public void doClick(View v) {
switch (v.getId()) {
case R.id.receiver1:
Intent mintent1 = new Intent();
mintent1.putExtra("R.id.receiver1", "这是一条无序广播!!");
mintent1.setAction("zxx");
sendBroadcast(mintent1);// 发送一条无序的广播
Log.i("tag", "点击了");
break;
case R.id.receiver2:
Intent mintent2 = new Intent();
mintent2.putExtra("R.id.receiver2", "这是一条有序广播!!");
mintent2.setAction("zxx");
sendOrderedBroadcast(mintent2, null);// 这是一条有序广播!!
Log.i("tag", "点击了");
break;
case R.id.receiver3:
Intent mintent3 = new Intent();
mintent3.putExtra("R.id.receiver3", "这是一条异步广播!!");
mintent3.setAction("zxx");
sendStickyBroadcast(mintent3);// 这是一条异步广播!!
IntentFilter filter = new IntentFilter("zxx");
BCR3 bcr3 = new BCR3();
registerReceiver(bcr3, filter);
break;
default:
break;
}
}
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
unregisterReceiver(new BCR1());
}
@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 boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}
广播1类:
package zxx.Broadcast;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
public class BCR1 extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String s=intent.getStringExtra("R.id.receiver1");
Log.i("tag", "BCR1"+s);
Bundle bundle = getResultExtras(true);
String s2 = bundle.getString("test");
Log.i("tag", "BCR1接收到值:"+s2);
}
}
广播2类:
package zxx.Broadcast;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
public class BCR2 extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String s=intent.getStringExtra("R.id.receiver2");
Log.i("tag", "BCR2"+s);
//abortBroadcast();//截断一条有序广播
Bundle bundle = new Bundle();
bundle.putString("test", "广播处理的数据");
setResultExtras(bundle);
}
}
异步广播基本相似:
清单文件中的静态注册:
<pre class="html" name="code"><pre class="html" name="code"><receiver android:name="zxx.Broadcast.BCR1" >
<intent-filter
>
<action android:name="zxx" />
</intent-filter>
</receiver>
布局文件只有三个按钮