Activitylifecyclecallbacks使用

来源:互联网 发布:爱知科技车间照片 编辑:程序博客网 时间:2024/04/30 01:34

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中,不能实现完全退出一个应用。

0 0
原创粉丝点击