[英]Best way to determine when app is foreground
我想問您有關確定我的應用當前對用戶(前景)可見的最佳方法。 我知道有兩種解決方案:
ActivityManager
但這是非常昂貴的方法。 boolean
變量,並在每個Activity
onResume()
和onPause()
中更改其狀態。 該解決方案的主要缺點是要記住其他代碼。 您知道其他更好的方法嗎? 您怎么看,什么更好,為什么?
編輯
根據我的第二個解決方案,skywell建議我們可以創建一個Activity
,其中可以在onResume()
和onPause()
中更改boolean
變量的狀態。 應用程序中的每個Activity
應該擴展我們的新Activity
。 但是這個想法產生了一些新的問題:
Activity
為每一種(例如ActionBarActivity
)所需要的活動的。 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)
看到這種方法后,開發人員應:
activities
之一。 activity
實現此接口。 在這種情況下,正確行為的要求很明顯-接口應該宣布,無論特定對象是否可見。
PS。 這不是一個非常丑陋的重復,因為每種實現在某些方面可能有所不同。 例如, Application
類缺少onDestroy
事件,因此Hideable
接口的實現在Hideable
應該有所不同。
編輯
通過添加泛型對上述建議進行了改進。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.