1. 程式人生 > >Android-廣播總結

Android-廣播總結

1.傳送廣播:

    其實發送廣播屬於隱式意圖

        1.1.系統發出的廣播(有序廣播/無序廣播)

       1.2自己發出的廣播(有序廣播/無序廣播)

 

2.訂閱廣播:

        2.1.AndroidManifest.xml形式訂閱接收者

        2.2.Java程式碼訂閱廣播(onCreate方法中訂閱接收者(能夠發現廣播接收者是唯一可以new的元件),onDestroy方法裡解除訂閱,如果不解除訂閱會引發洩露異常)

 

3.廣播的生命週期方法:就一個方法

           onReceive(Context context, Intent intent)

             廣播接收者元件,什麼時候被啟用,當執行 onReceive(Context context, Intent intent) 的時候被啟用

           廣播接收者元件,什麼時候被回收,當執行完 onReceive(Context context, Intent intent) 後,系統會自動回收 

 

4.廣播接收者,耗時操作

 onReceive(Context context, Intent intent) 方法不能執行耗時操作

  因為廣播接收者是和Activity一樣在主執行緒執行(Activity是五秒未響應就ANR異常,而廣播接收者十秒未響應就ARN異常)

如果一定要在廣播接收者裡執行耗時操作,怎麼辦?

答:不能開啟子執行緒,因為在執行完生命週期方法(onReceive(Context context, Intent intent) )後,系統會自動回收廣播接收者,所以不能開子執行緒

  可以去開啟一個服務-->服務再去開啟主執行緒執行耗時操作 content.startService();   

 

 

5.廣播接收者,去跳轉Activity

AndroidManifest.xml 訂閱 接收者

    <!--
            訂閱(Xml形式訂閱接收者)
            訂閱接收者:專門去跳轉Activity
        
--> <receiver android:name=".br.StartActivityBroadcastReceiver"> <intent-filter> <action android:name="my_customo.start_action_action" /> <data android:scheme="startActivityScheme" /> </intent-filter> </receiver>

 

接收者:

package liudeli.croadcast1.br;


import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

import liudeli.croadcast1.MainActivity;

/**
 * 此接收者,專門用來跳轉Activity
 */
public class StartActivityBroadcastReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        startActivity(context);
    }

    /**
     * 啟動另外一個Activity
     */
    private void startActivity(Context context) {
        Intent intent = new Intent(context, MainActivity.class);
        /**
         * 注意:⚠️  在非Activity的地方 去啟動Activity,必須加入以下標記
         *          intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
         */
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(intent);
    }
}

 

傳送廣播:

 

  /**
     * 傳送廣播給 ---> 接收者
     */
    public void startActivity(View view) {
        /**
         * 訂閱的資訊:
         *            <intent-filter>
         *
         *                 <action android:name="my_customo.start_action_action" />
         *
         *                 <data android:scheme="startActivityScheme" />
         *
         *             </intent-filter>
         */
        /**
         * 傳送廣播原則,接收者怎麼去訂閱的,我就怎麼去傳送廣播
         */
        Intent intent = new Intent();
        intent.setAction("my_customo.start_action_action");
        intent.setData(Uri.parse("startActivityScheme:我要啟用另外一個Activity"));
        sendBroadcast(intent);
    }

 

 

效果: