1. 程式人生 > >Android初試--Android中的BroadcastReceiver(3)

Android初試--Android中的BroadcastReceiver(3)

常用的BroadcastReceiver

1.開機啟動服務

我們經常會有這樣的應用場合,比如訊息推送服務,需要實現開機啟動的功能。要實現這個功能,我們就可以訂閱系統“啟動完成”這條廣播,接收到這條廣播後我們就可以啟動自己的服務了。我們來看一下BootCompleteReceiverMsgPushService的具體實現:

package com.scott.receiver;

import android.content.BroadcastReceiver;

import android.content.Context;

import android.content.Intent;

import android.util.Log;

public class BootCompleteReceiver extends BroadcastReceiver {

private static final String TAG = "BootCompleteReceiver";

@Override

public void onReceive(Context context, Intent intent) {

Intent service = new Intent(context, MsgPushService.class);

context.startService(service);

Log.i(TAG, "Boot Complete. Starting MsgPushService...");

}

}


MsgPushService 

package com.scott.receiver;

import android.app.Service;

import android.content.Intent;

import android.os.IBinder;

import android.util.Log;

public class MsgPushService extends Service {

private static final String TAG = "MsgPushService";

@Override

public void onCreate() {

super.onCreate();

Log.i(TAG, "onCreate called.");

}

@Override

public int onStartCommand(Intent intent, int flags, int startId) {

Log.i(TAG, "onStartCommand called.");

return super.onStartCommand(intent, flags, startId);

}

@Override

public IBinder onBind(Intent arg0) {

return null;

}

}

然後我們需要在AndroidManifest.xml中配置相關資訊:

        <!-- 開機廣播接受者 -->

        <receiver android:name=".BootCompleteReceiver">

         <intent-filter>

         <!-- 註冊開機廣播地址-->

         <action android:name="android.intent.action.BOOT_COMPLETED"/>

         <category android:name="android.intent.category.DEFAULT" />

         </intent-filter>

        </receiver>

        <!-- 訊息推送服務 -->

        <service android:name=".MsgPushService"/>

我們看到BootCompleteReceiver註冊了“android.intent.action.BOOT_COMPLETED”這個開機廣播地址,從安全形度考慮,系統要求必須宣告接收開機啟動廣播的許可權,於是我們再宣告使用下面的許可權:

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

經過上面的幾個步驟之後,我們就完成了開機啟動的功能,將應用執行在模擬器上,然後重啟模擬器,控制檯就會看到執行結果。

2.網路狀態變化

在某些場合,比如使用者瀏覽網路資訊時,網路突然斷開,我們要及時地提醒使用者網路已斷開。要實現這個功能,我們可以接收網路狀態改變這樣一條廣播,當由連線狀態變為斷開狀態時,系統就會發送一條廣播,我們接收到之後,再通過網路的狀態做出相應的操作。

下面就來實現一下這個功能:

package com.scott.receiver;

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();

}

}

/**

 * 網路是否可用

 * @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;

}

}

再註冊一下這個接收者的資訊:

        <receiver android:name=".NetworkStateReceiver">

         <intent-filter>

         <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>

         <category android:name="android.intent.category.DEFAULT" />

         </intent-filter>

        </receiver>

因為在isNetworkAvailable方法中我們使用到了網路狀態相關的API,所以需要宣告相關的許可權才行,下面就是對應的許可權宣告:

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>  

我們可以測試一下,比如關閉WiFi,看看有什麼效果。

3.電量變化

如果我們閱讀軟體,可能是全屏閱讀,這個時候使用者就看不到剩餘的電量,我們就可以為他們提供電量的資訊。要想做到這一點,我們需要接收一條電量變化的廣播,然後獲取百分比資訊,這聽上去挺簡單的,我們就來實現以下:

package com.scott.receiver;

import android.content.BroadcastReceiver;

import android.content.Context;

import android.content.Intent;

import android.os.BatteryManager;

import android.util.Log;

public class BatteryChangedReceiver extends BroadcastReceiver {

private static final String TAG = "BatteryChangedReceiver";

@Override

public void onReceive(Context context, Intent intent) {

int currLevel = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0); //當前電量

int total = intent.getIntExtra(BatteryManager.EXTRA_SCALE, 1); //總電量

int percent = currLevel * 100 / total;

Log.i(TAG, "battery: " + percent + "%");

}

}

然後再註冊一下廣播接地址資訊就可以了:

        <receiver android:name=".BatteryChangedReceiver">

         <intent-filter>

         <action android:name="android.intent.action.BATTERY_CHANGED"/>

         <category android:name="android.intent.category.DEFAULT" />

         </intent-filter>

        </receiver>

當然,有些時候我們是要立即獲取電量的,而不是等電量變化的廣播,

比如當閱讀軟體開啟時立即顯示出電池電量。我們可以按以下方式獲取:

Intent batteryIntent = getApplicationContext().registerReceiver(null,new IntentFilter(Intent.ACTION_BATTERY_CHANGED));

int currLevel = batteryIntent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0);

int total = batteryIntent.getIntExtra(BatteryManager.EXTRA_SCALE, 1);

int percent = currLevel * 100 / total;

Log.i("battery", "battery: " + percent + "%");