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();
}
}
記得相應地更新您的清單文件。
編輯
我們必須複製該新的活動,所需要的活動的每一種(例如 ActionBarActivity)。 我們仍然必須記住 延伸正確的活動,它可能會在較大的團隊中出現問題。
以上所有內容都是通過一個接口來解決的,該接口傳遞給需要向對象提供關於其可見性狀態功能的類。
public interface Hideable
{
boolean isVisible();
}
如果一個人想使用你的類,那麼這個類應該明確有Hideable
接口作爲其構造函數/ public方法的參數之一。如果你想限制參數,延長Activity
和實現Hideable
那麼這個通用的例子(使用通配符使用)是正確的事情:
//TODO design new parameter name
public <T extends Activity & Hideable> void myMethod(T iNeedToBeHideableActivity)
看到這樣的方法,開發人員應經過:
- 擴展其中一個預定義的
activities
已經實現了這個 接口。
- 或者在他們自己的
activity
中實現這個接口。
- 問問你什麼是通配符。
在這種情況下,正確行爲的要求是顯而易見的 - 界面應該宣佈特定對象是否可見。
PS。這不是很難複製,因爲每個實現可能在某些方面有所不同。例如,Application
類缺少onDestroy
事件,所以執行Hideable
接口應該有所不同。
EDIT
通過添加泛型改進上述建議。
嘗試使用進程和進程ID來查找活動,如果活動可見,進程將位於頂部。 –
@AkhilJayakumar正如我所說的使用ActivityManager的第一個解決方案。 –
ActivityLifecycleCallbacks呢? –