本文轉自http://blog.csdn.net/goodlixueyong/article/details/50543627
注:對一些安全性要求較高的app,在用戶後臺運行一段時間後重新打開都是需要進行一次身份驗證
原理
在Application類中,提供了一個應用生命週期回調的註冊方法,用來對應用的生命週期進行集中管理,這個接口叫registerActivityLifecycleCallbacks,可以通過它註冊自己的ActivityLifeCycleCallback,每一個Activity的生命週期都會回調到這裏的對應方法
代碼實現
activity切換時的週期
first------->onPause()
Another------->onCreate()
Another------->onStart()
Another------->onResume()
first------->onStop()
public class MyApplication extends Application {
//判斷是否在前後臺
private int count = 0;
//第一次不對程序進行處理裏
private boolean isFirst = true;
private boolean isBack = false;
private long time = -2;
@Override
public void onCreate() {
super.onCreate();
registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
@Override
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
}
@Override
public void onActivityStarted(final Activity activity) {
if (isFirst) {
isFirst = false;
} else {
if (count == 0) {
Date date = new Date();
//回到前臺的時間
long returntime = date.getTime();
//程序在後臺運行的時間
long sub = returntime - time;
Log.v("viclee", ">>>>>>>>>>>>>>>>>>>切到前臺 lifecycle");
//時間小於300秒或者啓動的activity爲首頁則不執行操作
if (sub < 300000 || activity.getClass().getName().equals("com.test.LoginActivity")) {}
else {
new AlertDialog.Builder(activity)
.setTitle("提示消息")
.setMessage("請重新登錄")
.setPositiveButton("確定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
String callbackActivity = activity.getClass().getName();
//跳轉到登錄界面
Intent i = new Intent(activity, LoginActivity.class);
i.putExtra("target", callbackActivity);
//將傳入當前activity的數據保存,以便在跳轉回來時不報錯
Bundle params = activity.getIntent().getExtras();
if (params != null) {
i.putExtras(params);
}
activity.startActivity(i);
dialog.dismiss();
}
})
.setOnKeyListener(new DialogInterface.OnKeyListener() {
@Override
public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) {
//禁用返回鍵,要求必須重新登錄
if(keyCode==KeyEvent.KEYCODE_BACK){
return true;
}else {
return false;
}
}
}).show();
}
}
}
count++;
}
@Override
public void onActivityResumed(Activity activity) {
}
@Override
public void onActivityPaused(Activity activity) {
}
@Override
public void onActivityStopped(Activity activity) {
count--;
if (count == 0) {
Log.v("viclee", ">>>>>>>>>>>>>>>>>>>切到後臺 lifecycle");
Date date = new Date();
//保存上一次在後臺的時間
time = date.getTime();
}
}
@Override
public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
}
@Override
public void onActivityDestroyed(Activity activity) {
}
}
);