El software de implementación de lógica de bloqueo de software de Android viene con implementación de lógica de bloqueo de pantalla lógica

Esta es la primera vez que escribo Weibo, y lo escribiré de ahora en adelante para repetir los mismos errores que cometí en el pasado, y también para conmemorarme en el futuro.

El software WeChat Alipay que ha aparecido ahora

La pantalla de bloqueo que implementaron es muy simple. Es muy simple juzgar por una actividad.

Pero si una aplicación tiene N actividades y N páginas, ¿cómo se puede realizar?, echemos un vistazo ahora.


* Autor: Byron
Para reimpresión, por favor indique la fuente

1. Lógica de bloqueo

(1) El programa iniciado por detección de bucle en servicio

(2) Recepción de transmisión

(3) Si es su propio programa, aparecerá

(4) Si la entrada es correcta, si el programa se ejecuta en segundo plano y comienza a detectar cuándo se está ejecutando, aparecerá

El propósito de LaunchMode="SingleInstance" es anular la aplicación 

Insuficiente solo para guardias de seguridad por debajo de 5.0, incluidos los actuales 360 y Tencent

Mi artículo fue creado a las 11:10:54 del 13 de enero de 2016

Ahora discuta la falta de bloqueos en 5.0

Take 360 ​​​​y el bloqueo de software del guardia de seguridad de Tencent

Error existente: la aplicación no se puede bloquear cuando se abre y, a menudo, el software la sobrescribe cuando aparece la página de la pantalla de bloqueo, porque SingleInstance anterior a 5.0 no puede cubrir la aplicación.

2: todas las versiones 4.0-xx bloqueo de gestos no serán válidos. La condición de reproducción es

(1) Abra la clave 360 ​​o Tencent y seleccione el software bloqueado para abrirlo

(2) Cuando aparezca la pantalla de bloqueo, presione el botón Inicio para cargar el Reciente, elimínelo y luego abra el software bloqueado y descubra que el bloqueo del software no es válido. Razón: El software se cancela y el servicio también se desactivará. detenido durante unos minutos 2. Si hay suficiente memoria, el servicio se reiniciará.


Las deficiencias anteriores son suficientes para mostrar que el bloqueo de software actual casi ha sido dañado y deprimido por la revisión. .


Pero actualmente estoy implementando el soporte de la versión 4.0-xx de este software

Déjame ser cruel Escribí unos días de servicio para eliminar el plan para realizar la página.

oncreate -onstart-onResume-onpuse-onstop-ondestory


onstart: detecta si el bloqueo de software está habilitado y aparece si hay uno

Cuando todo esté en orden, notifique el bloqueo del software la próxima vez


Lo siento, esto no es posible. Esto es solo un sueño ideal. Si las funciones son tan fáciles de realizar, ¿por qué la gente necesita realizarlas?


现在分析下逻辑吧

软件启动过程为Splash界面-主界面-主界面中可能有n个activity 

分析:splash界面启动的时候不需要开启手势锁 原因:这时候开启 可能会被主页面覆盖掉手势锁  所以手势锁启动条件1 if(activity instanceOf SplashActivity) return;

2,splashActivity到-MainActicity-过程  

splashActivity周期oncrate-onstart-onpuse-onstop-ondestory-MainActicity oncreate-start,,其实不是这样的

实际为 splashActivity-onpuse 

MainActicity-oncreate 

MainActicity-onstart 

splashActivity-stop 

splashActivity-desotory

这是进入一个activity 如果是不可见判断 是否下次Oncreate打开手势锁呢?

有点异想天开了 因为打开一个activity最后会走onstop

那么从二级页面退到一级页面又会经历什么周期呢  ,如果是手势锁开启它的周期会不会影响整个周期呢 如果是手势锁开启 输入正确 他也会走Onstop 又该怎么办呢 设置手势锁呢

哈哈 想必你我都烦躁了

我还是直接上代码吧  你们拿来用 有闲心的就看看 里面还是很复杂的 

主要构建逻辑

 分析任务栈--来判断是否开启  如果需要开启 开启之前的条件还有 是否打开手势锁 是否已经输入了  输入正确就没必要在弹出


首先创建 APPLication

 
 
Application 注释我就不写了 看不到的可以直接联系我Q10562080

private static Handler mainHandler;

private static Context mContext;

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

   mainHandler = new Handler();
   this.mContext=getApplicationContext();
 
public static Context getAppContext() {
   return mContext;
}

public static Handler getHandler(){
   return mainHandler;
}
private void initGesture(){
   if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
      this.registerActivityLifecycleCallbacks( new ActivityLifecycleCallbacks() {

         @Override
         public void onActivityCreated(Activity activity, Bundle savedInstanceState){

            Log.e("onActivityCreated",activity.getClass().getSimpleName());
            MyStack.addActivity(activity);
            GestureManager.getPassCodeManager().onActivityCreated(activity);

         }

         @Override
         public void onActivityStarted(Activity activity) {
            GestureManager.getPassCodeManager().onActivityStarted(activity);
            Log.e("onActivityStarted",activity.getClass().getSimpleName());
         }

         @Override
         public void onActivityResumed(Activity activity) {
         }

         @Override
         public void onActivityPaused(Activity activity) {
         }

         @Override
         public void onActivityStopped(Activity activity) {
            GestureManager.getPassCodeManager().onActivityStopped(activity);
         }

         @Override
         public void onActivitySaveInstanceState(Activity activity, Bundle outState) {

         }

         @Override
         public void onActivityDestroyed(Activity activity) {

            Log.e("onActivityDestroyed",activity.getClass().getSimpleName());
            MyStack.removeActivity(activity);
            GestureManager.getPassCodeManager().onActivityDestroyed(activity);


         }

      });
   }
}
2 任务栈创建

import android.app.Activity;
import android.util.Log;


import java.util.LinkedList;

/**
 * Description:
 * Copyright  : Copyright (c) 2015
 * Company    : 望京soho
 * Author     : Byron
 * Date       : 2016/1/12 15:50
 */
public class MyStack {
    private static final LinkedList<Activity> activityList = ObjectUtil.newLinkedList();
    public static boolean HasActivityForward(Activity activity){
        for (int i=0;i<activityList.size();i++){
            Log.e("content",activity.getClass().getSimpleName());

            if(activityList.get(i)==activity){
                Log.e("activityList.size()",activityList.size()+"");
                try {
                    activityList.get(i+1);
                }catch (Exception e){
                    return false;

                }
            }
        }
        return  true;
    }
    public static void addActivity(Activity activity) {
        activityList.add(activity);
    }
    public static void removeActivity(Activity activity) {
        activityList.remove(activity);
    }
}


3 实现逻辑 在Manager中
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Handler;
import android.os.PowerManager;
import android.util.Log;
import android.view.WindowManager;
HubActivity;
主页的页面
Splashctivity;
闪屏的页面
GestureVerifyActivity //
中锁屏的页面
import java.util.HashSet;
import java.util.Set;

/**
 * Description:
 * Copyright  : Copyright (c) 2015
 * Company    : 望京soho
 * Author     : Byron
 * Date       : 2016/1/11 16:08
 */
public class GestureManager {
    private static final Set<Class> sExemptOfPasscodeActivites;
    private  boolean GestureClock=true;
    private  Handler hanlder;
    private MyRunnable runnable=new MyRunnable();
    static {
        sExemptOfPasscodeActivites = new HashSet<Class>();
        sExemptOfPasscodeActivites.add(GestureVerifyActivity.class);
    }

    public static GestureManager mGestureManagerInstance = null;

    public static GestureManager getPassCodeManager() {
        if (mGestureManagerInstance == null) {
            mGestureManagerInstance = new GestureManager();

        }
        return mGestureManagerInstance;
    }
    protected GestureManager() {
        hanlder=MamApp.getHandler();
    };

    public void onActivityCreated(Activity activity) {
        if (passCodeIsEnabled()) {
            activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE);
        } else {
            activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_SECURE);
        }
    }

    public void onActivityStarted(Activity activity) {

        Log.e("onActivityStarted",activity.getClass().getSimpleName());
        if(passCodeIsEnabled()){
            hanlder.removeCallbacks(runnable);
        }else{
            return;
        }
        if(sExemptOfPasscodeActivites.contains(activity.getClass())||activity instanceof SplashScreenActivity){
            return;
        }
        if(GestureClock){
     
     //||!(activity instanceof SplashScreenActivity)&& ActivityStack.getInstance().get
            GestureClock=false;
            Intent i = new Intent(MamApp.getAppContext(), GestureVerifyActivity.class);
            i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            activity.startActivity(i);
            GestureVerifyActivity.isClock=true;
            return;
        }
    }

    public void onActivityStopped(Activity activity) {
        if(sExemptOfPasscodeActivites.contains(activity.getClass())){
            return;
        }
        PowerManager powerMgr = (PowerManager) activity.getSystemService(Context.POWER_SERVICE);
        if (passCodeIsEnabled() && powerMgr != null && !powerMgr.isScreenOn()) {
            activity.moveTaskToBack(true);
        }
        if(passCodeIsEnabled()){
            if(MyStack.HasActivityForward(activity)){
                ActivityStack.getInstance().getActivityListLength();
                hanlder.removeCallbacks(runnable);
            }else{
                if(! GestureVerifyActivity.isClock){
                    Log.e("开始准备锁屏","开始准备锁屏");
                    hanlder.postDelayed(runnable,60*2*1000);
                }
            }
        }
    }
    public void onActivityDestroyed(Activity activity) {
        if(passCodeIsEnabled()&&!(activity instanceof SplashScreenActivity)){
            hanlder.removeCallbacks(runnable);
            Log.e("取消准备锁屏","取消准备锁屏");
            GestureClock=false;
        }
        if(activity instanceof HubActivity){
            GestureClock=true;
        }
    }
    private class MyRunnable implements Runnable{
        @Override
        public void run() {
                GestureClock=true;
        }
    }
    private boolean passCodeIsEnabled() {
//        SharedPreferences appPrefs = PreferenceManager.getDefaultSharedPreferences(MamApp.getAppContext());
        SharedPreferences appPrefs = MamApp.getAppContext().getSharedPreferences("Setting", Context.MODE_PRIVATE);
        return (appPrefs.getBoolean("gestrueState", false));
    }

}


Supongo que te gusta

Origin blog.csdn.net/Angle_Byron/article/details/50509236
Recomendado
Clasificación