⑴ android 注冊廣播有幾種方式,這些方式有何優缺點
有兩種注冊廣播方式:
1.常駐型廣播
常駐型廣播,當應用程序關閉了,如果有廣播信息來,寫的廣播接收器同樣的能接收到,它的注冊方式就是在應用程序的AndroidManifast.xml 中進行注冊,這種注冊方式通常又被稱作靜態注冊。這種方式可以理解為通過清單文件注冊的廣播是交給操作系統去處理的。示例代碼如下:
AndroidManifest.xml中配置廣播
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="spl.broadCastReceiver"
android:versionCode="1"
android:versionName="1.0">
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".BroadCastReceiverActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<!--廣播注冊、name裡面填寫廣播類的路徑-->
<receiver android:name=".SmsBroadCastReceiver">
<intent-filter android:priority="20">
<action android:name="android.provider.Telephony.SMS_RECEIVED"/>
</intent-filter>
</receiver>
</application>
<uses-sdk android:minSdkVersion="7" />
<!-- 許可權申請 -->
<uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission>
</manifest>
2.非常駐型廣播
非常駐型廣播,當應用程序結束了,廣播自然就沒有了,比如在 Activity 中的 onCreate 或者 onResume 中注冊廣播接收者,在 onDestory 中注銷廣播接收者。這樣廣播接收者就一個非常駐型的了,這種注冊方式也叫動態注冊。這種方式可以理解為通過代碼注冊的廣播是和注冊者關聯在一起的。比如寫一個監聽 SDcard 狀態的廣播接收者:
package cn.sunzn.mosecurity.activity;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.os.Environment;
public class SDcard extends Activity {
SdcardStateChanageReceiver sdcardStateReceiver;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
sdcardStateReceiver = new SdcardStateChanageReceiver();
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_MEDIA_REMOVED);
filter.addAction(Intent.ACTION_MEDIA_EJECT);
filter.addAction(Intent.ACTION_MEDIA_MOUNTED);
filter.addDataScheme("file");
registerReceiver(sdcardStateReceiver, filter);
}
protected void onDestroy() {
unregisterReceiver(sdcardStateReceiver);
}
class SdcardStateChanageReceiver extends BroadcastReceiver {
public void onReceive(Context context, Intent intent) {
checkSDCard();
}
public void checkSDCard() {
String state = Environment.getExternalStorageState();
System.out.println(state);
if (state.equals(Environment.MEDIA_REMOVED) || state.equals(Environment.MEDIA_UNMOUNTED)) {
System.out.println("SDCard 已卸載!");
}
}
}
}
⑵ 12、注冊廣播有幾種方式,這些方式有何優缺點請談談Android引入廣播機制的用意。
注冊廣播的分類:靜態注冊和動態注冊。
靜態注冊:在清單文件里直接注冊,從app開啟到app銷毀,一直在接收廣播,接收廣播時間長,但是接收廣播的優先順序低於動態注冊廣播。
動態注冊:動態注冊,動態銷毀,從onCreate到取消注冊,期間接收廣播,接收廣播時間是短且可控,接收廣播的優先順序高。例如:
發送廣播:
Intent i = new Intent();
i.setAction("ACTION_CLOSE");
sendBroadcast(i);
接受廣播:
onCreate(){
//注冊廣播的接受者
IntentFilter filter = new IntentFilter();
filter.addAction("ACTION_CLOSE_ACTIVITY");
receiver = new InnerReceiver();
registerReceiver(receiver, filter);
}
private class InnerReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//TODO 當前Activity接收到廣播 需要做的事情
}
}
}
//注銷廣播
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(receiver);
}
2.引入廣播的原因:
a) 不同的app之間傳信通用
b)發出一條指定,需要多個Activity都需要有反應
注意:以上僅供參考,如有疑問,請追問,謝謝。
⑶ 注冊廣播有幾種方式,這些方式有何優缺點
BroadcastReceiver用於監聽被廣播的事件
必須被注冊,有兩種方法:
1、在應用程序的代碼中注冊
注冊BroadcastReceiver:
registerReceiver(receiver,filter);
取消注冊BroadcastReceiver:
unregisterReceiver(receiver);
當BroadcastReceiver更新UI,通常會使用這樣的方法注冊。啟動Activity時候注冊BroadcastReceiver,Activity不可見時候,取消注冊。
2、在androidmanifest.xml當中注冊
<receiver>
<intent-filter>
<action android:name = "android.intent.action.PICK"/>
</intent-filter>
</receiver>
1)第一種不是常駐型廣播,也就是說廣播跟隨程序的生命周期。
2)第二種是常駐型,也就是說當應用程序關閉後,如果有信息廣播來,程序也會被系統調用自動運行。
使用這樣的方法注冊弊端:它會始終處於活動狀態,畢竟是手機開發,cpu和電源資源比較少,一直處於活動耗費大,不利。