分享

Activitylifecyclecallbacks使用

 scxingm 2015-11-27

当前浏览器不支持播放音乐或语音,请在微信或其他浏览器中播放 Stay Here Forever Jewel - Sweet and Wild (Deluxe Edition)

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条评论

    发表

    请遵守用户 评论公约

    类似文章 更多