Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android中接收系統廣播消息

Android中接收系統廣播消息

編輯:關於Android編程

Android的大量系統事件都會對外發送標准廣播:

創建廣播Action常量:

ACTION_TIME_CHANGED系統時間被改變

ACTION_DATE_CHANGED系統日期被改變

ACTION_TIMEZONE_CHANGED系統時區被改變

ACTION_BOOT_COMPLETED系統啟動完成

ACTION_PACKAGE_ADDED系統添加包

ACTION_PACKAGE_CHANGED系統的包改變

ACTION_PACKAGE_REMOVED系統的包被刪除

ACTION_PACKAGE_RESTARTED系統的包數據被重啟

ACTION_PACKAGE_DATA_CLEARED系統的包數據被清空

ACTION_BATTERY_CHANGED電池電量改變

ACTION_BATTERY_LOW電池電量低

ACTION_POWER_CONNECTED系統連接電源

ACTION_POWER_DISCONNECTED系統與電源斷開

ACTION_SHUTDOWN系統被關閉

1,開機自啟動的Service

我們經常會有這樣的應用場合,比如消息推送服務,需要實現開機啟動的功能。

例如,監聽用戶來電,監聽用戶短信,攔截黑名單電話等
為了讓Service隨應系統啟動自動執行,可以讓BroadcastReceiver監聽Action為ACTION_BOOT_COMPLETED常量的Intent,然後在BroadcastReceiver中啟動特定的Service

LaunchReceiver.java

public class LaunchReceiver extends BroadcastReceiver {
    /*
     * 開機自啟動的Service:
     * 例如,監聽用戶來電,監聽用戶短信,攔截黑名單電話等
     * 為了讓Service隨應系統啟動自動執行,可以讓BroadcastReceiver監聽Action為ACTION_BOOT_COMPLETED常量的Intent,然後在BroadcastReceiver中啟動
     * 特定的Service
     * 
     *
     * */
	@Override
	public void onReceive(Context context, Intent intent) {
		// TODO Auto-generated method stub
            Intent intent_to_service=new Intent(context,LaunchService.class);
            context.startService(intent_to_service);//廣播裡啟動特定的Service
	}

}
LaunchService.java
public class LaunchService extends Service {

	@Override
	public IBinder onBind(Intent intent) {
		// TODO Auto-generated method stub
		return null;
	}
	//Service被創建時回調該方法,可開發任意Service,監聽用戶來電,監聽用戶短信,攔截黑名單電話等等
	public void onCreate()
	{
		/*// 定義1秒執行一行輸出
		new Timer().schedule(new TimerTask()
		{

			@Override
			public void run()
			{
				System.out.println("-----"
					+ new Date() + "-----");
			}
		}, 0, 1000);*/
		Toast.makeText(this, "系統已開機", Toast.LENGTH_LONG).show();
	}
}

        
            
                
            
        
        

    

2,短信提醒,系統接收到短信時,發送廣播,在系統接收到短信之前,激發Broadcast

 

當系統收到短信時,系統會對外發出一個有序廣播,該廣播的Intent對應的Action為android.provider.Telephony.SMS_RECEIVED
因此只要在程序中開發一個對應的BroadcastReceiver即可監聽到系統收到短信
SmsReceiver.java

package com.hust.smsreceiver;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.SmsMessage;
import android.widget.Toast;
/*
 * 短信提醒:
 * 當系統收到短信時,系統會對外發出一個有序廣播,該廣播的Intent對應的Action為android.provider.Telephony.SMS_RECEIVED
 * 因此只要在程序中開發一個對應的BroadcastReceiver即可監聽到系統收到短信
 * */
public class SmsReceiver extends BroadcastReceiver {
    //當系統接收到短信是被觸發,就是在系統自帶的短信接收程序之前被觸發,相當於攔截短信
	@Override
	public void onReceive(Context context, Intent intent) {
		// TODO Auto-generated method stub
       //如果接收到短信
		if(intent.getAction().equals("android.provider.Telephony.SMS_RECEIVED")){
			/*在系統短信接收程序之前會被啟動,如果取消廣播,那麼短信廣播將不會被傳播到系統的短信接收程序,也就是系統本身將不會收到短信*/
			//abortBroadcast();//取消廣播,這行代碼會讓系統收不到短信
			StringBuilder sb=new StringBuilder();
			//短信數據捆綁在intent的Bundle中
			Bundle bundle=intent.getExtras();
			if(bundle!=null){
				//通過pdus可以獲得接收到的所有短信消息
				Object[]  pdus=(Object[]) bundle.get("pdus");
				//構建短信對象數組
				SmsMessage[] messages=new SmsMessage[pdus.length];
				for(int i=0;i<=pdus.length;i++){
					//根據pdus,把每個pdus轉換成短信對象SmsMessage
					messages[i]=SmsMessage.createFromPdu((byte[])pdus[i]);
				}
				for(SmsMessage message:messages){
					sb.append("短信來源:");
					sb.append(message.getDisplayOriginatingAddress());//獲取短信的源地址
					sb.append("\n----短信內容-----\n");
					sb.append(message.getDisplayMessageBody());//獲取短信的內容
				}
			}
			Toast.makeText(context, sb.toString(), Toast.LENGTH_LONG).show();//toast消息提示
		}
	}

}


            
                
            

3,電量變化

如果我們閱讀軟件,可能是全屏閱讀,這個時候用戶就看不到剩余的電量,我們就可以為他們提供電量的信息。要想做到這一點,我們需要接收一條電量變化的廣播,然後獲取百分比信息,這聽上去挺簡單的

當手機電量發生改變是,系統會對外發送Intent的ActionACTION_BATTERY_CHANGED的常量的廣播,
當手機電量過低時,會發送ACTION_BATTERY_LOW常量的廣播

package com.hust.batteryreceiver;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.widget.Toast;

public class BatteryReceiver extends BroadcastReceiver {
/*當手機電量發生改變是,系統會對外發送Intent的ActionACTION_BATTERY_CHANGED的常量的廣播,
 * 當手機電量過低只,會發送ACTION_BATTERY_LOW常量的廣播
 * 
 * */
	@Override
	public void onReceive(Context context, Intent intent) {
		// TODO Auto-generated method stub
        Bundle bundle=intent.getExtras();
        int current=bundle.getInt("level");//key=level是當前電量
        int total=bundle.getInt("scale");//key=scale是總電量
        //當前電量小於總電量的15%
        if(current*1.0/total<0.15){
        	Toast.makeText(context, "電池電量過低,請盡快充電!", Toast.LENGTH_LONG).show();
        }
	}

}

            
                
            
        
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved