广播,相信我们都比较熟悉,小学的时候,大家一起聚集在操场上做广播体操,广播喊啥我们就做啥,但是不是所有的人都会做。某些学生偷懒的话他就不会去做,还有些特殊人群:老师,他们是不需要做的。
这里面涉及到了三种情况:
1. 听到广播操口令按照规则去做的学生-----他们对广播消息进行了处理操作。
2.听到广播口令不去做的偷懒的学生------他们接收到了广播消息不进行处理。
3.老师-----他们其实也接收到了广播消息,也没进行处理。
其实2和3可以归结为一种情况:不处理广播消息。
android 中的广播机制其实和这个差不多:首先,广播是播给所有的应用程序的。应用程序可以根据自身的状况来选择是否需要进行对广播消息进行处理操作。
下面我们一起来看看如何创建一个广播消息:
新建广播消息有两种方式:
1.通过manifest.xml文件进行注册。
2 .动态的进行注册和销毁广播消息。
为什么会有两种方式呢?主要是因为在第一种情况下会出现一些意外的情况,比如说我的一个activity中调用一个button来启动一个camera拍照操作,camera 拍照完成后广播camera的拍照信息,当前的activity然后接受广播消息来进行处理操作,比如说进行打包发送等等。这种情况就是camera拍照之后会有一个广播消息,该广播消息发送之后,不管我前面提得activity是激活的还是销毁的都会受到广播消息,然后激活(可能会有一个界面操作)。假如我仅仅想拍照操作,并不需要进行之前的activity的一些处理的话,那该广播消息岂不是多事了?是的,的确是多事了,相当的多事了。这种情况下怎么办?那就是采用第二种方式了:我们仅仅在之前的activity处于非销毁状态下进行接受广播消息,这样单独的进行拍照操作时,之前的activity处于销毁状态的话就不会出现这种情况了。
源码:两种方式我混合在一起的,第一种方式只需要第一个button,以及manifest文件中的<receiver 所包含的部分即可。
第二种方式只需要关注两外的两个button即可。manifest中receiver 所包含的部分不需要care,在代码中已经动态注册了。
通过manifest方式:
package com.huawei.android.broadcast;
import android.app.Activity;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
public class BroadCast_1Activity extends Activity {
/** Called when the activity is first created. */
private Button mBtn = null;
private Button mBtn_Register = null;
private Button mBtn_UnRegister = null;
private BroadRec mRecvBro = new BroadRec();
public static final String ACTION_INTENT_TEST = "com.terry.broadcast.test";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mBtn = (Button)findViewById(R.id.button_1);
mBtn_Register = (Button)findViewById(R.id.Register_Bro);
mBtn_UnRegister = (Button)findViewById(R.id.UnRegister_Bro);
/**
* 通过manifest 方式进行发送广播,广播接收器在manifest文件中注册。
*/
mBtn.setOnClickListener(new Button.OnClickListener(){
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent intent = new Intent();
intent.setAction(ACTION_INTENT_TEST);
sendBroadcast(intent);
}
});
/**
* 通过动态方式进行注册和发送广播消息。
*/
mBtn_Register.setOnClickListener(new Button.OnClickListener(){
public void onClick(View v){
IntentFilter intentFil = new IntentFilter();
intentFil.addAction(ACTION_INTENT_TEST);
registerReceiver(mRecvBro, intentFil);
Log.v("动态注册方式 ", "log OK");
}
});
/*
* 销毁广播接受者,不再进行注册。
* */
mBtn_UnRegister.setOnClickListener(new Button.OnClickListener(){
public void onClick(View v){
unregisterReceiver(mRecvBro);
Log.v("动态销毁方式 ", "log OK");
}
});
}
/**
* 动态注册广播消息如果再resume中进行恢复注册的话,记得在pause中进行取消注册操作。
*/
@Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
unregisterReceiver(mRecvBro);
Log.v("onPause()中取消注册广播 ", "log OK");
}
}
BroadRec.java
广播接收器,接受到广播消息进行相应的处理操作。这里我们只需要其打印出相关信息即可。
package com.huawei.android.broadcast;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
public class BroadRec extends BroadcastReceiver {
public static final String TAG = "BroadCastReceived~~~";
public BroadRec() {
Log.v("BROADCAST_TAG", "myBroadCast");
}
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
Log.d(TAG, "get received broad casted");
System.out.println(TAG);
}
}
manifest:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.huawei.android.broadcast"
android:versionCode="1"
android:versionName="1.0">
<uses-sdk android:minSdkVersion="8" />
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".BroadCast_1Activity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<receiver android:name="com.huawei.android.broadcast.BroadRec">
<intent-filter>
<action android:name="com.terry.broadcast.test"/>
</intent-filter>
</receiver>
</application>
</manifest>
其中:
<receiver android:name="com.huawei.android.broadcast.BroadRec">
<intent-filter>
<action android:name="com.terry.broadcast.test"/>
</intent-filter>
</receiver>
只在第一种方式注册广播方法中起作用,第二种方法根本用不上,可以删除之。
String字符串:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="hello">Hello World, BroadCast_1Activity!</string>
<string name="app_name">BroadCast_1</string>
<string name="buttonText">广播消息</string>
<string name="UnRegister_Bro">取消注册广播</string>
<string name="Register_Bro">注册广播</string>
</resources>
main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello"
/>
<Button
android:id="@+id/button_1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/buttonText"
/>
<Button
android:id="@+id/Register_Bro"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/Register_Bro"
/>
<Button
android:id="@+id/UnRegister_Bro"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/UnRegister_Bro"
/>
</LinearLayout>
运行结果: