基础五:不在Application类里面如何对全部activity生命周期监听

直接上代码,解决的问题就是不在Application的onCreate里面注册Application.ActivityLifecycleCallbacks,如何做到监听全部的Activity生命周期变化,以及原理解析


主Application类,可以发现没做任何处理

public class MyApplication extends Application {
	
	@Override
	public void onCreate() {
        // TODO Auto-generated method stub
        super.onCreate();
        Log.d("hwj", "**MyApplication onCreate**");
    }
}

新建生命周期监听类

package com.hwj.util;

import android.app.Activity;
import android.app.Application;
import android.os.Bundle;
import android.util.Log;


public class AppDataGetUtil implements Application.ActivityLifecycleCallbacks{


    @Override
    public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
        Log.d("hwj","**AppDataGetUtil onActivityCreated**" + activity.getClass().getSimpleName() + "**" + activity.getIntent().toString());
    }

    @Override
    public void onActivityStarted(Activity activity) {
        Log.d("hwj","**AppDataGetUtil onActivityStarted**" + activity.getClass().getSimpleName());
    }

    @Override
    public void onActivityResumed(Activity activity) {
        Log.d("hwj","**AppDataGetUtil onActivityResumed**" + activity.getClass().getSimpleName());
    }

    @Override
    public void onActivityPaused(Activity activity) {
        Log.d("hwj","**AppDataGetUtil onActivityPaused**" + activity.getClass().getSimpleName());
    }

    @Override
    public void onActivityStopped(Activity activity) {
        Log.d("hwj","**AppDataGetUtil onActivityStopped**" + activity.getClass().getSimpleName());
    }

    @Override
    public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
        Log.d("hwj","**onActivitySaveInstanceState**" + activity.getClass().getSimpleName());
    }

    @Override
    public void onActivityDestroyed(Activity activity) {
        Log.d("hwj","**AppDataGetUtil onActivityDestroyed**" + activity.getClass().getSimpleName());
    }

    public void registerLifeCallBack(Application application){
        application.registerActivityLifecycleCallbacks(this);
    }
}

项目主启动Activity,在其onCreate方法中调用AppDataGetUtil 的registerLifeCallBack方法,完成对全部Activity的注册

public class HwjMainActivity extends Activity{

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_hwj_main_layout);
		Application application = this.getApplication();
        AppDataGetUtil util = new AppDataGetUtil();
        util.registerLifeCallBack(application);
    }
}

代码很简单,只不过是改变原有的认知,只能在Application类注册才能监听activity的生命周期变化的误区;


下面说下原理:以如何监听Activity的onCreate生命周期为例,先看下Activity的onCreate方法

    protected void onCreate(@Nullable Bundle savedInstanceState) {
        /**省略代码**/
        getApplication().dispatchActivityCreated(this, savedInstanceState);       
        /**省略代码**/
    }

在我们调用Activity的onCreate方法的时候,就会调用Application的dispatchActivityCreated方法来完成回调


疑问1:这里的getApplication()返回Applcaition是不是全局唯一,即是不是每次都new 一个Application?如果不是全局唯一,岂不是所有地方都要注册这个监听?

    /**Activity.java**/
    public final Application getApplication() {
        return mApplication;
    }

接着看下mApplication的赋值的地方

/**Activity.java**/
    final void attach(Context context, ActivityThread aThread,
            Instrumentation instr, IBinder token, int ident,
            Application application, Intent intent, ActivityInfo info,
            CharSequence title, Activity parent, String id,
            NonConfigurationInstances lastNonConfigurationInstances,
            Configuration config, IVoiceInteractor voiceInteractor) {
        /*省略代码*/
        mApplication = application;
       /*省略代码*/
    }

mApplication的赋值是在Activity的attach方法中,而attach的方法是在ActivityThread.java的performLaunchActivity方法中被调用的,至于为什么是performLaunchActivity,请参考Activity启动过程

    private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) {
        
    /*省略代码*/
        try {
            Application app = r.packageInfo.makeApplication(false, mInstrumentation);
            /*省略代码*/
            activity.attach(appContext, this, getInstrumentation(), r.token,
                    r.ident, app, r.intent, r.activityInfo, title, r.parent,
                    r.embeddedID, r.lastNonConfigurationInstances, config,
                    r.voiceInteractor);
        }
    /*省略代码*/
    }

在performLaunchActivity方法中,调用的attach方法的参数app是由makeApplication方法得到的

    public Application makeApplication(boolean forceDefaultAppClass,
            Instrumentation instrumentation) {
        if (mApplication != null) {
            return mApplication;
        }

        Application app = null;

        String appClass = mApplicationInfo.className;
        if (forceDefaultAppClass || (appClass == null)) {
            appClass = "android.app.Application";
        }

        try {
            java.lang.ClassLoader cl = getClassLoader();
            if (!mPackageName.equals("android")) {
                initializeJavaContextClassLoader();
            }
            ContextImpl appContext = ContextImpl.createAppContext(mActivityThread, this);
            app = mActivityThread.mInstrumentation.newApplication(
                    cl, appClass, appContext);
            appContext.setOuterContext(app);
        } catch (Exception e) {
            if (!mActivityThread.mInstrumentation.onException(app, e)) {
                throw new RuntimeException(
                    "Unable to instantiate application " + appClass
                    + ": " + e.toString(), e);
            }
        }
        mActivityThread.mAllApplications.add(app);
        mApplication = app;
        /*省略代码*/
        return app;
    }

这个方法的主要作用有两个
1:如果有全局Application变量,则返回此变量;因此我们可以回答疑问1了,即Activity.java调用的getApplication()返回Applcaition是全局唯一的,我们不需要在每次都注册监听
2:第一次启动的时候,mApplication为空,就通过mActivityThread.mInstrumentation.newApplication方法完成mApplication对象的创建,我们查看newApplication方法可知

    static public Application newApplication(Class<?> clazz, Context context)
            throws InstantiationException, IllegalAccessException, 
            ClassNotFoundException {
        Application app = (Application)clazz.newInstance();
        app.attach(context);
        return app;
    }

Application 对象的创建是通过反射机制的newInstance来实现的


接着我们看Appliation.java的dispatchActivityCreated方法

    /* package */ void dispatchActivityCreated(Activity activity, Bundle savedInstanceState) {
        Object[] callbacks = collectActivityLifecycleCallbacks();
        if (callbacks != null) {
            for (int i=0; i<callbacks.length; i++) {
                ((ActivityLifecycleCallbacks)callbacks[i]).onActivityCreated(activity,
                        savedInstanceState);
            }
        }
    }

可以看出这是一个protect的方法,主要功能就是回调onActivityCreated方法


总结下:
1:注册ActivityLifecycleCallbacks接口,这个动作主要就是在mActivityLifecycleCallbacks这个list里面添加mActivityLifecycleCallbacks接口实例
2:Activity在调用onCreate方法的时候,调用Application的dispatchActivityCreated方法
3:dispatchActivityCreated方法回调onActivityCreated方法,因此所有的Activity的onCreate生命周期便会检测到

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值