關於這一套功能的實現我是在Application中實現的,關於Application的描述下面這個鏈接中有挺詳細的描述。
關於這一套方邏輯的實現在網上是有人這麼提出的,但是都只是簡單的介紹了一下,並沒有做更詳細的介紹,所以我這裏琢磨了半天正好用這套方案實現了,所以就拿出來與大家詳細分享一下。
首先當然我們要自己實現一下我們應用的Application類,然後重寫我們的onCreate方法:
public class MyApp extends Application {
@Override
public void onCreate() {
super.onCreate();
}
@Override
public void onCreate() {
super.onCreate();
}
}
接下來呢,就是我們要在onCreate這個方法中寫些什麼了,如下:
this.registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
@Override
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
@Override
public void onActivityCreated(Activity activity, Bundle 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();
@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 activity, Bundle 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;
// }
}
});
// Log.e("TAG", "111111");
if (GestureVerifyActivity.class.getName().equals(activityName)) {
return;
}
isActive = false;
// Log.e("TAG", "進入後臺,變爲"+isActive);
}
}
@Override
public void onActivitySaveInstanceState(Activity activity, Bundle 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 = (ActivityManager) context.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 activity, Bundle 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 activity, Bundle outState) {
// Log.e("App", "onActivitySaveInstanceState");
}
@Override
public void onActivityDestroyed(Activity activity) {
// Log.e("tag", activity.getClass().getName() + "onActivityDestroyed");
}
});
}
}
}
}
@Override
public void onActivitySaveInstanceState(Activity activity, Bundle 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);
}
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);
* 手勢調用
* 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));
}
}
}
// 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,然後去提取下我們的手勢開關的開啓狀態,如果這個狀態是開啓的,那麼我們的手勢解鎖頁面就會跳轉出來。
這樣,基本就這麼搞定了,可能我這麼做的方式有不少問題,畢竟新手麼,歡迎各位大神來幫我糾正了,我能做到的就是分享我知道的了,而且也是記錄自己的歷程,積累經驗。