Android BroadcastReceiver

一 BroadcastReceiver簡介android

BroadcastReceiver是四大組件之一 用來完成組件之間或者應用之間的通信app

Broadcast: 廣播ide

BroadcastReceiver: 廣播接收者spa

廣播和廣播接收者完成一個消息機制 屬於重量級別 由於須要激活組件線程

 

二 注意code

在Android中 每次廣播消息到來時都會建立BroadcastReceiver實例並執行onReceive()方法xml

onReceive()方法執行完後 BroadcastReceiver的實例就會被銷燬blog

onReceive()方法也是在主線程調用生命週期

onReceive()方法在10s內沒有執行完畢 就會致使一個異常 ANR(application not response)進程

因此在BroadcastReceiver裏不能作一些比較耗時的操做

若是須要完成一項比較耗時的操做 應該經過發送Intent給Service 由Service來完成 這裏不能使用子線程來解決

由於BroadcastReceiver的生命週期很短 子線程可能尚未結束BroadcastReceiver就先結束了

BroadcastReceiver一旦結束 此時BroadcastReceiver的所在進程很容易在系統須要內存時被優先殺死

由於它屬於空進程(沒有任何活動組件的進程) 若是它的宿主進程被殺死 那麼正在工做的子線程也會被殺死 因此採用子線程來解決是不可靠的

 

三 無序廣播

沒有接收的前後順序 全部的廣播接收者同時接收

// 廣播接收者
public class MyBroadcastReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        // 當廣播接收者接收到廣播 該方法會被調用
        if ("com.hy.mm.action.TEST".equals(intent.getAction())) {
            String name = intent.getStringExtra("name");
            Log.i("HUANG", "name=" + name);
        }
    }

}
// 第一種訂閱廣播方式 AndroidManifest.xml application節點裏面配置receiver
<receiver android:name=".receiver.MyBroadcastReceiver">
    <intent-filter>
        <action android:name="com.hy.mm.action.TEST" />
    </intent-filter>
</receiver>
// 第二種訂閱廣播方式
public class MainActivity extends AppCompatActivity {

    MyBroadcastReceiver mReceiver;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // 訂閱廣播
        mReceiver = new MyBroadcastReceiver();
        IntentFilter filter = new IntentFilter("com.hy.mm.action.TEST");
        registerReceiver(mReceiver, filter);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        // 取消訂閱
        unregisterReceiver(mReceiver);
    }

}
// 發送無序廣播
Intent intent = new Intent("com.hy.mm.action.TEST");
intent.putExtra("name", "小白");
sendBroadcast(intent);

 

四 有序廣播

有接收的前後順序 是由廣播接收者本身指定 取值範圍(-1000 ~ 1000)

若是先接收的廣播接收者中斷廣播 那麼後面的廣播接收者就沒法接收了

特殊狀況: 若是有序廣播在發出的時候明確的指定了廣播接收者 那麼這樣的廣播沒法中斷 必定會發送給指定的接收者

// 廣播接收者1
public class MyBroadcastReceiver1 extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        // 當廣播接收者接收到廣播 該方法會被調用
        if ("com.hy.mm.action.T".equals(intent.getAction())) {
            int age = intent.getIntExtra("age", 0);
            Log.i("HUANG", "MyBroadcastReceiver1 age=" + age);
        }
    }

}
// 廣播接收者2
public class MyBroadcastReceiver2 extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        // 當廣播接收者接收到廣播 該方法會被調用
        if ("com.hy.mm.action.T".equals(intent.getAction())) {
            int age = intent.getIntExtra("age", 0);
            Log.i("HUANG", "MyBroadcastReceiver2 age=" + age);
            // 中斷廣播
            //abortBroadcast();
        }
    }

}
// 訂閱廣播 AndroidManifest.xml application節點裏面配置receiver
<!-- priority: 優先級(-1000 ~ 1000) 值越大優先級越高 -->
<receiver android:name=".receiver.MyBroadcastReceiver1">
    <intent-filter android:priority="900">
        <action android:name="com.hy.mm.action.T" />
    </intent-filter>
</receiver>

<receiver android:name=".receiver.MyBroadcastReceiver2">
    <intent-filter android:priority="1000">
        <action android:name="com.hy.mm.action.T" />
    </intent-filter>
</receiver>
// 發送有序廣播
Intent intent = new Intent("com.hy.mm.action.T");
intent.putExtra("age", 15);
sendOrderedBroadcast(intent, null);
相關文章
相關標籤/搜索