手勢解鎖功能邏輯的實現【不含手勢解鎖界面實現】(二)

關於這一套功能的實現我是在Application中實現的,關於Application的描述下面這個鏈接中有挺詳細的描述。

關於這一套方邏輯的實現在網上是有人這麼提出的,但是都只是簡單的介紹了一下,並沒有做更詳細的介紹,所以我這裏琢磨了半天正好用這套方案實現了,所以就拿出來與大家詳細分享一下。

首先當然我們要自己實現一下我們應用的Application類,然後重寫我們的onCreate方法:

public class MyApp extends Application {

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

接下來呢,就是我們要在onCreate這個方法中寫些什麼了,如下:

        this.registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
            @Override
            public void onActivityCreated(Activity activityBundle savedInstanceState) {
//                Log.e("App", "onActivityCreated");
            }

            @Override
            public void onActivityStarted(Activity activity) {
//                Log.e("App", "onActivityStarted");
            }

            @Override
            public void onActivityResumed(Activity activity) {
//                Log.e("App", "onActivityResumed");
            }

            @Override
            public void onActivityPaused(Activity activity) {
//                Log.e("App", "onActivityPaused");
            }

            @Override
            public void onActivityStopped(Activity activity) {
//                Log.e("TAG", "App   onActivityStopped");
                String activityName = activity.getClass().getName();
//                Log.e("TAG", "App   name"+activityName);
                if (isApplicationBroughtToBackground(activity)) {
//                    Log.e("TAG", "111111");
                    if (GestureVerifyActivity.class.getName().equals(activityName)) {
                        return;
                    }
                    isActive false;
//                    Log.e("TAG", "進入後臺,變爲"+isActive);
                }
            }

            @Override
            public void onActivitySaveInstanceState(Activity activityBundle outState) {
//                Log.e("App", "onActivitySaveInstanceState");
            }

            @Override
            public void onActivityDestroyed(Activity activity) {
//                Log.e("tag", activity.getClass().getName() + "onActivityDestroyed");
//                if(GestureVerifyActivity.class.getName().endsWith(activity.getClass().getName())) {
//                    isActive = true;
//                }
            }
        });

這裏是用了ActivityLifecycleCallbacks接口的一套回調方法,在這裏我可以實現對整個應用所有Activity的監聽和處理。

其實這裏並沒有什麼複雜的邏輯,就是定義了一個布爾類型的變量值,然後進行改變。
下面這段完整的代碼。

public class MyApp extends Application {

    public static boolean isActivity true;


    /**
     *判斷當前應用程序處於前臺還是後臺
     */
    public static boolean isApplicationBroughtToBackground(final Context context) {
        ActivityManager am = (ActivityManagercontext.getSystemService(Context.ACTIVITY_SERVICE);
        List<ActivityManager.RunningTaskInfo> tasks = am.getRunningTasks(1);
        if (!tasks.isEmpty()) {
            ComponentName topActivity = tasks.get(0).topActivity;
            if (!topActivity.getPackageName().equals(context.getPackageName())) {
                return true;
            }
        }
        return false;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        this.registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
            @Override
            public void onActivityCreated(Activity activityBundle savedInstanceState) {
//                Log.e("App", "onActivityCreated");
            }

            @Override
            public void onActivityStarted(Activity activity) {
//                Log.e("App", "onActivityStarted");
            }

            @Override
            public void onActivityResumed(Activity activity) {
//                Log.e("App", "onActivityResumed");
            }

            @Override
            public void onActivityPaused(Activity activity) {
//                Log.e("App", "onActivityPaused");
            }

            @Override
            public void onActivityStopped(Activity activity) {
//                Log.e("TAG", "App   onActivityStopped");
                String activityName = activity.getClass().getName();
//                Log.e("TAG", "App   name"+activityName);
//                if (!isAppOnFreground()) {
                if (isApplicationBroughtToBackground(activity)) {
//                    Log.e("TAG", "111111");
                    if (GestureVerifyActivity.class.getName().equals(activityName)) {
                        return;
                    }
                    isActivity  false;
//                    Log.e("TAG", "進入後臺,變爲"+isActive);
                }
            }

            @Override
            public void onActivitySaveInstanceState(Activity activityBundle outState) {
//                Log.e("App", "onActivitySaveInstanceState");
            }

            @Override
            public void onActivityDestroyed(Activity activity) {
//                Log.e("tag", activity.getClass().getName() + "onActivityDestroyed");
            }
        });
    }
}

然後接下來,在我們的公共Activity裏(BaseActivity就是我們一般都會去建這麼一個公共的Activity去實現一些相同的邏輯)的onResume方法中,去走這麼一段流程:
@Override
protected void onResume(){
    super.onResume();
    GestureUtils.openGesture(this);

}

/**
* 手勢調用
* Created by Administrator on 2016/12/22.
*/

public class GestureUtils {


public static void openGesture(Context context) {
// Log.e("TAG", "GestureUtils手勢檢測開始"+isActive);
if(!isActivity  ){
// Log.e("TAG", "GestureUtils檢測開啓"+isActive);
//從後臺喚醒
isActivity   = true;
boolean gesture_status = SpUtils.getInstance(context).getBoolean("gesture_status", false);
// Log.e("TAG", "GestureUtils手勢開關狀態"+gesture_status);
if(!gesture_status) {
return;
}
String className = context.getClass().getName();
if (!RegActivity.class.getName().equals(className)) {
context.startActivity(new Intent(context, GestureVerifyActivity.class));
}
}
}


整體思路就是,有一個布爾變量,當我們點擊Home鍵或者是其他方式將App切換至後臺時,我們所有的頁面這時候會看不到,也就會執行onActivityStopped的回調,然後我們在這裏通過方法isApplicationBroughtToBackground()  ,確認我們的App進入了後臺頁面,然後將isActivity這個值變爲false,而這時候點擊我們的App回到前臺時就要,就要執行onResume方法,如果此時isActivity的值是false我們就要執行後面的代碼,首先將我們的 isActivity 變回true,然後去提取下我們的手勢開關的開啓狀態,如果這個狀態是開啓的,那麼我們的手勢解鎖頁面就會跳轉出來。

這樣,基本就這麼搞定了,可能我這麼做的方式有不少問題,畢竟新手麼,歡迎各位大神來幫我糾正了,我能做到的就是分享我知道的了,而且也是記錄自己的歷程,積累經驗。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章