簡體   English   中英

如何判斷我的應用程序是否從后台恢復?

[英]How can I tell if my Application is resumed from background?

我希望在應用程序進入后台時鎖定它的應用程序,當它恢復時,我想顯示我自己的鎖定屏幕。 鎖定屏幕是我的應用程序的活動。

成功登記密碼后,用戶可以看到恢復的活動,否則他不能。

我怎樣才能做到這一點?

主要問題是,當您從后台啟動Activity時,您必須獲得特定的行為。 每次在“ Activities之間切換時都會調用onPause()onResume() ,而不僅僅是在最小化應用程序時。 要解決這個問題,您可以從ActivityManager獲取當前正在運行的任務,並將其包名稱與您的應用程序進行比較:

private boolean isApplicationInBackground() {
    final ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
    final List<RunningTaskInfo> tasks = manager.getRunningTasks(1);
    if (!tasks.isEmpty()) {
        final ComponentName topActivity = tasks.get(0).topActivity;
        return !topActivity.getPackageName().equals(getPackageName());
    }    
    return false;
}

現在你可以這樣做:

public boolean wasPaused = false;

@Override
public void onPause() {
    super.onPause();

    if(isApplicationInBackground()) {
        wasPaused = true;
    }
}

@Override
public void onResume() {
    super.onResume();

    if(wasPaused) {
        lockScreen();
        wasPaused = false;
    }
}

就是這樣! 我建議你在一個基礎Activity它,你的所有其他Activities固有的。

如果您擁有全局活動“MyActivity”並且所有活動都從中擴展,則可以實現此目的。

然后在“MyActivity”上覆蓋onPause和onStop方法

@Override
public void onPause()
{
    super.onPause();
    setLockStatus(false);
}

@Override
public void onStop()
{
    super.onStop();
    setLockStatus(true);
}

和:

@Override
public void onResume()
{
    super.onResume();
    checkLockScreen();
}

編輯:顯然你需要創建方法setLockStatus和checkLockScreen並做任何你想做的事情(比如保存sharedPreferences上的狀態)。

對於任何有興趣的人,如果我正確理解你的問題,我會調查類似的功能,並對我發現的內容不滿意。 我想確定活動何時從后台恢復,而不是從被叫活動恢復活動。

我最終使用了一個boolean標志,該標志從startActivity設置,允許調用Activity確定它是從被調用的Activity還是從后台恢復。 像這樣的東西

private static boolean RESUME_FROM_ACTIVITY;

@Override
public void onResume(){
    super.onResume();
    if(!RESUME_FROM_ACTIVITY){
        // do what you want like lock the screen
    }
    RESUME_FROM_ACTIVITY = false;
}

@Override
public void startActivity(Intent intent){
    RESUME_FROM_ACTIVITY = true;
    super.startActivity(intent);
}

由於Android處理靜態和活動堆棧的方式(在本博文中閱讀更多內容) ,這應該在概念上有效。 更多的解釋是, 如果堆空間太大,靜態應該是當應用程序運行時從內存中清除的最后一個東西。 如果沒有堆棧本身被銷毀,活動將不會被銷毀,因此onResume將被調用,它將檢查靜態標志以查看它是來自另一個活動還是來自后台。

靜態甚至可能過度殺傷,因為活動本身也不會被破壞,並且它的全局變量將盡可能長。 這只是概念性的,我們仍處於壓力測試的中間,但它是一種選擇。 如果我們發現任何問題,我會更新這篇文章。

您的活動在其生命周期中具有onResume()回調。 簡單地覆蓋它並做你需要做的事情。

那么你應該重寫onResume和onPause上的方法

看到這個 ,你會得到它:)

在你的活動中你可以有一個像布爾鎖定的標志;

並在onPause中,您可以將其設置為true。 每次在關鍵位置,您都可以檢查此標志的狀態,如果確實如此,則表示解鎖活動,在解鎖成功后將標志設置為false。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM