程序锁的核心原理(获取正在显示的任务栈)

来源:互联网 发布:淘宝怎么删除评论 编辑:程序博客网 时间:2024/05/10 13:30
package com.android.hzy.mobilesafe.service;

import java.util.ArrayList;
import java.util.List;

import android.app.ActivityManager;
import android.app.ActivityManager.RunningTaskInfo;
import android.app.KeyguardManager;
import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.database.ContentObserver;
import android.net.Uri;
import android.os.Binder;
import android.os.Handler;
import android.os.IBinder;
import android.os.SystemClock;

import com.android.hzy.mobilesafe.MobileSafeApplication;
import com.android.hzy.mobilesafe.activity.EnterPasswordActivity;
import com.android.hzy.mobilesafe.dao.AppLockDao;
import com.android.hzy.mobilesafe.inter.IService;
import com.android.hzy.mobilesafe.utils.Logger;

public class AppLockService extends Service {

    private ActivityManager am;
    private AppLockDao appLockDao;
    private List<String> appLocks;
    private List<String> tempAppLocks; // 放置临时解锁的应用
    private MyContentObserver observer;
    // 手机锁屏和解锁的服务
    private KeyguardManager keyguardManager;
    private LockScreenReceiver receiver;
    
    @Override
    public void onCreate() {
        // TODO Auto-generated method stub
        super.onCreate();
        
        am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
        keyguardManager = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE);
        appLockDao = new AppLockDao(this);
        appLocks = appLockDao.findAll();
        tempAppLocks = new ArrayList<String>();
        
        observer = new MyContentObserver(new Handler());
        Uri uri = Uri.parse("content://applock/applock");
        // 注册一个内容观察者
        getContentResolver().registerContentObserver(uri, true, observer);
        
        // 注册锁屏广播接收者
        IntentFilter filter = new IntentFilter();
        filter.addAction(Intent.ACTION_SCREEN_OFF);
        receiver = new LockScreenReceiver();
        registerReceiver(receiver, filter);
        
        new Thread() {
            public void run() {
                // 类似一个看门狗
                while (true) {
                    // 判断是否锁屏
                    boolean isLockScreen = keyguardManager.inKeyguardRestrictedInputMode();
                    if(isLockScreen){
                        SystemClock.sleep(1000);
                        Logger.i("i", " 现在处于锁屏模式.....");
                    }else{
                        Logger.i("i", " 现在处于监听模式.....");
                        // 得到当前正在运行的任务栈
                        List<RunningTaskInfo> runningTasksInfos = am.getRunningTasks(1);
                        // 得到前台显示的任务栈
                        RunningTaskInfo runningTaskInfo = runningTasksInfos.get(0);
                        //获取栈顶的组件
                        ComponentName component = runningTaskInfo.topActivity;
                        String packageName = component.getPackageName();
                        // 判断当前的应用程序是否在程序锁里面
                        if(appLocks.contains(packageName)){
                            // 判断在不在临时集合中
                            if(!tempAppLocks.contains(packageName)){
                                // 如果在程序锁里面 就将应用的包信息封装到application里面
                                MobileSafeApplication application = (MobileSafeApplication) getApplication();
                                application.setPackname(packageName);
                                
                                // 弹出输入密码的界面
                                Intent intent = new Intent(getApplicationContext(),EnterPasswordActivity.class);
                                // 由于服务是不存在任务栈中  因此需要设置FLAG
                                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                                startActivity(intent);
                            }
                        }
                    }
                }
            };
        }.start();
    }
    
    private final class MyContentObserver extends ContentObserver{

        public MyContentObserver(Handler handler) {
            super(handler);
            // TODO Auto-generated constructor stub
        }
        
        @Override
        public void onChange(boolean selfChange) {
            // TODO Auto-generated method stub
            super.onChange(selfChange);
            // 重新查询数据
            appLocks = appLockDao.findAll();
            // 清除一下临时集合
            tempAppLocks.clear();
        }
        
    }
    
    /*******锁屏广播************/
    private final class LockScreenReceiver extends BroadcastReceiver{

        @Override
        public void onReceive(Context context, Intent intent) {
            // TODO Auto-generated method stub
            // 清除一下临时集合
            tempAppLocks.clear();
        }
        
    }
    
    private MyBinder ibinder = new MyBinder();
    
    @Override
    public IBinder onBind(Intent intent) {
        // TODO Auto-generated method stub
        return ibinder;
    }
    
    private final class MyBinder extends Binder implements IService{

        @Override
        public void addTemp(String packageName) {
            // TODO Auto-generated method stub
            addTempAppLock(packageName);
        }
        
    }
    
    /***********在临时集合中添加应用程序***************************/
    public void addTempAppLock(String packageName){
        tempAppLocks.add(packageName);
    }
    
    @Override
    public void onDestroy() {
        // TODO Auto-generated method stub
        super.onDestroy();
        // 取消监听
        getContentResolver().unregisterContentObserver(observer);
        // 取消锁屏广播的监听
        unregisterReceiver(receiver);
    }

}
原创粉丝点击