应用锁实现介绍 支持5.0

现在通用的应用锁实现 都是启动一个service一直在后台,判断启动的应用在我们的锁内,就启动我们的锁屏界面。


public class HookService extends Service {
    public final static String TAG = "TestService";

    private ActivityManager mActivityManager;
    private String mLastPackageName = "";

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onCreate() {
        super.onCreate();

        mActivityManager = (ActivityManager) getSystemService("activity");

        checkWindow();
    }

    Handler mHandlertoast = new Handler() {

        @Override
        public void handleMessage(Message msg) {
            LockHelper.getInstance().unLock(HookService.this, null, mLastPackageName);
        }
    };

    private void checkWindow() {
        new Thread() {
            @Override
            public void run() {
                while (true) {
                    fun();

                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                    }
                }
            }
        }.start();
    }

    private void fun() {
        String[] activePackages;
        if (Build.VERSION.SDK_INT > 20) {
            activePackages = getActivePackages();
        } else {
            activePackages = getActivePackagesCompat();
        }
        if (activePackages != null) {
            for (String activePackage : activePackages) {
                if (activePackage.equals("com.myth.cici")) {
                    if (!activePackage.equals(mLastPackageName)) {
                        mLastPackageName = activePackage;

                        mHandlertoast.sendEmptyMessage(0);
                    }
                }
            }
        }
    }

    String[] getActivePackagesCompat() {
        final List<ActivityManager.RunningTaskInfo> taskInfo = mActivityManager
                .getRunningTasks(1);
        final ComponentName componentName = taskInfo.get(0).topActivity;
        final String[] activePackages = new String[1];
        activePackages[0] = componentName.getPackageName();
        return activePackages;
    }

    private String[] getActivePackages() {
        final Set<String> activePackages = new HashSet<String>();
        final List<ActivityManager.RunningAppProcessInfo> processInfos = mActivityManager
                .getRunningAppProcesses();
        for (ActivityManager.RunningAppProcessInfo processInfo : processInfos) {
            if (processInfo.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {
                activePackages.addAll(Arrays.asList(processInfo.pkgList));
            }
        }
        return activePackages.toArray(new String[activePackages.size()]);
    }
}

5.0以上使用getActivePackages();以下则使用getRunningAppProcesses。

判断获取到的活动的应用包名和我们锁住的包名是否一致,一致则还要判断是否是上次已经解锁了的,防止一直解锁,然后就启动我们的锁屏界面了。

这只是个基本的部分,正式的还需要解决很多问题。比如Service被杀死了怎么办等。



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值