一、目标
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 }
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 }
5、解决当应用最小化后通过任务管理器杀死服务后,回至应用时仍为选中的问题。在“设置中心”的页面代码(SettingActivity)中复写“onResume()”方法,在该方法中重复第3、4步。