Android源码解析系列1——Activity启动和界面加载,2021年五面蚂蚁

r.mPendingRemoveWindow = null;
r.mPendingRemoveWindowManager = null;
}
appContext.setOuterContext(activity);
activity.attach(appContext, this, getInstrumentation(), r.token,
r.ident, app, r.intent, r.activityInfo, title, r.parent,
r.embeddedID, r.lastNonConfigurationInstances, config,
r.referrer, r.voiceInteractor, window, r.configCallback);
// 省略部分代码

if (r.isPersistable()) {
mInstrumentation.callActivityOnCreate(activity, r.state, r.persistentState);
} else {
mInstrumentation.callActivityOnCreate(activity, r.state);
}
// 省略部分代码

if (!r.activity.mFinished) {
activity.performStart();
r.stopped = false;
}
if (!r.activity.mFinished) {
activity.mCalled = false;
if (r.isPersistable()) {
mInstrumentation.callActivityOnPostCreate(activity, r.state,
r.persistentState);
} else {
mInstrumentation.callActivityOnPostCreate(activity, r.state);
}
// 省略部分代码
}
}
r.paused = true;

// 保存ActivityClientRecord
mActivities.put(r.token, r);

} catch { /* 省略catch相关代码 */ }

return activity;
}

上述代码主要执行了以下操作:

  1. 创建Activity对象

调用InstrumentationnewActivity方法,通过反射创建Activity对象。

  1. 初始化Activity

调用Activity对象的attach方法,用于初始化Activity的一些数据,同时会为Activity设置Window对象。 注意:Activity的Window对象,与传入的Window对象不是同一个对象。这也意味着:每个Activity都有各自的Window对象

public class Activity extends … {
// 省略部分代码
private Window mWindow;
private WindowManager mWindowManager;

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, String referrer, IVoiceInteractor voiceInteractor,
Window window, ActivityConfigCallback activityConfigCallback) {
attachBaseContext(context);

mFragments.attachHost(null /parent/);

mWindow = new PhoneWindow(this, window, activityConfigCallback);
// 省略部分代码

mWindow.setWindowManager(
(WindowManager)context.getSystemService(Context.WINDOW_SERVICE),
mToken, mComponent.flattenToString(),
(info.flags & ActivityInfo.FLAG_HARDWARE_ACCELERATED) != 0);
// 省略部分代码

mWindowManager = mWindow.getWindowManager();
// 省略部分代码
}
// 省略部分代码
}

  1. 调用3个生命周期方法

1、Instrumentation.callActivityOnCreate方法,该方法中会调用activity.performCreate()方法。
2、activity.performStart()方法。
3、Instrumentation.callActivityOnPostCreate方法,该方法中会调用activity.onPostCreate()方法。

查看里面的源码,确实依次调用了onCreateonStartonPostCreate方法,验证了我们之前对performLaunchActivity的猜想。

总结一下

handleLaunchActivity方法里,会回调以下生命周期:

onCreate() -> onStart() -> onPostCreate() -> onResume()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android 12 平板修改了 user_rotation 参数时,会导致屏幕旋转方向的改变,但是应用程序的界面可能还停留在旋转之前的方向,这会导致应用程序界面的显示不正确。为了解决这个问题,你可以在应用程序中监听系统的旋转事件,并相应地调整应用程序界面的显示方向。 具体来说,你可以使用以下代码来监听系统的旋转事件: ```java public class MyActivity extends Activity { private RotationEventListener mRotationEventListener; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mRotationEventListener = new RotationEventListener(this); mRotationEventListener.enable(); } @Override protected void onDestroy() { super.onDestroy(); mRotationEventListener.disable(); } private class RotationEventListener extends OrientationEventListener { private int mLastRotation = -1; public RotationEventListener(Context context) { super(context); } @Override public void onOrientationChanged(int orientation) { int rotation = getWindowManager().getDefaultDisplay().getRotation(); if (mLastRotation != rotation) { mLastRotation = rotation; adjustLayout(); } } } private void adjustLayout() { int rotation = getWindowManager().getDefaultDisplay().getRotation(); switch (rotation) { case Surface.ROTATION_0: setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); break; case Surface.ROTATION_90: setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); break; case Surface.ROTATION_180: setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT); break; case Surface.ROTATION_270: setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE); break; } } } ``` 这段代码中,我们首先创建一个 RotationEventListener,用于监听系统的旋转事件。当系统的旋转方向发生变化时,我们调用 adjustLayout 方法,根据当前的旋转方向来调整应用程序界面的显示方向。 在 adjustLayout 方法中,我们首先获取当前的旋转方向,然后根据旋转方向来设置应用程序的显示方向。例如,当旋转方向为 0 时,我们将应用程序的显示方向设置为竖屏模式,当旋转方向为 90 时,我们将应用程序的显示方向设置为横屏模式,以此类推。 通过这种方式,我们就能够在 Android 12 平板修改 user_rotation 参数时,相应地调整应用程序界面的显示方向,以确保应用程序的界面能够正确地显示。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值