6.11 程序锁耗电优化

本文介绍了一种通过自定义广播事件来控制看门狗服务启停的方法,该服务能够监测设备屏幕上锁和解锁状态,并根据应用程序是否被锁定来触发密码验证。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在锁屏广播中关闭看门狗功能,在屏幕解锁的广播中开启看门狗功能
 
 
 
 
 
 
public class WatchDogService extends Service {

      protected static final String TAG = "WatchDogService";
      private ActivityManager  am;
      private boolean flags;
      private AppLockDao dao;
      private pauseProtectBroad ppbreceiver;
      private ScreenLockReceiver  lockReceiver;
      private List<String> tempStopProtectPacknames;
      private ScreenUnlockReceiver unlockReceiver;
      
      @Override
      public IBinder onBind(Intent intent) {
            
             return new MyBind();
      }
      
      
      /**
       * 3. 创建代理人类继承服务中的Binder ,实现  watchdogInference接口  ; 在代理人 类中实现接口中未实现的方法
       * @author Administrator
       *
       */
      public class MyBind extends Binder  implements WatchDogInference{

             @Override
             public void getMethod(String pakagename) {
                  
                  temStopProtect(pakagename);   //调用服务中的方法
            }

            
            
      }
      
      
      
      
      /**
       * 1.服务内部的方法,把临时停止保护的应用程序的包名加入到集合里面
       * @param pakage_name
       */
  public void  temStopProtect(String  pakage_name){
       
        tempStopProtectPacknames.add(pakage_name);
  }
      
      
      
      
      /**
       * 注册自定义广播事件, 拿到watchdogActivity返回过来的包名,并告诉看门狗该应用暂时不用保护了
       */
      public class  pauseProtectBroad  extends BroadcastReceiver{

             @Override
             public void onReceive(Context context, Intent intent) {
            
                  String pkgname = intent.getStringExtra( "pkgname");   //得到暂停保护的包名
                   tempStopProtectPacknames.add(pkgname);  //将包名装进暂停保护的集合中
                  
                  
            }
            
      }
      
      /**
       * 注册当屏幕锁屏时的广播事件: 从暂时不受密码保护的集合中去掉该包名
       * @author Administrator
       *
       */
      private class ScreenLockReceiver extends BroadcastReceiver{
             @Override
             public void onReceive(Context context, Intent intent) {
                   //屏幕锁屏
                   tempStopProtectPacknames.clear();
                   flags = false;
            }
      }
      
      
      /**
       * 屏幕解锁时开启看门狗
       * @author Administrator
       *
       */
      private class ScreenUnlockReceiver extends BroadcastReceiver {
             @Override
             public void onReceive(Context context, Intent intent) {
                   if (! flags) {
                         // 屏幕解锁
                        startWatchDogThread();
                  }
            }
      }
      
      
      
      /**
       * 服务开启时
       */
      @Override
      public void onCreate() {
            Log. i(TAG, "开启服务" );
             tempStopProtectPacknames= new ArrayList<String>();
            
             //当服务开启时开启初始化pass集合的广播
             ppbreceiver = new pauseProtectBroad();
            IntentFilter filter= new IntentFilter();
            filter.addAction( "this.activity.not.protected");
         registerReceiver( ppbreceiver, filter);
        
         //当服务开启时开启清空pass集合的广播       锁屏广播
         lockReceiver = new ScreenLockReceiver();
            IntentFilter lockFilter = new IntentFilter();
            lockFilter.addAction(Intent. ACTION_SCREEN_OFF);
            registerReceiver( lockReceiver, lockFilter);
            
            
             //解锁广播
             unlockReceiver = new ScreenUnlockReceiver();
            IntentFilter unlockFilter = new IntentFilter();
            unlockFilter.addAction(Intent. ACTION_SCREEN_ON);
            registerReceiver( unlockReceiver, unlockFilter);
            
            
             dao= new AppLockDao(getApplicationContext()); 
            
             //1.创建activity管理员
             am=(ActivityManager) getSystemService( ACTIVITY_SERVICE);

             //2.开启看门狗
             startWatchDogThread();
              
            
      
             super.onCreate();
      }

      
      
   /**
    * 看门狗功能
    */
      private void startWatchDogThread() {
             //2.看门狗在服务开启时不停的监视着后台正在运行的程序
             new Thread(){
                   public void run() {
                         flags= true;
                        
                         while( flags){     //获取正在运行的任务栈     3:可以任意定义,表示近期开启的3个任务栈
                        List<RunningTaskInfo> runningTasks = am.getRunningTasks(3);
                        
                         //最上层的任务栈:   刚打开的应用程序的任务栈
                        RunningTaskInfo runningTaskInfo = runningTasks.get(0);
                        
                         //得到刚刚开启的应用程序的activity的名称
                        String packageName = runningTaskInfo.topActivity.getPackageName();
                        
                         //判断得到的包名的应用是否在已加锁的数据库中
                         if( dao.find(packageName)){
                              
                               if(! tempStopProtectPacknames.contains(packageName)){   //如果暂停保护集合中存在该包名
                                    
                                    
                                    Log. i(TAG, "弹出提示输入密码的activity" );
                                    Intent intent= new Intent(getApplicationContext(),WatchDogActivity.class );
                                    intent.setFlags(Intent. FLAG_ACTIVITY_NEW_TASK); //开启新任务栈
                                    
                                    intent.putExtra( "packageName", packageName);
                                    startActivity(intent);
                                    
                                    }

                              
                                try {                   
                                    Thread. sleep(50);                 
                                } catch (InterruptedException e) {
                                    
                                    e.printStackTrace();
                                }



                              
                        }
                        
                        
                        
                        }
                  };
                  
      }.start();
      }
      
      
      /**
       * 服务销毁时
       */
      public void onDestroy() {
            Log. i(TAG, "关闭服务..." );
             flags= false //服务关闭时关闭关门狗
            
          //服务关闭时终止自定义广播
          ppbreceiver.abortBroadcast();
            
          lockReceiver.abortBroadcast();
         
          unlockReceiver.abortBroadcast();
         
            
      };
      

}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值