1、 廣播:發送方只管發送數據,而不關心數據是否被接收方接收以及接收方接收數據後是如何處理的。
2、 Android廣播流程:寫一個類,繼承BroadcastReceiver,覆寫裡面的onReceive方法,然後在AndroidManifest.xml中進行配置,
配置中有個<intent-filter>標簽,用來過濾用戶請求過來的廣播,用戶通過sendBroadcast發送廣播對象,接收一個Intent參數對象,該
Intent參數需要指定Action,以便在<intent-filter>接收,然後到相應的廣播類中進行處理。
[java]
package com.broadcast.test;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
public class MyBroadcast extends BroadcastReceiver{
public MyBroadcast(){
System.out.println("MyBroadcast");
}
@Override
public void onReceive(Context context, Intent intent) {
System.out.println("onReceive is start");
}
}
在AndroidMainifest.xml中進行配置:
[java]
<receiver android:name=".MyBroadcast">
<intent-filter>
<action android:name="android.intent.action.EDIT"/>
</intent-filter>
</receiver>
測試廣播類:
[java]
public class MainActivity extends Activity {
Button button=null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
button=(Button)findViewById(R.id.broad);
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent();
//與AndroidManifest.xml中的intent-filter是否匹配
intent.setAction(Intent.ACTION_EDIT);//android.intent.action.EDIT
sendBroadcast(intent);//發送廣播
}
});
}
}
3、 每次接收廣播,都會生成一個新的BroadcastReceiver對象,如果我們自定義Broadcast繼承BroadcastReceiver,那麼每次廣播
,都會生成新的對象,執行完onReceive處理完後,這個對象將不會再使用了。
4、 BroadcastReceiver用於監聽被廣播的事件,這種事件一般是通過Intent的方式來接收的,為了達到這個目的,
BroadcastReceiver必須進行注冊,注冊的方法有兩種:
1)在應用程序的代碼當中進行注冊
registerReceiver(receiver,IntentFilter);
取消注冊:unregisterReceiver(receiver);
這種方式比較靈活,我們需要的時候就可以進行注冊,不需要的時候將其關閉即可,例如一個BroadcastReceiver用於更新UI,通常會使用這種
方式進行注冊,在Activity啟動的時候注冊,在Activity不可見以後取消注冊。
定義BroadcastReceiver類:
[java
package com.broad.test;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
public class SMSReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
System.out.println("receive message");
//處理短信信息
// Bundle bundle=intent.getExtras();
// Object[] myOBJpdus=(Object[])bundle.get("pdus");
// SmsMessage[] message=new SmsMessage[myOBJpdus.length];
// System.out.println("message length="+message.length);
// for(int i=0;i<myOBJpdus.length;i++){
// message[i]=SmsMessage.createFromPdu((byte[])myOBJpdus[i]);
// System.out.println(message[i].getDisplayMessageBody());
// }
}
}
通過代碼注冊BroadcastReceiver:
[java]
/**
* 通過代碼注冊BroadcastReceiver
* @author Administrator
*
*/
public class MainActivity extends Activity {
private Button register=null;
private Button unregister=null;
private SMSReceiver smsReceiver=null;
private static final String SMS_ACTION="android.provider.Telephony.SMS_RECEIVED";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
register=(Button)findViewById(R.id.register);
register.setOnClickListener(new RegisterReceiverListener());
unregister=(Button)findViewById(R.id.unregister);
unregister.setOnClickListener(new UnRegisterReceiverListener());
}
class RegisterReceiverListener implements OnClickListener{
@Override
public void onClick(View v) {
smsReceiver=new SMSReceiver();
IntentFilter filter=new IntentFilter();
//為IntentFilter添加一個Action,相當於在AndroidMainifest.xml中的Intent-filter
filter.addAction(SMS_ACTION);
registerReceiver(smsReceiver, filter);
}
}
class UnRegisterReceiverListener implements OnClickListener{
@Override
public void onClick(View v) {
unregisterReceiver(smsReceiver);
}
}
}
2)在AndroidManifest.xml中進行注冊(見上面)
<receiver android:name=".MyReceiver">
<intent-filter android:priority="800">
<action android:name="com.android.action.self"/>
</intent-filter>
</receiver>
第二種方式注冊BroadcastReceiver的一個最大的特點是當我們的應用程序關閉後,這個BroadcastReceiver仍然會接收廣播,它不會隨應用程
序的關閉而停止,而處於一種活動狀態,例如監聽我們手機電池電量
5、 Android中內置了大量的BroadcastReceiver Action,在Android API的Intent中,用於幫助開發者監聽手機上所發生的各種事件
,例如發送和接收短信、照相等等
6、 對於耗時比較長的邏輯不適合寫在onReceive中用BroadcastReceiver來進行處理,我們可以使用Service。