关于这一套功能的实现我是在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,然后去提取下我们的手势开关的开启状态,如果这个状态是开启的,那么我们的手势解锁页面就会跳转出来。
这样,基本就这么搞定了,可能我这么做的方式有不少问题,毕竟新手麽,欢迎各位大神来帮我纠正了,我能做到的就是分享我知道的了,而且也是记录自己的历程,积累经验。