Android之BroadcastReceiver,broadcastreceiver

來源:互聯網
上載者:User

Android之BroadcastReceiver,broadcastreceiver

簡介:

BroadcastReceiver本質上就是一種全域的監聽器,用於監聽系統全域的廣播訊息,因此它可以非常方便地實現系統中不同組件之間的通訊。


特點:

1.BroadcastReceiver用於接收程式所發出的Broadcast Intent,與應用程式啟動Activity、Service相同;

2.當應用程式發出一個Broadcast Intent之後,所有匹配該Intent的BroadcastReceiver都有可能被啟動;


用法:

網上流行的一張圖片可以很好的感受到broadcastreceiver的主要用法:



本次我們通過一個小的樣本來一起學習BroadcastReceiver:

建立三個廣播類,前兩個在manifest裡面註冊,稱為靜態註冊,最後一個沒有在manifest裡面註冊而在代碼中註冊,稱為動態註冊,發送廣播的時候有顯示發送和隱式發送兩種區別。

首先我們來看一下三個廣播接收器類的定義以及manifest裡面的片段內容如下:

import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.widget.Toast;public class MyReceiver01 extends BroadcastReceiver{@Overridepublic void onReceive(Context context, Intent intent) {String msg = intent.getExtras().getString("data");Toast.makeText(context, "MyReceiver01收到訊息:" + msg, Toast.LENGTH_SHORT).show();}}

import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.widget.Toast;public class MyReceiver02 extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {String msg = intent.getExtras().getString("data");Toast.makeText(context, "MyReceiver02收到訊息:" + msg, Toast.LENGTH_SHORT).show();}}

public class MyReceiver03 extends BroadcastReceiver {public final static String INTENT_ACTION_MYRECEIVER03 = "com.bear.broadcastreceiver.intent.action.receiver03";@Overridepublic void onReceive(Context context, Intent intent) {String msg = intent.getExtras().getString("data");Toast.makeText(context, "MyReceiver03收到訊息:" + msg, Toast.LENGTH_SHORT).show();//abortBroadcast(); 取消廣播,後續receiver將無法接收到訊息}}

        <receiver android:name="com.bear.broadcastreceiver.MyReceiver01" ></receiver>                <receiver android:name="com.bear.broadcastreceiver.MyReceiver02">            <intent-filter >                <action android:name="com.bear.broadcastreceiver.intent.action.receiver02"/>            </intent-filter>                    </receiver>


主介面共有5個按鈕用來測試,主介面類的定義如下:

import android.app.Activity;import android.content.Intent;import android.content.IntentFilter;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;public class MainActivity extends Activity implements OnClickListener{private IntentFilter intentFilter;private MyReceiver03 receiver;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);setupViews();intentFilter = new IntentFilter(MyReceiver03.INTENT_ACTION_MYRECEIVER03);receiver = new MyReceiver03();}@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.button1://顯式發送廣播Intent intent = new Intent(MainActivity.this, MyReceiver01.class);intent.putExtra("data", "bear");sendBroadcast(intent);break;case R.id.button2://隱式發送廣播Intent intent02 = new Intent("com.bear.broadcastreceiver.intent.action.receiver02");intent02.putExtra("data", "bear02");sendBroadcast(intent02);break;case R.id.button3://動態註冊廣播registerReceiver(receiver, intentFilter);break;case R.id.button4:Intent intent03 = new Intent(MyReceiver03.INTENT_ACTION_MYRECEIVER03);intent03.putExtra("data", "bear03");sendBroadcast(intent03);//sendOrderedBroadcast(intent03, receiverPermission); 按優先順序發送廣播break;case R.id.button5://登出廣播unregisterReceiver(receiver);break;default:break;}}private void setupViews(){findViewById(R.id.button1).setOnClickListener(this);findViewById(R.id.button2).setOnClickListener(this);findViewById(R.id.button3).setOnClickListener(this);findViewById(R.id.button4).setOnClickListener(this);findViewById(R.id.button5).setOnClickListener(this);}}


總結:

1. 每次系統廣播(Broadcast)事件發生後,系統就會建立對應的BroadcastReceiver執行個體,並自動觸發它的onReceive()方法,onReceive()方法執行完後,BroadcastReceiver的執行個體就會被銷毀;


2.如果BroadcastReceiver的onReceive()方法不能在10秒內執行完成,Android會認為該程式無響應。所以不要在廣播接收者的onReceive()方法裡執行一些耗時的操作,否則會彈出ANR(Application No Response)的對話方塊;


3.如果確實需要根據廣播來完成一項比較耗時的操作,則可以考慮通過Intent啟動一個Service來完成該操作。不應考慮使用新線程去完成耗時的操作,因為BroadcastReceiver本身的生命週期極短,可能出現的情況是子線程可能還沒有結束,BroadcastReceiver就已經退出了;


最後在這裡附上整個demo工程源碼:

Android BroadcastReceiver

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.