您的位置:首页 > 其它

BroadcastReceiver(广播接收器 )

2015-02-04 00:01 274 查看
BroadcastReceiver(广播接收器)

一、广播机制介绍:

BroadcastReceiver分为标准广播和有序广播。

标准广播是一种完全异步执行的广播,当广播发出后,所有的广播接受器都同时收到此广播。

有序广播是一种同步执行的广播,同一时刻只会有一个广播接收器能接收到此广播,当前广播接受器执行完内部逻辑后,才会下发下去。有序广播是根据优先级来设置优先收到广播的广播接收器。

注册广播分为两种:

1、在代码中注册(动态广播)
动态广播好处就是非常灵活,缺点就是必须程序启动后才能接受广播,所以一些不启动程序就能接受广播的业务就需要静态广播来实现。

2、在AndroidManifest.xml中进行注册(静态广播)

二、接受系统广播

动态广播

packagecom.example.broadcastreceiveractivity;
importandroid.content.BroadcastReceiver;
importandroid.content.Context;
importandroid.content.Intent;
importandroid.content.IntentFilter;
importandroid.net.ConnectivityManager;
importandroid.net.NetworkInfo;
importandroid.os.Bundle;
importandroid.support.v7.app.ActionBarActivity;
importandroid.widget.Toast;
publicclassMainActivityextendsActionBarActivity{
	publicIntentFilterintent;
	publicNetWorkBroadcastReceivernetwork;
@Override
	protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
intent=newIntentFilter();
intent.addAction("android.net.conn.CONNECTIVITY_CHANGE");
network=newNetWorkBroadcastReceiver();
//注册广播接收器
registerReceiver(network,intent);
}
	publicvoidonDestroy(){
super.onDestroy();
unregisterReceiver(network);
}
	//广播接收者
	classNetWorkBroadcastReceiverextendsBroadcastReceiver{
@Override
publicvoidonReceive(Contextarg0,Intentarg1){
	//TODOAuto-generatedmethodstub
	//Toast.makeText(getApplicationContext(),"网络发生变化了~亲",1).show();
	ConnectivityManagerconn=(ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
	NetworkInfonetworkInfo=conn.getActiveNetworkInfo();
	if(networkInfo!=null&&networkInfo.isAvailable()){
Toast.makeText(getApplicationContext(),"已连接网络",1).show();
}else{
Toast.makeText(getApplicationContext(),
"无法连接网络",1).show();
}
}
}
}


<uses-permissionandroid:name="android.permission.ACCESS_NETWORK_STATE"/>


静态广播

packagecom.example.broadcastreceiver;
importandroid.content.BroadcastReceiver;
importandroid.content.Context;
importandroid.content.Intent;
importandroid.widget.Toast;
publicclassStaticBroadcastextendsBroadcastReceiver{
@Override
	publicvoidonReceive(Contextarg0,Intentarg1){
//TODOAuto-generatedmethodstub
Toast.makeText(arg0,"开机启动后自动调用这个静态广播",1).show();
}
}


<?xmlversion="1.0"encoding="utf-8"?>
<manifestxmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.broadcastreceiveractivity"
android:versionCode="1"
android:versionName="1.0">
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="21"/>
<uses-permissionandroid:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permissionandroid:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme">
<activity
android:name=".MainActivity"
android:label="@string/app_name">
<intent-filter>
<actionandroid:name="android.intent.action.MAIN"/>
<categoryandroid:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<receiverandroid:name="com.example.broadcastreceiver.StaticBroadcast">
<intent-filter>
<actionandroid:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>
</application>
</manifest>


三、发送自定义广播.

3.1发送标准广播

packagecom.example.broadcastreceiver;
importandroid.content.BroadcastReceiver;
importandroid.content.Context;
importandroid.content.Intent;
importandroid.widget.Toast;
publicclassMyBroadcastReceiverextendsBroadcastReceiver{
@Override
	publicvoidonReceive(Contextarg0,Intentarg1){
//TODOAuto-generatedmethodstub
Toast.makeText(arg0,"收到了标准广播,广播内容为:"+arg1.getStringExtra("msg"),1).show();
}
}


<?xmlversion="1.0"encoding="utf-8"?>
<manifestxmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.sendbroadcastreceiver"
android:versionCode="1"
android:versionName="1.0">
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="21"/>
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme">
<activity
android:name=".MainActivity"
android:label="@string/app_name">
<intent-filter>
<actionandroid:name="android.intent.action.MAIN"/>
<categoryandroid:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<receiverandroid:name="com.example.broadcastreceiver.MyBroadcastReceiver">
<intent-filter>
<actionandroid:name="com.example.broadcastreceiver.MY_BROADCASTRECEIVER"/>
</intent-filter>
</receiver>
</application>
</manifest>


<RelativeLayoutxmlns: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:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.sendbroadcastreceiver.MainActivity">
<Button
android:id="@+id/sendBR"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="发送一个普通广播">
</Button>
</RelativeLayout>


packagecom.example.sendbroadcastreceiver;
importandroid.content.Intent;
importandroid.os.Bundle;
importandroid.support.v7.app.ActionBarActivity;
importandroid.view.Menu;
importandroid.view.MenuItem;
importandroid.view.View;
importandroid.widget.Button;
publicclassMainActivityextendsActionBarActivity{
@Override
	protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Buttonbutton=(Button)findViewById(R.id.sendBR);
button.setOnClickListener(newView.OnClickListener(){
@Override
	publicvoidonClick(Viewarg0){
//TODOAuto-generatedmethodstub
Intentintent=newIntent(
"com.example.broadcastreceiver.MY_BROADCASTRECEIVER");
//传递一些数据
intent.putExtra("msg","快交房租啦!!");
//发送一个标准广播
sendBroadcast(intent);
}
});
}
}


运行效果为:



3.2发送有序广播

Intentintent=newIntent("com.example.broadcastreceiver.MY_BROADCASTRECEIVER");
//传递一些数据
intent.putExtra("msg","发送有序广播!!!");
//发送一个有序广播
sendOrderedBroadcast(intent,null);


有序广播是根据android:priority来设置广播接收器的优先级。

<receiverandroid:name="com.example.broadcastreceiver.MyBroadcastReceiver">
<intent-filterandroid:priority="1000">
<actionandroid:name="com.example.broadcastreceiver.MY_BROADCASTRECEIVER"/>
</intent-filter>
</receiver>


如果截断广播,终止广播传递,则调用abroadcast();即可,e.g.

packagecom.example.broadcastreceiver;
importandroid.content.BroadcastReceiver;
importandroid.content.Context;
importandroid.content.Intent;
importandroid.widget.Toast;
publicclassMyBroadcastReceiverextendsBroadcastReceiver{
@Override
	publicvoidonReceive(Contextarg0,Intentarg1){
//TODOAuto-generatedmethodstub
Toast.makeText(arg0,arg1.getStringExtra("msg"),1).show();
//截断此广播,终止传递
abortBroadcast();
}
}


3.3发送本地广播

packagecom.example.sendbroadcastreceiver;
importandroid.content.BroadcastReceiver;
importandroid.content.Context;
importandroid.content.Intent;
importandroid.content.IntentFilter;
importandroid.os.Bundle;
importandroid.support.v4.content.LocalBroadcastManager;
importandroid.support.v7.app.ActionBarActivity;
importandroid.view.View;
importandroid.widget.Button;
importandroid.widget.Toast;
publicclassMainActivityextendsActionBarActivity{
	privateIntentFilterintentFilter;
	privateLocalReceiverlocalReceiver;
	privateLocalBroadcastManagerlocalBroadcastManager;
@Override
	protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButtonbuttonLocation=(Button)findViewById(R.id.sendLocationBR);
localBroadcastManager=LocalBroadcastManager.getInstance(this);
intentFilter=newIntentFilter();
intentFilter.addAction("com.example.broadcastreceiver.MY_LOCAL_BROADCASTRECEIVER");
localReceiver=newLocalReceiver();
localBroadcastManager.registerReceiver(localReceiver,intentFilter);
buttonLocation.setOnClickListener(newView.OnClickListener(){
@Override
	publicvoidonClick(Viewarg0){
//TODOAuto-generatedmethodstub
Intentintent=newIntent(
"com.example.broadcastreceiver.MY_LOCAL_BROADCASTRECEIVER");
//传递一些数据
intent.putExtra("msg","发送本地广播!!!");
localBroadcastManager.sendBroadcast(intent);
}
});
}
	publicvoidonDestroy(){
super.onDestroy();
localBroadcastManager.unregisterReceiver(localReceiver);
}
	classLocalReceiverextendsBroadcastReceiver{
@Override
publicvoidonReceive(Contextarg0,Intentarg1){
	//TODOAuto-generatedmethodstub
	Toast.makeText(getApplicationContext(),arg1.getStringExtra("msg"),
	Toast.LENGTH_LONG).show();
}
}
}


针对广播接受者写了一个demo,下载地址如下

链接:http://pan.baidu.com/s/1qWLoIoG密码:h80m
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: