![](/img/trans.png)
[英]Android activity life cycle - what are all these methods for?
[英]What are the Android application lifecycle methods? (not activity life cycle methods.)
在我的android應用程序中,有10個活動。 我通過數字識別所有這些活動。 假設活動1到活動10。
現在,當我第一次登錄我的應用程序時,它將顯示啟動畫面,然后顯示登錄畫面。 我的應用詢問密碼。 然后它將我重定向到活動3,即書的第1頁。 現在,假設我在第5頁上,即活動7,突然按下了“主頁”按鈕,然后應用程序進入后台狀態。
現在我想要的是,當我再次打開應用程序並且在前台打開應用程序時,它不會啟動活動7。我想先啟動活動2(登錄屏幕),然后要求輸入正確的密碼。 如果用戶輸入正確的密碼,則僅活動7開始。 所以基本上我的問題是,有什么方法可以確定我的應用程序在開始活動之前是進入后台還是進入前台? (即android應用程序生命周期方法。)因此,我可以首先通過該應用程序生命周期方法啟動登錄活動。 在iOS中,這可以通過應用程序委托生命周期方法實現。 但是我怎么能用android呢?
這是由於活動生命周期而發生的。 當您通過按下主屏幕按鈕關閉應用程序時,將調用當時處於活動狀態的相應Activity的onStop()方法。 此方法不會完全破壞活動,只會停止它。
通過調用相應Activity的onDestroy()方法可以銷毀Android OS中的Activity。 但是,不能直接調用onDestroy()方法,因為它是Activity的LifeCycle的方法。 Android OS會自動調用它。 為確保您的Activity停止后,Activity的onDestroy()方法會立即被調用,我們將在您各自Activity的onStop()方法內調用finish()方法。
@Override
protected void onStop() {
super.onStop();
finish();
}
現在,當您再次啟動應用程序時,它將從頭開始,即啟動屏幕。
由於您不想給用戶任何余地,並且希望在應用程序進入后台后立即注銷用戶,因此我們可以使用一般活動生命周期來區分應用程序何時進入后台以及何時發生屏幕切換。 您的Application類如下所示:
public class MyApplication extends Application implements ActivityLifecycleCallbacks {
public boolean userLoggedoff;
...
@Override
public void onActivityResumed(Activity activity) {
Log.i("Activity Resumed", activity.getLocalClassName());
if (userLoggedoff)
startPasswordActivity() // Make sure you add 'CLEAR_TOP' flag to intent
}
...
}
根據以下模板進行“登錄”活動:
public class Act1 extends Activity {
private boolean legitSwitch;
...
// Legit app switch
private void startNewAct() {
legitSwitch = true;
...
startActivity()
}
protected void onPause() {
if (!legitSwitch)
((MyApplication) getApplication()).userLoggedOff = true;
}
}
確保從登錄活動userLoggedOff
布爾值設置為true。 希望這可以幫助。 現在請記住,按下主頁按鈕並返回后,由於我們正在對應用程序類的onActivityResumed()
方法進行操作,因此上述方法仍然會立即顯示先前的活動,但是由於用戶敢於執行,因此該方法也將立即啟動Login Activity。按下主屏幕按鈕!
您可以為此擴展Application類。 您需要像這樣實現Activity生命周期回調:
public class MyApplication extends Application implements ActivityLifecycleCallbacks {
private boolean userLoggedOff;
private Handler mHandler;
...
@Override
public void onActivityResumed(Activity activity) {
Log.i("Activity Resumed", activity.getLocalClassName());
if (userLoggedoff)
startPasswordActivity()
else {
mHandler.cancelCallbacksAndMessages(null);
userLoggedOff = false;
}
}
@Override
public void onActivityPaused(Activity activity) {
Log.i("Activity Paused", activity.getLocalClassName());
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
userLoggedOff = true;
}
}, 5000);
}
...
}
現在,我們要嘗試的是,一旦調用任何活動的onPause()
,我們就會使用處理程序觸發延遲事件以注銷用戶。 僅當在5秒鍾內調用任何活動的onResume()
時,才能取消此事件(如您所知,可以在常規活動切換期間或在應用程序來自后台時調用此事件)。
我想,這可能可以優雅地解決您的問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.