Android实例-手机安全卫士(三十六)-根据Service是否开启确定CheckBox选中状态

一、目标

  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

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。