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 stubIntent 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();} }
<!-- 定義一個Broadcastreceiver,監聽系統開機廣播 --><receiver android:name=".LaunchReceiver"><intent-filter><action android:name="android.intent.action.BOOT_COMPLETED"></action><!-- 系統啟動完成會發出此action的intent --></intent-filter></receiver><service android:name=".LaunchService"></service> <!--訪問系統開機事件的權限 --><uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
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消息提示}}}
<receiver android:name=".SmsReceiver"><intent-filter android:priority="800"><!-- 優先級為800,在系統短信接受程序之前被觸發 --><action android:name="android.provider.Telephony.SMS_RECEIVED"/></intent-filter>
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 stubBundle 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();}}} <receiver android:name=".BatteryReceiver"><intent-filter><action android:name="android.intent.action.BATTERY_CHANGED"></action></intent-filter></receiver>
總結
以上是生活随笔為你收集整理的Android中接收系统广播消息的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android中BroadcastRec
- 下一篇: Android网络编程使用HttpCli