Android中BroadcastReceiver的使用

來源:互聯網
上載者:User

Broadcast Receiver簡介
Broadcast Receiver是Android的五大組件之一,使用頻率也很高。
用於非同步接收廣播Intent,廣播Intent的發送是通過調用Context.sendBroadcast()、廣播接收者(BroadcastReceiver)用於非同步接收廣播Intent,廣播Intent的發送是通過調用Context.sendBroadcast()、Context.sendOrderedBroadcast()或者Context.sendStickyBroadcast()來實現的。通常一個廣播Intent可以被訂閱了此Intent的多個廣播接收者所接收,廣播接收者和JMS中的Topic訊息接收者很相似.
廣播接收器只能接收廣播,對廣播的通知做出反應,很多廣播都產生於系統代碼.如:時區改變的通知,電池電量不足、使用者改變了語言偏好或者開機啟動等.
廣播接收器沒有使用者介面,但是,它可以為它們接收到資訊啟動一個Activity或者使用NotificationManager來通知使用者.

 

 

生命週期


    一個BroadcastReceiver 對象只有在被調用onReceive(Context, Intent)的才有效,當從該函數返回後,該對象就無效的了,結束生命週期。

    因此從這個特徵可以看出,在所調用的onReceive(Context, Intent)函數裡,不能有過於耗時的操作,不能使用線程來執行。對於耗時的操作,請start service來完成。因為當得到其他非同步作業所返回的結果時,BroadcastReceiver 可能已經無效了。

 


監聽網路狀態變化的例子

下面通過一個例子來使用BroadcastReceiver。

NetworkStateReceiver:接收網路狀態變化時系統發出的Broadcast。

 

[java]
package com.example.networkbroadcastreceiver; 
 
import android.content.BroadcastReceiver;   
import android.content.Context;   
import android.content.Intent;   
import android.net.ConnectivityManager;   
import android.net.NetworkInfo;   
import android.util.Log;   
import android.widget.Toast;   
   
public class NetworkStateReceiver extends BroadcastReceiver {   
       
    private static final String TAG = "NetworkStateReceiver";   
       
    @Override   
    public void onReceive(Context context, Intent intent) {   
        Log.i(TAG, "network state changed.");   
        if (!isNetworkAvailable(context)) {   
            Toast.makeText(context, "network disconnected!", 0).show();   
        }   
        else Toast.makeText(context, "network connected!", 0).show(); 
    }   
       
    /** 
     * 網路是否可用 
     *  
     * @param context 
     * @return 
     */   
    public static boolean isNetworkAvailable(Context context) {   
        ConnectivityManager mgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);   
        NetworkInfo[] info = mgr.getAllNetworkInfo();   
        if (info != null) {   
            for (int i = 0; i < info.length; i++) {   
                if (info[i].getState() == NetworkInfo.State.CONNECTED) {   
                    return true;   
                }   
            }   
        }   
        return false;   
    }   
   
}   

package com.example.networkbroadcastreceiver;

import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.net.ConnectivityManager; 
import android.net.NetworkInfo; 
import android.util.Log; 
import android.widget.Toast; 
 
public class NetworkStateReceiver extends BroadcastReceiver { 
     
    private static final String TAG = "NetworkStateReceiver"; 
     
    @Override 
    public void onReceive(Context context, Intent intent) { 
        Log.i(TAG, "network state changed."); 
        if (!isNetworkAvailable(context)) { 
            Toast.makeText(context, "network disconnected!", 0).show(); 
        } 
        else Toast.makeText(context, "network connected!", 0).show();
    } 
     
    /**
     * 網路是否可用
     * 
     * @param context
     * @return
     */ 
    public static boolean isNetworkAvailable(Context context) { 
        ConnectivityManager mgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
        NetworkInfo[] info = mgr.getAllNetworkInfo(); 
        if (info != null) { 
            for (int i = 0; i < info.length; i++) { 
                if (info[i].getState() == NetworkInfo.State.CONNECTED) { 
                    return true; 
                } 
            } 
        } 
        return false; 
    } 
 

MainActivity:


[java]
package com.example.networkbroadcastreceiver; 
 
import android.os.Bundle; 
import android.app.Activity; 
import android.view.Menu; 
 
 
public class MainActivity extends Activity { 
 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.activity_main); 

package com.example.networkbroadcastreceiver;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;


public class MainActivity extends Activity {

 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);[java] view plaincopyprint?    } 
 
    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
        getMenuInflater().inflate(R.menu.activity_main, menu); 
        return true; 
    } 

 }

 @Override
 public boolean onCreateOptionsMenu(Menu menu) {
  getMenuInflater().inflate(R.menu.activity_main, menu);
  return true;
 }
}

 


靜態註冊和動態註冊
寫好BroadcastReceiver 之後要對其進行註冊。
靜態註冊需要修改manifest檔案,也是我採用的方法。

添加


[html]

<SPAN style="FONT-SIZE: 14px"><receiver android:name=".NetworkStateReceiver" > 
            <intent-filter> 
                <action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> 
 
                <category android:name="android.intent.category.DEFAULT" /> 
            </intent-filter> 
        </receiver></SPAN> 

<receiver android:name=".NetworkStateReceiver" >
            <intent-filter>
                <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />

                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </receiver>
動態註冊的話需要這樣做(未調試):

1. 在Activity的onCreate中:
//註冊網路監聽
IntentFilter filter = new IntentFilter(); 
filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
registerReceiver(mNetworkStateReceiver, filter);
2. 在Activity中的onDestroy中:
//取消監聽
unregisterReceiver(mNetworkStateReceiver);


最終效果:

 

 

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.