標籤:
一、目標
1、根據service是否在後台運行情況來確定CheckBox的選中狀態;
2、解決"設定中心"的“開啟來電號碼顯示歸屬地”功能在退出程式再進入時選中狀態消失,在工作管理員中關閉“來顯”服務時,功能仍為選中狀態
二、代碼實現
1、在src檔案下建立一個包(取名com.example.mobilesafe.utils)用於存放各種工具類;
2、在工具類包下建立類(取名ServiceUtils,無需繼承任何類),用於校正某個服務是否在正常運行(開啟);在建立類(ServiceUtils)中建立傳回值類型為boolean類型的靜態方法(取名isServiceRunning,用於檢驗服務是否正常運行),傳入參數兩個分別是上下文(Context,因為在該方法中需通過上下文得到系統服務)和指定要校正是否正常啟動並執行服務名稱(String類型的參數),在檢驗服務的靜態方法中:
(1)通過內容相關的getSystemService(String name)方法得到系統服務,由參數name擷取Activity和Service狀態(即name參數值為Context.ACTIVITY_SERVICE),強轉,該方法返回ActivityManager對象(取名am);
(2)通過ActivityManager對象(am)的getRunningServices(int maxNum)方法擷取正在啟動並執行服務的資訊集合對象List<RunningServiceInfo>(取名serviceInfos);
(3)通過增強for迴圈遍曆服務資訊集合(serviceInfos),在增強for迴圈中:
①通過正在運行服務資訊對象RunningServiceInfo(取名info)的service擷取服務元件,再通過組件的getClassName()擷取服務名稱,返回String對象(取名name);
②通過if語句判斷傳入的服務名稱(即2中的靜態方法第二個傳入參數)是否等於(equal()方法)擷取的服務名稱相等則返回true;
(4)返回false;
建立的服務是否正在運行類和靜態檢驗方法代碼如下:
1 public class ServiceUtils { 2 3 /** 4 * 檢驗某個服務是否還在正常運行 5 * @param context:需要關聯的上下文 6 * @param serviceName:需要檢驗的服務全路徑名稱 7 * @return 8 */ 9 public static boolean isServiceRunning (Context context,String serviceName){10 //檢驗服務是否正常運行 11 ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);12 List<RunningServiceInfo> serviceInfos = am.getRunningServices(100);13 for(RunningServiceInfo info:serviceInfos){14 String name = info.service.getClassName();15 if(serviceName.equals(name)){16 return true;17 }18 }19 return false;20 }21 }View Code
3、在“設定中心”的頁面代碼(SettingActivity)中“設定是否開啟來電號碼歸屬地顯示功能”模板中通過new Intent(this,ShowComingPhoneAdd.class)執行個體化一個Intent對象(名稱為showAddIntent)之後,通過2中建立的工具類(ServiceUtils)的校正某個服務是否在正常運行方法isServiceRunning(Context context, String serviceName)(即建立的靜態方法)檢驗指定的服務是否正在運行,參數context上下文即為“設定中心”類的上下文(SettingActivity.this),參數serviceName服務名稱即為Intent執行個體化時傳入的服務(需使用全路徑名稱,即com.example.mobilesafe.service.ShowComingPhoneAdd)。該方法傳回值類型為boolean(取名isServiceRunning)。
4、通過if...else...語句和isServiceRunning條件判斷指定的服務是否正在運行,若正在運行則設定單選框為選中狀態,若未運行則設定單選框為空白狀態;
“設定中心”頁面中新增部分代碼:
1 //(這句是新增代碼前的語句)showAddIntent = new Intent(this,ShowComingPhoneAdd.class); 2 //根據自訂的服務是否運行檢驗方法判斷“來電號碼歸屬地顯示服務(ShowComingPhoneAdd)”是否正在運行 3 boolean idServiceRunning = ServiceUtils.isServiceRunning(SettingActivity.this, "com.example.mobilesafe.service.ShowComingPhoneAdd"); 4 if(idServiceRunning){ 5 //服務正在運行,設定顯示功能為選中狀態 6 setting_show_incoming_add.setChecked(true); 7 }else{ 8 //服務未運行,設定顯示功能為空白狀態 9 setting_show_incoming_add.setChecked(false);10 } View Code
Android執行個體-手機安全衛士(三十六)-根據Service是否開啟確定CheckBox選中狀態