Activitylifecyclecallbacks使用

jopen 10年前

 

Application通过ActivityLifecycleCallbacks使用接口提供了一套回调方法,用于让开发者对 Activity的生命周期事件进行集中处理。 ActivityLifecycleCallbacks接口回调可以简化监测Activity的生命周期事件,在一个类中作统一处理。 ActivityLifecycleCallbacks使用要求API 14+ (Android 4.0+)。

使用方法

重写Application的onCreate()方法,或在Application的无参构造方法内,调用 Application.registerActivityLifecycleCallbacks()方法 ,并实现ActivityLifecycleCallbacks接口。

public class BaseApplication extends Application {      public void onCreate() {          super.onCreate();          this.registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {    @Override    public void onActivityStopped(Activity activity) {        Log.e("====", activity+"onActivityStopped");    }    @Override    public void onActivityStarted(Activity activity) {        Log.e("====", activity+"onActivityStarted");    }    @Override    public void onActivitySaveInstanceState(Activity activity, Bundle outState) {        Log.e("====", activity + "onActivitySaveInstanceState");    }    @Override    public void onActivityResumed(Activity activity) {        Log.e("====", activity + "onActivityResumed");    }    @Override    public void onActivityPaused(Activity activity) {        Log.e("====", activity + "onActivityPaused");    }    @Override    public void onActivityDestroyed(Activity activity) {        Log.e("====", activity + "onActivityDestroyed");    }    @Override    public void onActivityCreated(Activity activity, Bundle savedInstanceState) {        Log.e("====", activity + "onActivityCreated");    }          });      };  }

为了测试,再新建两个activity:MainActivity和SecondActivity,点击MainActivity里面的按钮可以跳转到SecondActivity。 MainActivity代码如下:
public class MainActivity extends ActionBarActivity {    private Button btn = null;    @Override    protected void onCreate(Bundle savedInstanceState) {      super.onCreate(savedInstanceState);      setContentView(R.layout.activity_main);      btn = (Button) findViewById(R.id.btn);      btn.setOnClickListener(new View.OnClickListener() {        @Override        public void onClick(View v) {          Intent i = new Intent(MainActivity.this,SecondActivity.class);          startActivity(i);        }      });      Log.e("====", "MainActivity  onCreate");    }    @Override    protected void onResume() {      super.onResume();      Log.e("====", "MainActivity  onResume");    }    @Override    protected void onPause() {      super.onPause();      Log.e("====", "MainActivity  onPause");    }    @Override    protected void onStart() {      super.onStart();      Log.e("====", "MainActivity  onStart");    }  }

SecondActivity代码类似,不再贴出来。运行app,输出如下
11-25 16:45:24.043 2829-2829/com.mxn.soul.demo E/====: com.mxn.soul.demo.MainActivity@2300e06conActivityCreated      11-25 16:45:24.179 2829-2829/com.mxn.soul.demo E/====: MainActivity  onCreate      11-25 16:45:24.238 2829-2829/com.mxn.soul.demo E/====: com.mxn.soul.demo.MainActivity@2300e06conActivityStarted      11-25 16:45:24.240 2829-2829/com.mxn.soul.demo E/====: MainActivity  onStart      11-25 16:45:24.242 2829-2829/com.mxn.soul.demo E/====: com.mxn.soul.demo.MainActivity@2300e06conActivityResumed      11-25 16:45:24.242 2829-2829/com.mxn.soul.demo E/====: MainActivity  onResume      11-25 16:45:36.768 2829-2829/com.mxn.soul.demo E/====: com.mxn.soul.demo.MainActivity@2300e06conActivityPaused      11-25 16:45:36.768 2829-2829/com.mxn.soul.demo E/====: MainActivity  onPause      11-25 16:45:36.820 2829-2829/com.mxn.soul.demo E/====: com.mxn.soul.demo.SecondActivity@13adc62aonActivityCreated      11-25 16:45:36.856 2829-2829/com.mxn.soul.demo E/====: SecondActivity  onCreate      11-25 16:45:36.858 2829-2829/com.mxn.soul.demo E/====: com.mxn.soul.demo.SecondActivity@13adc62aonActivityStarted      11-25 16:45:36.858 2829-2829/com.mxn.soul.demo E/====: SecondActivity onStart      11-25 16:45:36.859 2829-2829/com.mxn.soul.demo E/====: com.mxn.soul.demo.SecondActivity@13adc62aonActivityResumed      11-25 16:45:36.859 2829-2829/com.mxn.soul.demo E/====: SecondActivity onResume      11-25 16:45:37.321 2829-2829/com.mxn.soul.demo E/====: com.mxn.soul.demo.MainActivity@2300e06conActivitySaveInstanceState      11-25 16:45:37.321 2829-2829/com.mxn.soul.demo E/====: com.mxn.soul.demo.MainActivity@2300e06conActivityStopped

可以看到ActivityLifecycleCallbacks的回调在activity生命周期方法之前,这是因为我的log信息写在super之后:
@Override      protected void onResume() {          super.onResume();           Log.e("====", "MainActivity  onResume");      }

如果把log写在super之前,那么结果就是相反的了。
@Override      protected void onResume() {          Log.e("====", "MainActivity  onResume");          super.onResume();      }

输出如下:

11-25 17:28:15.652 27469-27469/? E/====: MainActivity  onResume      11-25 17:28:15.653 27469-27469/? E/====: com.mxn.soul.demo.MainActivity@2300e06conActivityResumed

用ActivityLifecycleCallbacks管理Activity堆栈

可以用ActivityLifecycleCallbacks和LinkedList来管理所有的Activity,可以实现完全退出一个应用。

public class BaseApplication extends Application  implements Application.ActivityLifecycleCallbacks {    private LinkedList<ActivityInfo> mExistedActivitys = new LinkedList<>();    private static BaseApplication mInstance;    public static  synchronized BaseApplication getInstance() {      return mInstance;    }    public void onCreate() {      super.onCreate();      registerActivityLifecycleCallbacks(this);       mInstance = this;    }    @Override    public void onActivityCreated(Activity activity, Bundle savedInstanceState) {      if (null != mExistedActivitys && null != activity) {        // 把新的 activity 添加到最前面,和系统的 activity 堆栈保持一致        mExistedActivitys.offerFirst(new ActivityInfo(activity,ActivityInfo.STATE_CREATE));      }    }    @Override    public void onActivityStarted(Activity activity) {    }    @Override    public void onActivityResumed(Activity activity) {    }    @Override    public void onActivityPaused(Activity activity) {    }    @Override    public void onActivityStopped(Activity activity) {    }    @Override    public void onActivitySaveInstanceState(Activity activity, Bundle outState) {    }    @Override    public void onActivityDestroyed(Activity activity) {      if (null != mExistedActivitys && null != activity) {        ActivityInfo info = findActivityInfo(activity);        if (null != info) {          mExistedActivitys.remove(info);        }      }    }    class ActivityInfo {      private final static int STATE_NONE = 0;      private final static int STATE_CREATE = 1;      Activity mActivity;      int mState;      ActivityInfo() {        mActivity = null;        mState = STATE_NONE;      }      ActivityInfo(Activity activity, int state) {        mActivity = activity;        mState = state;      }    }    public void exitAllActivity() {      if (null != mExistedActivitys) {        // 先暂停监听(省得同时在2个地方操作列表)        unregisterActivityLifecycleCallbacks( this );        // 弹出的时候从头开始弹,和系统的 activity 堆栈保持一致        for (ActivityInfo info : mExistedActivitys) {          if (null == info || null == info.mActivity) {            continue;          }          try {            info.mActivity.finish();          } catch (Exception e) {            e.printStackTrace();          }        }        mExistedActivitys.clear();        // 退出完之后再添加监听        registerActivityLifecycleCallbacks( this );      }    }    private ActivityInfo findActivityInfo(Activity activity) {      if (null == activity || null == mExistedActivitys) {        return null;      }      for (ActivityInfo info : mExistedActivitys) {        if (null == info) {          continue;        }        if (activity.equals(info.mActivity)) {          return info;        }      }      return null;    }  }

结束程序时调用:

BaseApplication.getInstance().exitAllActivity() ;

但是如果应用内有多个进程,每创建一个进程就会跑一次Application的onCreate方法,每个进程内存都是独立的, 所以通过这种方式无法实现将应用的Activity放在同一个LinkedList中,不能实现完全退出一个应用。