我們知道举娩,當(dāng)我們按返回或Home鍵退出應(yīng)用程序的界面時(shí)寂屏,應(yīng)用程序會(huì)在后臺(tái)被掛起。這么設(shè)計(jì)的好處是懦底,由于應(yīng)用被系統(tǒng)緩存在內(nèi)存中漠秋,那么在用戶打開啟動(dòng)應(yīng)用時(shí)就可以通過調(diào)用緩存笙蒙,快速啟動(dòng)應(yīng)用。當(dāng)然庆锦,由于當(dāng)今內(nèi)存和處理器能力的限制捅位,系統(tǒng)會(huì)自動(dòng)關(guān)閉一些進(jìn)程。
那么我如何判斷這個(gè)應(yīng)用程序在前臺(tái)還是后臺(tái)搂抒,應(yīng)用從后臺(tái)回到前臺(tái)了艇搀?
看到一般都是runningProcess或者runningTasks來判斷應(yīng)用在前臺(tái)還是后臺(tái)
事實(shí)上,Android在SDK 14的時(shí)候提供了一個(gè)Callback求晶。ActivityLifecycleCallbacks焰雕,你可以通過這個(gè)Callback拿到App所有Activity的生命周期回調(diào)》夹樱看圖:
public class Application extends android.app.Application {
private int activityCount;//activity的count數(shù)
private boolean isForeground;//是否在前臺(tái)
@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) {
} }); } }
這個(gè)Callback寫在Application里的矩屁,你可以在Application初始化的時(shí)候來注冊(cè)。
通過這些回調(diào)我們可以將這個(gè)計(jì)數(shù)放在onStart()和onStop()中去爵赵。activityCount==1吝秕,那么就是前臺(tái),activityCount==0空幻,那就是后臺(tái)烁峭。這樣判斷很很簡(jiǎn)單了吧。
public abstract class BaseClass extends AppCompatActivity {
判斷當(dāng)前的應(yīng)用程序是不是在運(yùn)行
//需要申請(qǐ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; //聲明一個(gè)布爾變量,記錄當(dāng)前的活動(dòng)背景
@Override public void onPause(){
super.onPause();
if(isApplicationBroughtToBackground())
wasBackground= true; }
public void onResume(){
super.onResume();
if(wasBackground){//
Log.e("aa","從后臺(tái)回到前臺(tái)"); } wasBackground= false; }}