Android中接收系統廣播訊息

來源:互聯網
上載者:User

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     *      *     * */@Overridepublic 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 {@Overridepublic IBinder onBind(Intent intent) {// TODO Auto-generated method stubreturn null;}//Service被建立時回調該方法,可開發任意Service,監聽使用者來電,監聽使用者簡訊,攔截黑名單電話等等public void onCreate(){/*// 定義1秒執行一行輸出new Timer().schedule(new TimerTask(){@Overridepublic 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 {    //當系統接收到簡訊是被觸發,就是在系統內建的簡訊接收程式之前被觸發,相當於攔截簡訊@Overridepublic 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轉換成簡訊對象SmsMessagemessages[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常量的廣播 *  * */@Overridepublic 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();        }}}
                                                

聯繫我們

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