2015-10-20 58 views
0

我想詢問您是否確定我的應用程序當前對用戶可見(前景)的最佳方法。我知道有兩種解決方案:確定應用程序何時處於前景狀態的最佳方法

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

你知道還有其他更好的方法嗎?你怎麼看,最好是什麼?爲什麼?

編輯


根據我的第二sollution SKYWELL表明,我們可以創建一個Activity其中onResume()onPause()我們可以改變我們boolean變量的狀態。應用程序中的每個Activity應擴展我們的新Activity。但是這種想法產生一些新的問題:

  1. 我們必須複製新的Activity爲每一種(例如ActionBarActivity)所需要的活動的。
  2. 我們仍然必須記住延伸正確的活動,它可能在較大的團隊中存在問題。

我的第二個解決方案的很好的解釋是在DroidAks的文章中提供的。

+0

嘗試使用進程和進程ID來查找活動,如果活動可見,進程將位於頂部。 –

+0

@AkhilJayakumar正如我所說的使用ActivityManager的第一個解決方案。 –

+0

ActivityLifecycleCallbacks呢? –

回答

1

如果你想跟蹤應用程序是否在前臺。這可能是最好的方法。 使用Activity.onPause,Activity.onResume方法檢查您的應用程序的狀態。將「可見性」狀態存儲在某個其他課程中。現在,您是否履行自己的應用程序類爲:

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跟蹤的應用是否是當前用戶或不可見的。 AndroidLifecycleCallbacks在API級別14中添加。希望它可以幫助你。

@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" > 
+0

這是對我的第二個解決方案的很好的解釋。但是,我們是否將它與天空觀念混合在一起,這可能是最好的最終方式。 –

0

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類的實現是不夠的(有可能是設置visiblefalse麻煩),然後繼續尋找更合適的解決方案:

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(); 
    } 
} 

記得相應地更新您的清單文件。

編輯


我們必須複製該新的活動,所需要的活動的每一種(例如 ActionBarActivity)。 我們仍然必須記住 延伸正確的活動,它可能會在較大的團隊中出現問題。

以上所有內容都是通過一個接口來解決的,該接口傳遞給需要向對象提供關於其可見性狀態功能的類。

public interface Hideable 
{ 
    boolean isVisible(); 
} 

如果一個人想使用你的類,那麼這個類應該明確有Hideable接口作爲其構造函數/ public方法的參數之一。如果你想限制參數,延長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接口應該有所不同。

EDIT


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

+0

好的,我們可以找到很多方法(看起來不同/效果稍好,但想法仍然相同)來改進我提出的解決方案之一。它仍然是同樣的方式,但「更美麗」。它仍然會導致編輯我的帖子中描述的問題。 –

+0

是的,確定第二個想法更聰明,但這有一個問題。例如服務中不能使用此解決方案。你必須寫另一個專門用於服務(因爲你的服務不知道你的活動,不能提供他們)。 第二個巨大的缺點是你只能聽一種活動(通過槽法或構造函數參數)。 –

+0

@ArturSzymański關於服務:是的,這些不知道你的活動,所以這裏要做的正確的事情是讓它們以某種特定於android的方式進行交流,並傳遞可見的價值。例如,一個自定義序列化程序。這個接口在這裏很方便,因爲它可以在你的可序列化對象中實現。關於第二個巨大的劣勢:我不明白。爲什麼如果爲「Activity」類指定通配符,只能監聽一種活動?這顯然意味着各種各樣的活動(使用'Hideable')。 – DreamOnJava

相關問題