簡體   English   中英

確定應用何時為前台的最佳方法

[英]Best way to determine when app is foreground

我想問您有關確定我的應用當前對用戶(前景)可見的最佳方法。 我知道有兩種解決方案:

  1. 使用ActivityManager但這是非常昂貴的方法。
  2. 創建任何boolean變量,並在每個Activity onResume()onPause()中更改其狀態。 該解決方案的主要缺點是要記住其他代碼。

您知道其他更好的方法嗎? 您怎么看,什么更好,為什么?

編輯


根據我的第二個解決方案,skywell建議我們可以創建一個Activity ,其中可以在onResume()onPause()中更改boolean變量的狀態。 應用程序中的每個Activity應該擴展我們的新Activity 但是這個想法產生了一些新的問題:

  1. 我們必須復制新的Activity為每一種(例如ActionBarActivity )所需要的活動的。
  2. 我們仍然需要記住有關擴展正確活動的信息,這在較大的團隊中可能會出現問題。

DroidAks的帖子中對我的第二個解決方案做了很好的解釋。

是否要跟蹤應用程序是否在前台。 這可能是最好的方法。 自己使用Activity.onPause,Activity.onResume方法檢查應用程序的狀態。 將“可見性”狀態存儲在其他一些類中。 現在在您自己的Application類中實現為:

public class MyApplication extends Application 
{

    public static boolean isActivityVisible()
    {
       return activityVisible;
    }  

    public static void activityResumed() 
    {
        activityVisible = true;
    }

    public static void activityPaused() 
    {
        activityVisible = false;
    }

    private static boolean activityVisible;
    }

現在在每個activity添加onResume()onPause()

我們可以使用AndroidLifecycleCallbacks跟蹤該應用程序當前是否對用戶可見。 在API級別14中添加了AndroidLifecycleCallbacks。希望對您有所幫助。

@Override
protected void onResume() {
super.onResume();
MyApplication.activityResumed();
}

@Override
protected void onPause() {
super.onPause();
MyApplication.activityPaused();
}

還要在清單中添加以下代碼。

<application
android:name="your.app.package.MyApplication"
android:icon="@drawable/icon"
android:label="@string/app_name" >

DroidAks做出的回答是好的,但還不夠好。 眾所周知,在static變量中具有狀態並不是要做的最漂亮的事情。 這樣做意味着您必須記住,您需要管理此狀態並進行清理。 同樣,在這種情況下, Application類中具有static變量意味着您的類將完全依賴於此特定Application類。 如果您想用自己的代碼創建一個可在許多應用程序中使用的庫,該怎么辦?

這是我的建議:

public class MyApplication extends Application
{
    private boolean visible;
    public boolean isVisible()
    {
        return visible;
    } 
    //use Application events to manage app visibility state
}

在您的Activity代碼中:

public class MyActivity extends Activity
{
    @Override
    protected void onResume() 
    {
        super.onResume();
        MyApplication myApp = (MyApplication)this.getApplication();
        //myApp.isVisible();
    }
}

如果上面的MyApplication類實現還不夠(將visible設置為false可能會有麻煩),請繼續解決此問題:

public /*abstract*/ class MyActivity extends Activity
{
    private boolean visible;
    protected boolean isVisible()
    {
        return visible;
    } 
    //use Activity events to manage activity visibility state
    //for ex.
    @Override
    protected void onResume() 
    {
        super.onResume();
        visible = true;
    }
}

public class MyConcreteActivity extends MyActivity
{
    @Override
    protected void onResume() 
    {
        super.onResume(); // calls onResume from base MyActivity,
                          // thus always setting visible state properly
        //isVisible();
    }
}

記住要相應地更新清單文件。

編輯


我們必須為每種所需的Activity(例如ActionBarActivity)復制該新的Activity。 我們仍然需要記住有關擴展正確活動的信息,這在較大的團隊中可能會出現問題。

上面所有這些都是通過具有一個接口來解決的,該接口傳遞給需要向對象詢問其可見性狀態的功能的類。

public interface Hideable
{
   boolean isVisible();
}

如果要使用Your類,則該類應顯式具有Hideable接口作為其構造函數/公共方法參數之一。 如果您想限制參數以擴展Activity 實現Hideable則此通用示例(使用通配符)是正確的做法:

//TODO design new parameter name
public <T extends Activity & Hideable> void myMethod(T iNeedToBeHideableActivity)

看到這種方法后,開發人員應:

  1. 擴展已經實現此接口的預定義activities之一。
  2. 或者在自己的activity實現此接口。
  3. 詢問您什么是通配符。

在這種情況下,正確行為的要求很明顯-接口應該宣布,無論特定對象是否可見。

PS。 這不是一個非常丑陋的重復,因為每種實現在某些方面可能有所不同。 例如, Application類缺少onDestroy事件,因此Hideable接口的實現在Hideable應該有所不同。

編輯


通過添加泛型對上述建議進行了改進。

暫無
暫無

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

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