我們知道,當(dāng)我們按返回或Home鍵退出應(yīng)用程序的界面時,應(yīng)用程序會在后臺被掛起。這么設(shè)計的好處是,由于應(yīng)用被系統(tǒng)緩存在內(nèi)存中,那么在用戶打開啟動應(yīng)用時就可以通過調(diào)用緩存,快速啟動應(yīng)用。當(dāng)然,由于當(dāng)今內(nèi)存和處理器能力的限制,系統(tǒng)會自動關(guān)閉一些進(jìn)程。
那么我如何判斷這個應(yīng)用程序在前臺還是后臺,應(yīng)用從后臺回到前臺了?
看到一般都是runningProcess或者runningTasks來判斷應(yīng)用在前臺還是后臺
事實上,Android在SDK 14的時候提供了一個Callback。ActivityLifecycleCallbacks,你可以通過這個Callback拿到App所有Activity的生命周期回調(diào)。
public class Application extends android.app.Application { private int activityCount;//activity的count數(shù) private boolean isForeground;//是否在前臺 @Override public void onCreate() { super.onCreate(); registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() { @Override public void onActivityCreated(Activity activity, Bundle savedInstanceState) { } @Override public void onActivityStarted(Activity activity) { activityCount++; } @Override public void onActivityResumed(Activity activity) { } @Override public void onActivityPaused(Activity activity) { } @Override public void onActivityStopped(Activity activity) { activityCount--; if(0==activityCount){ isForeground=false; } } @Override public void onActivitySaveInstanceState(Activity activity, Bundle outState) { } @Override public void onActivityDestroyed(Activity activity) { } }); } }這個Callback寫在Application里的,你可以在Application初始化的時候來注冊。
通過這些回調(diào)我們可以將這個計數(shù)放在onStart()和onStop()中去。activityCount==1,那么就是前臺,activityCount==0,那就是后臺。這樣判斷很很簡單了吧。
public abstract class BaseClass extends AppCompatActivity { 判斷當(dāng)前的應(yīng)用程序是不是在運行//需要申請GETTask權(quán)限 private boolean isApplicationBroughtToBackground() { ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); List<ActivityManager.RunningTaskInfo> tasks = am.getRunningTasks(1); if (!tasks.isEmpty()) { ComponentName topActivity = tasks.get(0).topActivity; if (!topActivity.getPackageName().equals(getPackageName())) { return true; } } return false; } public boolean wasBackground= false; //聲明一個布爾變量,記錄當(dāng)前的活動背景 @Override public void onPause(){ super.onPause(); if(isApplicationBroughtToBackground()) wasBackground= true; } public void onResume(){ super.onResume(); if(wasBackground){// Log.e("aa","從后臺回到前臺"); } wasBackground= false; }}感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
新聞熱點
疑難解答
圖片精選