1. 程式人生 > >安卓開發-Broadcast接受者+六種常見Broadcast接受者案例+程序的優先順序

安卓開發-Broadcast接受者+六種常見Broadcast接受者案例+程序的優先順序

《一:廣播接受者》

1.自定義廣播

1.1:自定義一個類ReceiverBroadcast,並繼承BroadcastReceiver:
//接收方
    public class ReveiverBroadcast extends BroadcastReceiver{

        @Override
        public void onReceive(Context context, Intent intent) {
            Log.v("aaa", "接收到廣播了");
        }

    }
1.2:在AndroidManifest.xml中配置:
<receiver android:name="com.m520it.receiverbroadcast.ReveiverBroadcast">
  <intent-filter >
     <action android:name="com.m520it.receiverbroadcast.action.receiver"/>
  </intent-filter>
 </receiver>
1.3:隱式指定action(隱式意圖用在跨應用中,因為無法拿到其他應用的元件名)【傳送和接收在同一個應用中時可用顯示意圖】,併發送廣播:
//傳送方
Intent intent = new Intent("com.m520it.receiverbroadcast.action.receiver");
sendBroadcast(intent);


2.有序廣播和無序廣播:

2.1:在接收方應用中,定義三個接收廣播,並配置廣播:
public class ReceiverABroadcast extends BroadcastReceiver{

        @Override
        public void onReceive(Context context, Intent intent) {
            Log.v("aaa"
, getResultData() + "A"); //特點1:有序廣播可以在廣播途中被中間接受者修改資料 setResultData("不行"); } } public class ReceiverBBroadcast extends BroadcastReceiver{ @Override public void onReceive(Context context, Intent intent) { Log.v("aaa", getResultData() + "B"); //特點2:有序廣播可在中間接受者中關閉廣播 abortBroadcast(); } } public class ReceiverCBroadcast extends BroadcastReceiver{ @Override public void onReceive(Context context, Intent intent) { Log.v("aaa", getResultData() + "C"); } } <!-- 此處的action都是相同的,方便同一廣播被很多應用監聽到 --> <receiver android:name="com.m520it.receiverbroadcast.ReceiverABroadcast"> <!-- 配置廣播的監聽優先順序 --> <intent-filter android:priority="1000"> <!-- 配置廣播的action,以便通過隱式啟動廣播被此廣播接收到 --> <action android:name="com.m520it.receiverbroadcast.action.SEND"/> </intent-filter> </receiver> <receiver android:name="com.m520it.receiverbroadcast.ReceiverBBroadcast"> <intent-filter android:priority="500"> <action android:name="com.m520it.receiverbroadcast.action.SEND"/> </intent-filter> </receiver> <receiver android:name="com.m520it.receiverbroadcast.ReceiverCBroadcast"> <intent-filter android:priority="250"> <action android:name="com.m520it.receiverbroadcast.action.SEND"/> </intent-filter> </receiver>
2.2:在傳送方:
Intent intent = new Intent("com.m520it.receiverbroadcast.action.SEND");

//1.receiverPermission:設定檢視廣播的許可權    
//2.resultReceiver:結果廣播接受者,它無需配置    
//3.scheduler:Handler型別,一般不用        
//4.initialCode:初始化編碼,來區別廣播         
//5.initialData:廣播名                 
//6.initialExtras:Bundle傳遞的各種資料         
sendOrderedBroadcast(intent,
             null,
             new Receiver(),
             null,
             0,
             "可以",
             null);

//無需配置
public class Receiver extends BroadcastReceiver{

    @Override
    public void onReceive(Context context, Intent intent) {
        Log.v("520it", getResultData() + "Reciver");
    }

}

2.3.1:有序廣播相比於無需廣播,特點
        特點1:有序廣播可以在廣播途中被中間接受者修改資料
        特點2:有序廣播可在中間接受者中關閉廣播
        特點3:配置廣播的監聽優先順序:


2.3.2:無需廣播接收者不強調順序,巨集觀上認為同時接收到。

注意:

1.不管是否關閉廣播,結果廣播接受者都能接收到最後一次資料。 2.若廣播發送方和接收方在一個應用中,則接收方執行在主執行緒中,此處應該新開啟一個子執行緒進行耗時操作(網路操作)。

《二:六種常見的廣播接受者例項》

一:撥打電話接受者-有序廣播(優先順序在-1000以下)

1.建立一個類PhoneReceiver 繼承 BroadcastReceiver:

    public class PhoneReceiver extends BroadcastReceiver {

        @Override
        public void onReceive(Context context, Intent intent) {
            Log.v("aaa", "onReceiver");
        }

    }
2.在Manifest.xml中配置:
<receiver android:name="com.m520it.phonereceiver.PhoneReceiver">
     <intent-filter >
         <action android:name="android.intent.action.NEW_OUTGOING_CALL"/>
     </intent-filter>
 </receiver>

  <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" />(application外,監聽撥打是敏感操作)

二:SD卡安裝和解除安裝接受者-無序廣播

1.建立一個類SDCardStatusReceiver 繼承 BroadcastReceiver:
public class SDCardStatusReceiver extends BroadcastReceiver {

        @Override
        public void onReceive(Context context, Intent intent) {
            if(intent.getAction().equals(Intent.ACTION_MEDIA_MOUNTED)){
                Log.v("aaa", "MOUNTED");
            }else if(intent.getAction().equals(Intent.ACTION_MEDIA_UNMOUNTED)){
                Log.v("aaa", "UNMOUNTED");
            }
        }

    }
2.在Manifest.xml中配置:
 <receiver android:name="com.m520it.sdcardstatusreceiver.SDCardStatusReceiver">
            <intent-filter >
                <action android:name="android.intent.action.MEDIA_MOUNTED"/>
                <action android:name="android.intent.action.MEDIA_UNMOUNTED"/>(sd卡就是檔案)
                <data android:scheme="file"/>
            </intent-filter>
        </receiver>

(只是讀取SD卡的安裝狀態並沒有讀寫,不敏感)

三:簡訊接受者:本應用優先收到簡訊,其他應用不能收到簡訊-有序廣播

1.建立一個類SmsReceiver 繼承 BroadcastReceiver:
@Override
    public void onReceive(Context context, Intent intent) {
        Bundle extras = intent.getExtras();
        //簡訊本身就是報文,以位元組流的形式傳送,傳送時可分多組
        Object[] smsObject = (Object[]) extras.get("pdus");

        String content = "";
        String phone = "";
        for (int i = 0; i < smsObject.length; i++) {
            //通過每個組的資訊位元組陣列得到該段資訊物件
            SmsMessage message = SmsMessage.createFromPdu((byte[])smsObject[i]);

            if(i == 0){
                //得到電話號碼
                phone = message.getDisplayOriginatingAddress();
            }
            //得到資訊內容
            content += message.getDisplayMessageBody();
        }
        Log.v("aaa", phone + "," + content);
        //該應用接收到簡訊後就關閉廣播,截斷向其他應用傳送資訊的可能
        abortBroadcast();
    }


注意:此處android.telephony.gsm.SmsMessage已經過時,應匯入android.telephony.SmsMessage

2.在Manifest.xml中配置:
<receiver android:name="com.m520it.smsreceiver.SmsReceiver">
        <!-- 接收簡訊的優先順序,整型資料:-1000~1000 -->
            <intent-filter android:priority="1000">
                <action android:name="android.provider.Telephony.SMS_RECEIVED"/>
            </intent-filter>
        </receiver>

    <!-- 接收簡訊許可權 -->
    <uses-permission android:name="android.permission.RECEIVE_SMS" />

四:應用安裝和解除安裝狀態接受者-無序廣播

1.建立一個類ApkStatusReceiver 繼承 BroadcastReceiver:
@Override
    public void onReceive(Context context, Intent intent) {
        if(intent.getAction().equals(Intent.ACTION_PACKAGE_ADDED)){
            Log.v("aaa", "ACTION_PACKAGE_ADDED");
        }else if(intent.getAction().equals(Intent.ACTION_PACKAGE_REMOVED)){
            Log.v("aaa", "ACTION_PACKAGE_REMOVED");
        }

    }
2.在Manifest.xml中配置:

<receiver android:name="com.m520it.apkstatusreceiver.ApkStatusReceiver">
        <intent-filter>
            <action android:name="android.intent.action.PACKAGE_ADDED"/>
            <action android:name="ansdroid.intent.action.PACKAGE_REMOVED"/>
        //官方規定新增
            <data android:scheme="package"/>
        </intent-filter>
 </receiver>

五:監聽開機的廣播接受者-無序廣播

    可在配置了以下任意一個動作的receiver廣播中開啟電話監聽服務
    //安裝SD卡動作
    <action android:name="android.intent.action.MEDIA_MOUNTED" />
    //開機動作
    <action android:name="android.intent.action.BOOT_COMPLETED" />

    //開機的許可權
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

六:鎖屏與解鎖的廣播接受者-無序廣播

1.建立監聽服務類並在AndroidManifest.xml中配置該服務:
public class ScreenBroadcast extends BroadcastReceiver{

        @Override
        public void onReceive(Context context, Intent intent) {
            if(intent.getAction().equals(Intent.ACTION_SCREEN_OFF)){
                Log.v("aaa", "鎖屏了");
            }else if(intent.getAction().equals(Intent.ACTION_SCREEN_ON)){
                Log.v("aaa", "解鎖啦");
            }
        }

    }

2.在MainActivity中組冊廣播動作:
@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //鎖屏與解屏適合頻繁的操作,不適合在配置檔案中配置,在程式碼中註冊:
        mScreen = new ScreenBroadcast();
        IntentFilter filter = new IntentFilter();
        filter.addAction(Intent.ACTION_SCREEN_OFF);
        filter.addAction(Intent.ACTION_SCREEN_ON);

        registerReceiver(mScreen, filter);
    }

    //關閉介面時應銷燬註冊的動作
    @Override
    protected void onDestroy() {
        super.onDestroy();

        unregisterReceiver(mScreen);
    }

《三:應用程序的優先順序》

1.Foreground progress(前臺程序):
當一個應用的某個頁面處在螢幕的最前面,可認為是前臺程序(介面最前)

2.Visible progress(可見程序):
如果一個應用啟動另一個應用的介面(透明),前者處於可見程序(介面可見,但不是最前了)

3.Service progress(服務程序):
程序裡面有一個服務處於執行狀態

4.Background progress(後臺程序):
如果一個應用沒有服務正在執行,並且介面沒有關閉,最小化了

5.Empty progress(空程序):
應用程式沒有任何活動的元件(無介面,無活動)