- 这种方式在application里面进行监听,根据FrameWork提供的监听来来判断启动的activity的数量来进行判断。
registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() { @Override public void onActivityCreated(Activity activity, Bundle savedInstanceState) { } @Override public void onActivityStarted(Activity activity) { mFinalCount++; //如果mFinalCount ==1,说明是从后台到前台 Log.e("onActivityStarted", mFinalCount +""); if (mFinalCount == 1){ //说明从后台回到了前台 Intent intent = new Intent(getApplicationContext(), StartActivity.class).setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); } } @Override public void onActivityResumed(Activity activity) { } @Override public void onActivityPaused(Activity activity) { } @Override public void onActivityStopped(Activity activity) { mFinalCount--; //如果mFinalCount ==0,说明是前台到后台 Log.i("onActivityStopped", mFinalCount +""); if (mFinalCount == 0){ //说明从前台回到了后台 } } @Override public void onActivitySaveInstanceState(Activity activity, Bundle outState) { } @Override public void onActivityDestroyed(Activity activity) { } });
2.在BaseActivity的里面进行监听,第种方式是通过activity全部继承,对于自身生命周期监听的方式来进行判断。
public class BaseActivity extends Activity{ public static boolean isActive; //全局变量 @Override protected void onResume() { Log.d("dukang", "Base onResume: "); if (!isActive) { //app 从后台唤醒,进入前台 isActive = true; Log.i("ACTIVITY", "程序从后台唤醒"); // startActivity(new Intent(this,StartActivity.class)); } super.onResume(); } @Override protected void onStart() { super.onStart(); } @Override protected void onPause() { super.onPause(); } @Override protected void onStop() { Log.d("DK", "onStop: 程序进入后台"+System.currentTimeMillis()); if (!isAppOnForeground()) { //app 进入后台 isActive = false;//记录当前已经进入后台 Log.d("DK", "程序进入后台"+System.currentTimeMillis()); } super.onStop(); } @Override protected void onDestroy() { super.onDestroy(); } /** * APP是否处于前台唤醒状态 * * @return */ public boolean isAppOnForeground() { ActivityManager activityManager = (ActivityManager) getApplicationContext().getSystemService(Context.ACTIVITY_SERVICE); String packageName = getApplicationContext().getPackageName(); List<ActivityManager.RunningAppProcessInfo> appProcesses = activityManager .getRunningAppProcesses(); if (appProcesses == null) return false; for (ActivityManager.RunningAppProcessInfo appProcess : appProcesses) { // The name of the process that this object is associated with. if (appProcess.processName.equals(packageName) && appProcess.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) { return true; } } return false; } }
3.通过这2个方式可以完成一个常见的广告功能,使用常景:每次启动app都会跳出一个引导页面,然后显示之前的退出的页面的实现效果,具体看效果。
(流程是首先第一次启动app,进入引导页,然后过2秒进入主界面,点击跳转到第2个界面,再点击跳转到第3个界面;这个时候按HOME键退到桌面,再启动app,先进入到引导页,过2秒显示的是第3个界面,一次back键返回到桌面的一个效果)。
对于引导页,在引导页面的onCreate()方法里让它自杀。
public class StartActivity extends BaseActivity { @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_start); new Handler().postDelayed(new Runnable() { @Override public void run() { finish(); } },2500); } }
4.==温馨提示==:这里需要注意的是:第一种方式需要在AndoridManifest中为每个activity设置 android:configChanges=”orientation|keyboard|screenSize”,让他们不去重启activity,第二种方式不用设置也不会影响效果,不过还是建议添加(毕竟还是会去判断,影响性能麽),差别是该方法是通过对当前app包名的判断是否处在前台,所以不会重走activity的生命周期。