使用ActivityLifecycleCallbacks管理Activity

转载注明出处:https://blog.csdn.net/xuyonghong1122/article/details/80948944

APP的开发过程中有时候需要自己去管理Activity,本文记录如何使用ActivityLifecycleCallbacks来实现管理Activity的需求。

什么是ActivityLifecycleCallbacks?

ActivityLifecycleCallbacksApplication下的一个接口,位于

public class Application extends ContextWrapper implements ComponentCallbacks2 {
    private ArrayList<ComponentCallbacks> mComponentCallbacks =
            new ArrayList<ComponentCallbacks>();
    private ArrayList<ActivityLifecycleCallbacks> mActivityLifecycleCallbacks =
            new ArrayList<ActivityLifecycleCallbacks>();
    private ArrayList<OnProvideAssistDataListener> mAssistCallbacks = null;

    /** @hide */
    public LoadedApk mLoadedApk;

    public interface ActivityLifecycleCallbacks {
        void onActivityCreated(Activity activity, Bundle savedInstanceState);
        void onActivityStarted(Activity activity);
        void onActivityResumed(Activity activity);
        void onActivityPaused(Activity activity);
        void onActivityStopped(Activity activity);
        void onActivitySaveInstanceState(Activity activity, Bundle outState);
        void onActivityDestroyed(Activity activity);
    }

如何使用ActivityLifecycleCallbacks监听Activity的声明周期?

项目的Application实现ActivityLifecycleCallbacks接口并调用registerActivityLifecycleCallbacks

class App : Application(), Application.ActivityLifecycleCallbacks {
    override fun onCreate() {
        super.onCreate()
        registerActivityLifecycleCallbacks(this)
    }
    override fun onActivityPaused(activity: Activity?) {
        "onActivityPaused".log()
    }

    override fun onActivityResumed(activity: Activity?) {
        "onActivityResumed".log()
    }

    override fun onActivityStarted(activity: Activity?) {
        "onActivityStarted".log()
    }

    override fun onActivityDestroyed(activity: Activity?) {
        "onActivityDestroyed".log()
    }

    override fun onActivitySaveInstanceState(activity: Activity?, outState: Bundle?) {
        "onActivitySaveInstanceState".log()
    }

    override fun onActivityStopped(activity: Activity?) {
        "onActivityStopped".log()
    }

    override fun onActivityCreated(activity: Activity?, savedInstanceState: Bundle?) {
        "onActivityCreated".log()
    }

    private fun String.log() {
        Log.i("qfxl", this)
    }
}

声明项目的Application

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.qfxl.sample">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:name=".App"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

启动Activity
打印log

onActivityCreated
onActivityStarted
onActivityResumed

关闭Activity

onActivityPaused
onActivityStopped
onActivityDestroyed

ActivityLifecycleCallbacks的原理。

Application里的registerActivityLifecycleCallbacks入手。

   public void registerActivityLifecycleCallbacks(ActivityLifecycleCallbacks callback) {
        synchronized (mActivityLifecycleCallbacks) {
            mActivityLifecycleCallbacks.add(callback);
        }
    }

mActivityLifecycleCallbacksArrayList<ActivityLifecycleCallbacks>在调用了registerActivityLifecycleCallbacks之后会往里面添加registerActivityLifecycleCallbacks的实现。

既然是监听Activity的生命周期,那在Activity的各个声明周期方法里肯定有相关代码,这里以ActivityonCreate为例。

protected void onCreate(@Nullable Bundle savedInstanceState) {
        if (DEBUG_LIFECYCLE) Slog.v(TAG, "onCreate " + this + ": " + savedInstanceState);

        if (getApplicationInfo().targetSdkVersion >= O_MR1 && mActivityInfo.isFixedOrientation()) {
            final TypedArray ta = obtainStyledAttributes(com.android.internal.R.styleable.Window);
            final boolean isTranslucentOrFloating = ActivityInfo.isTranslucentOrFloating(ta);
            ta.recycle();

            if (isTranslucentOrFloating) {
                throw new IllegalStateException(
                        "Only fullscreen opaque activities can request orientation");
            }
        }

        if (mLastNonConfigurationInstances != null) {
            mFragments.restoreLoaderNonConfig(mLastNonConfigurationInstances.loaders);
        }
        if (mActivityInfo.parentActivityName != null) {
            if (mActionBar == null) {
                mEnableDefaultActionBarUp = true;
            } else {
                mActionBar.setDefaultDisplayHomeAsUpEnabled(true);
            }
        }
        if (savedInstanceState != null) {
            mAutoFillResetNeeded = savedInstanceState.getBoolean(AUTOFILL_RESET_NEEDED, false);
            mLastAutofillId = savedInstanceState.getInt(LAST_AUTOFILL_ID,
                    View.LAST_APP_AUTOFILL_ID);

            if (mAutoFillResetNeeded) {
                getAutofillManager().onCreate(savedInstanceState);
            }

            Parcelable p = savedInstanceState.getParcelable(FRAGMENTS_TAG);
            mFragments.restoreAllState(p, mLastNonConfigurationInstances != null
                    ? mLastNonConfigurationInstances.fragments : null);
        }
        mFragments.dispatchCreate();
        //这里回调了Application的dispatchActivityCreated
        getApplication().dispatchActivityCreated(this, savedInstanceState);
        if (mVoiceInteractor != null) {
            mVoiceInteractor.attachActivity(this);
        }
        mRestoredFromBundle = savedInstanceState != null;
        mCalled = true;
    }

ActivityonCreate方法中有一句代码

getApplication().dispatchActivityCreated(this, savedInstanceState);

getApplication获取的是当前应用的Application对象,具体的可以查看ActivityThreadperformLaunchActivity,或者在我之前记录的Activity启动流程文章中查看,这里不赘述。

点开ApplicationdispatchActivityCreated

   /* 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);
            }
        }
    }

该方法中会循环调用mActivityLifecycleCallbacks中的所有实现了ActivityLifecycleCallbacksonActivityCreated方法。
至此,原理分析完毕。

如何利用ActivityLifecycleCallbacks来实现Activity的管理。

记录一下我常用的管理方式。

object ActivityPool : Application.ActivityLifecycleCallbacks {

    private val activityStack = Stack<Activity>()

    fun init(app: Application) {
        app.registerActivityLifecycleCallbacks(this)
    }

    override fun onActivityPaused(activity: Activity?) {

    }

    override fun onActivityResumed(activity: Activity?) {

    }

    override fun onActivityStarted(activity: Activity?) {

    }

    override fun onActivitySaveInstanceState(activity: Activity?, outState: Bundle?) {

    }

    override fun onActivityStopped(activity: Activity?) {

    }

    override fun onActivityDestroyed(activity: Activity?) {
        activityStack.remove(activity)
    }

    override fun onActivityCreated(activity: Activity?, savedInstanceState: Bundle?) {
        activityStack.add(activity)
    }

    /**
     * 获取倒数第二个 Activity
     *
     * @return
     */
    fun getPenultimateActivity(currentActivity: Activity): Activity? {
        var activity: Activity? = null
        try {
            if (activityStack.size > 1) {
                activity = activityStack[activityStack.size - 2]

                if (currentActivity == activity) {
                    val index = activityStack.indexOf(currentActivity)
                    if (index > 0) {
                        // 处理内存泄漏或最后一个 Activity 正在 finishing 的情况
                        activity = activityStack[index - 1]
                    } else if (activityStack.size == 2) {
                        // 处理屏幕旋转后 activityStack 中顺序错乱
                        activity = activityStack.lastElement()
                    }
                }
            }
        } catch (e: Exception) {
        }
        return activity
    }

    /**
     * 获取栈底Activity
     */
    fun getLastActivity() = activityStack.lastElement()

    /**
     * 获取栈顶Activity
     */
    fun getCurrentActivity() = if (activityStack.isEmpty()) null else activityStack.firstElement()

    /**
     * 数量
     */
    fun size() = activityStack.size
}
class App : Application() {
    override fun onCreate() {
        super.onCreate()
        //管理Activity
        ActivityPool.init(this)
    }
}

关于ActivityLifecycleCallbacks的记录完毕。

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值