接上篇: Activity的建议流程(一):ActivityManagerService部分

上一篇咱们分析了activity在AndroidManagerService部分的发源码编辑器编程猫下载起流程,这一篇咱们再来看一下activity在运用进程部分的建议流程。学缓存视频习activity在运用进程部分的建议流程对于咱们深化了解android运用的作业原理,特别是学习一些插件化方面的知识是很有协助的,缓存视频怎样转入本地视频因为上一篇中介绍的建议流程大部分坐落AMS中,AMS是一个体系服务进程,咱们无法对其进行修改,android手机而本篇介绍的建议流程则坐落运用进程中,咱们能够运用反射等技术手段对源码本钱其进行修改,某些插android下载装置件化技术的中心原理便是经过对这部分的代码进行hook,以到达替换要建议的activity的目的。

1.分发建议新activitandroid11y的作业

在上一篇的结尾处咱们能够看到,AMS终究调用了ActivityThread的scheduleLaunchActivity办法,activity的建议流程从AMS进程进入到了运用进程:

            app.thread.scheduleLaunchActivity(new Intent(r.in源码之家tent), r.appT源码网站oken,
System.identityHashCode(r缓存视频兼并), r.info,
mergedandroid下载软件appConfiguration.getGlobalConfiguration(),
mergedConfiguration.getOverrideConfigura源码之家tion(), r.compat,
r.launchedFromPackage, task.voiceInteractor, app.repProcState, r.icicle,
r.persistentState, resultJavas, newIntents, !andResume,
mService.isNextTransitionForward(), profilerInfo);

咱们来看一下Actjava怎样读ivityThread中的scheduleLaunchActivity办法:

源码途径:frameworksbas缓存兼并东西m3u8ecorejavaandroidappActivityThread.java
@Override
public fina缓存的视频怎样保存到本地l void scheduleLaunchActivity(Intent intent, IBinder token, int ident,
ActivityInfo info, Configuration curConfig, Configuration overrideConfig,
CompatibilityInfo compatInfo, String referrer, IVoiceInteractor voiceInteractor,
int procState, Bundle state, PersistableBundle persistentState,
List<ResultInfo> pendingResults,android/yunos Listandroid体系<ReferrerIntent> pendingNewInappstoretents,
boolean notResumed, boolean isFandroid11orward, ProfilerInfo profilerInfo)缓存和下载的差异 {
updateProcessState(procState, false);
ActivityClientRecord r缓存视频在手机哪里找 = new ActivityClientRecord();
r.token = token;
r.ident = ident;
r.intent = intent;
r.referrjava初学er = referrer;
r.voiceInteractor = voiceInteractor;
r.activityIapp装置下载nfo = info;
r.compatInfo = compatInfo;
r.state = s源码之家tate;
r.persistentState = persisten源码本钱tState;
r.pendandroid11ingResults = pendingResuapproachlts;
r.pendingIntents = pendingNewIntents;
r.startsNotResumed = noapplicationtResumed;
r.isFor缓存兼并东西m3u8ward = isForward;
r.profilerInfo = profilerInfo;
r.oandroid是什么手机牌子verappointmentrideConfig = overrideConfig;
updatePendingConfigandroid/yunosuration(curConf源码年代ig)缓存和下载的差异;
sendMessage(H.LAUNCH_ACTIVITY, r);
}

在scheduleLaunchActivity办法中,将接收到的参数都封装到了一个ActivityClientRecord政策中。从名字就能够看出,ActivityClientRecord是activity在客户端的一个记载,首要封装了activity的一些相关信息。

在scheduleLaunchActivity办法的终究调用了sendMessage办法发送了一个音讯,咱们来看一下sendMessage办法:

    privappointmentate void sendMessage(int wha源码t, Object obj) {
sandroid下载装置endMessage(what, obj, 0, 0, false);
}
private void sendMandroid/yunosessage(int what, Object obj, int arg1, int arg2, bjava模拟器oolean async) {
if (DEBUG_MESSAGES) Slog.v(
TAG, "SCHEDULE " + what + " " + mH.codeToString(wha缓存t)
+ ": " + arg1 + " / " + obj);
Message msg = Message.obtain();
msg.what = what;
msg.ob缓存视频怎样转入本地视频j = obj;
msg.arg1 = arg1;
msg.arg2 = arg2;
if (async) {
msg.setAsynchronous(true);
}
mH.sendMessa源码本钱ge(msg);
}缓存视频兼并软件

能够看到sendMesjava面试题sage办法便是构建了一个Message政策,并经过mH这个政策进行了发送。很明显m缓存视频兼并H是一个Handler政策,这儿是运用的Android的音讯机制来进行音讯分发。mH是一个类名为H的实例,而H则继承自Handler。mH首要用来处理主线程中的一些作业。运用音讯机制来进行activity的建议能够保证Activity的建议是在主线程中进行的。该音讯终究会被mH的handleMessage办法进行处理,源码如下:

    priappointmentvatejavahdxx class H exte源码年代nd缓存视频兼并软件s Handler {
public void handleMessage(Message msg) {
if (缓存整理DEBUG_MESSAGES) Slog.v(TAG, ">>> hanappleiddling: " + codeToString(msg.what));
switch (msg.what) {
case LAUNCH_A源码网站CTIVITY: {
Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "activityStart");
final ActivityClientRecord r = (ActivityClientRecord) msg.obj;
r.packageI源码超市nfo = getPackageInfapp装置下载oNoCheck(
r.activityInjava初学fo.applicationInfo, r.compatInfo);
handleLaunchActivity(r, null, "LAUNCH_ACTIVITY");
Trace.traceEnd(Trace.T缓存视频怎样转入相册RACE_TAG_ACTIVITY_MANAGER);
} break;
...
}
...
}
}

在handjava模拟器leMessage办法中,javanal首要调用了getPa缓存整理ckageInfoNoCheck,并将返回值赋值给了r的packageInfo源码超市变量。getPackageInfoNoCheck返回的是一个LoadedApk政策,该政策首要封装了一些APK相关的信息。之后体系又调用了handleLaunchActivity办法来进一步进行activity的建议。

先来看一下getPackageInfoNoCheck办法的代码:

    private LoadedApk getPackageInfo(ApplicationInfo aInfo,android11 CompatibilityInfo compatInfo,
ClassLoader baseLoader, boolean securityViolation, boolean includeCode,
boolean registerPackage) {
final bo缓存视频怎样转入相册olean diappearfferentUser = (Uandroid是什么手机牌子serHandle.myUserId() != UserHaandroid下载装置ndle.getjava模拟器UserId(aInfo缓存视频.javascriptuid));
synchronized (mResourcesManager) {
WeakReference<Lo源码怎样做成app软件adedApk> ref;
if (differentUser) {
ref = nandroid平板电脑价格ull;
} else if (includeCode) {
// 注释1:检查是否有缓存
refjava游戏 = mPackages.get(aInfo.packageName);
} elsandroid什么意思e {
ref = mResourceP源码编辑器编程猫下载ackages.get(aInfo.packageName);
}
LoadedApk pack源码怎样做成app软件ageInfo = ref != null ? ref.get() : null;
if (packageInfo == null || (packageInfo.mResources != null
&&appstoreamp; !packageInfoandroid手机.mjava初学Resources.getAssets().isUpToDate())) {
.android下载..
//注释2:假设没有缓存,则创立新LoadedApk方appstore
packageInfo =
nandroid平板电脑价格ew LoadedApk(this, aInfo, compatInfo, baseLoader,
secur缓存的视频怎样保存到本地ityViolation, includeCode &&
(aInfo.flags&ApplicappleationInfo.FLAG_HAS_CODE)源码交易网站源码 != 0, registerPackage);
...
if (differentUser) {
// Caching not supported across users
} else if (includeCode) {
// 注释3:将源码本钱LoadedApk政策放入缓存
mPackages.put(aIjava难学吗nfo.packageName,
new WeakReference<LoadedApk>(packageInfo));
} else {
mResou源码怎样做成app软件rcePacandroid什么意思kages.put(aInfo.packageName,
new WeakRefe缓存视频兼并软件rence<LoadedApk>(packageInfo));
}
}
return packageInfo源码本钱;
}
}

首要,在注释1处,先检验从mPackages政策中获取这个LoadedApk政策,假设java模拟器获取不到的话,则会在注释2处创立一个新的LoadedApk政策,并在java模拟器注释3处将这个LoadedApk加入到mPackages中。

咱们再来看一下handleLaunchActivity办法的代码:

    private void handleLaunchActivity(ActivityClientRecord r,android下载装置 Intent customIntent, String reason) {
// 注释1:初始化WindowManager,经过Binder获取WindowServiceManager的本地署理
WindowManagerGlobal.initialize();
// 注释2缓存视频在手机哪里找:创立Activity
Activity a = performLaunchActivity(r, customIntent);
if (a != null) {
r.createdConfig = new Configuration(mConfiguration);
reportSiz缓存eConfigurappearations(r);
Bundle oldState = r.state;
// 注释3
handleResumeActivity(randroid平板电脑价格.token, false, r.isForward,
!r.activity.mFinished && !r.startsNotResum缓存视频怎样转入本地视频ed, r.lastProcessedSeq, reason);
...
}
...
}

在注释1处,经过调用 WindowManagerGlobal.源码编辑器编程猫下载initialize()来对WindowManager进行了初始化,WindowManger是WindowManappointmentagerServicandroid是什么手机牌子e在客户端的一个署理政策,而WindowManagerService与ActivityManagerService类似,也是一个体系服务,首缓存视频兼并要用android手机来对窗口的闪现进行控制。客户端经过WindowManger政策,运用Binder机制来与WindowManagerService进行通讯。

在注释2处经过per缓存formLaunchActivity来创立了Activ源码网站ity的实例,至此咱们要建议的Ajava模拟器ctivity实例总算被创立出来了。

在注释3处则调用了hanandroid下载软件appdleResumeActivity办法使activity进入resume状况。

下面咱们来看一下performLaunchActivity和handleResumandroid什么意思eActivity详细对activity做了哪些初始化作业。

2.activity的初始化

performLaunchActivity办法的源码如下:

    private Activandroid什么意思ity performLaunchActivity(ActivityCl缓存兼并东西m3u8ientRecord r, Intent customIntent) {
...
ComponentName component = r.intentandroid体系.getComponent();
...
// 注释1:为activity创立context
ContextImpl appContext = createBaseContextFo缓存整理rActivity(r);
Activity act缓存视频兼并软件ivapplicationit缓存视频在手机哪里找y = null;
try {
java.lang.ClassLoader cl = appCojavahdxxntext.getClassLoader();
// 注释2:创立activity实例
activity = mInstrumentation.newActivity(
cl, com缓存视频ponent.getClassName(), r.intent);
...
} ...
try {
...
if (activity != null) {缓存的视频怎样保存到本地
...
apAndroidpContext.setOuterConandroid是什么手机牌子text(a源码编辑器ctivity);
/源码怎样做成app软件/ 注释3
activity.attach(appContext, this, getInst缓存视频在手机哪里找rumentation(), r.token,
r.ident, app源码超市, r.Androidintent, r.activityInfo, title, r.parent,
r.embeddedID, r.lastNonC缓存兼并东西m3u8onfigurationInstances缓存的视频怎样保存到本地, config,android下载装置
r.referrer, r.voiceInteractor, window, r.configCallback);
...
checkAndBlockForNetworkAccess();
activity.mStartedActivity = false;
// 设置主题
int theme = r.activityInfo.getThemeResource();
if (theme != 0) {
activity.setandroid手机Theme(theme);
}
activity.mCalledandroid手机 = false;
/源码之家/ 注释4:调用activijavahdxxty的OnCreate办法
ifAndroid (r.isPersistable()) {
mInstrumentajava游戏tion.callActivityOnCreate(activity, r.java模拟器state, r.persistentState);
} else {
mInstrumentation.calAndroidlActappleivityOnCapplereate(activity, r.state);
}
if (!activity.mCalled) {
throw new SuperNotCalledException(
"Activity " + r.intent.getComponent().toShortString() +
" did not call through tandroid下载o super.onCr源码本钱eate()");
}
r.activity = activity;
r.stoppedandroid11 = trueapproach;
if (!r.activity.mandroid是什么手机牌子Finished) {
//注释5:进入start状况
activity.performStart();
r.stopped = false;
}
...缓存视频怎样转入本地视频
}
r.paused = true;
mActivities.put(r.token, r);
} ...
return activity;
}

在注释1处,体系首要为activity创立源码超市了cont源码编辑器ext政策,并经过这个capplicationontext政策获取了一个ClassLoader,用于加载要发缓存视频起的activity。

在注释2处,经过调用mInstrumappreciateentati源码编辑器编程猫下载on的newActivity办法创立了activity的实例。

android是什么手机牌子注释3处调用了activity的attach办法来对activity进行一些初始化作业。

在注释4处调用了mInstrumentation的callAct源码ivityOnCreate办法,从这个办法的名字就能够看出,该办法内部调用了activity的onCreateandroid/yunos办法。

在注释5处调用了activity的performStart()办法,使activity进入start状况。

咱们首要来看mInstrumentat缓存的视频怎样保存到本地ion的newActivity办法:

源码途径:frameworksbasecorejavaandroidappInstrumentation缓存的视频怎样保存到本地.java
public Activity newActijava初学vitjava模拟器y(ClassLoader cl, String className,
Intent intent)
throws InstantiationException, IllegalAcandroid手机cessExceandroid/yunosption,
ClassNotFoundException {
return (Activity)cl.loadClass(className).newInstance();
}

newActivity办法只要一行代码,便是经过反射加载了要建议的actjavahdxxivity类并创立了一个实例政策。

咱们再来看一下activity的attajavahdxxch办法做了哪些初始化作业:

源码途径:frameworksbasecorejavaandroidappActivity.java
final void attach(Context context, ActivityThread aThreaAPPd,
Instrumentation instr, IBinder token, int ident,
Application application, Intent intent, ActivityInfo inapplefo,
CharSequence t缓存兼并东西m3u8itle, Activity parent, String id,
NonConfigurationInstances lastNonConfigurationInstances,
Configuration config, String referrer, IVoic源码超市eInteractor vo缓存和下载的差异iceInteractor,
Wappointmentindow window, ActivityConfigCallback act缓存视频在手机哪里找ivityConfigCallback) {
attachBaseContext(context);
mFragJavaments.attachHost(null /*parent*/);
// 注释1:为activity创立window缓存的视频怎样保存到本地政策
mWindow = njavahdxxew PhoneWandroid下载装置indow(this, window, activityConfigCallback);
mWindow.seappearancetWindowappleidControllerCallba缓存视频ck(thi缓存视频在手机哪里找s);
mWindow.setCallback(this);
mWindow.se缓存的视频怎样保存到本地tOnWindowDismissedCallback(thi源码s);
mWindow.getLaAPPyoutInflater().setPrivateFactory(this);
//设javanal置软键盘状况形式
if (info.softInputMode !android是什么手机牌子= WindowManager.LayoutParams.SOFT_IAPPNPUT_STATE_UNSPECIFIED) {
mWindow.setSoftInputMode(info源码共享网.softInputMode);
}
if (info.uiOptions != 0) {
mWindow.setUiOp缓存视频兼并tions(info.uiOptio缓存ns);
}java初学
// 注释2:初始化一些成员变量
mUiThread = Thread.currejava面试题ntThreadandroid11();缓存视频怎样转入相册
mMainThread = aThread;
mInstrumentation = instr;
mToken = token;
mIdent = ident;
mApplication = application;
mIntent = intent;
mRe缓存兼并东西m3u8ferrer = referrer;
mComponent = intent.getComponent();
mActivityInfo = info;
mTitle = title;
mParent = parent;
mEmbeddandroid什么意思edID = id;
mLastNonConfiapp装置下载gurationInstances = lastNonConfigurationInstances;
if (voiceInteractor != null) {
if (lastNonConfigurationInstances != null) {
mjavascriptVoiceInteractor = lastNonConfigurationIn缓存视频怎样转入本地视频stances.voiceInteractor;
} else {
mVoiceInteractor = new VoiceInterac缓存视频兼并tor(voiceInteractor, this, this,
Loappearoper.myLooper());
}
}
// 注释3:为window设置windowManager
mWindow.setWindowManager(
(WindowManager)context.getSystemService(Context.WINDOW_SERVICE),
mToken, mComponent.fl缓存视频在手机哪里找attenToString(),
(info.flags & ActivityInfo.FLAG_HARDWARE_ACCELERATED) != 0);
if (mParent != null) {
mWindow.setContainer(mParent.getWindow());
}
mWindowManager = mWindow.getWindowManager();
mCurrentConfig = con缓存和下载的差异fig;
mWindow.setColorMode(info.colorMode);
}

在注释1处为该activity创立了一个window政策,能够看到这个window政策其实是一个PhoneWindow政策。在Android体系中,每个Acti缓存整理vity都对应一个window政策,window首要和activity的窗口闪现有关。

在注释2处android下载装置为该activity初始化了一些成员变量,如主线程、ui线程、application政策等。appointment

在注释3处为window设置了WJavaindowManager政策。

看完了activity的aappointmentttach办法,咱们再来看Instrumentatio缓存视频兼并软件n的callActivityOnCreate办法:

源码途径:frameworksbasecorejavaandroidappInstrumentation.java
public void callActivi源码编辑器编程猫下载tyOnCreate(Activity activity, Bundle icicle,
PersistableBundle pappearanceersistentState) {
prePerformCreate(acAPPtiviandroid下载ty);
activity.performCreate(icicjavanalle, persistentState);
postPerformCreate(activity);
}

能够看到在javascriptcallActivityOnCreate办法中又调用了activity.performCreate来进一步初始化activity。performCreate办法的源码如下:

源码途径:frameworksbasecorejavaandroidappActivity源码编辑器编程猫下载.java
final void performappreciateCreate(Bundle icicle, PersistableBundle persistentState) {
restoreHasCurrentPermissionRequestandroid下载装置(icicle);
// 注释1:调用onCreate
onCreate(icicle, persistentState);
mActivityTransitionState.readState(icicle);
// 注释2
performCreateCommon();
}

在注释1处appreciate直接调用了onCreate办法源码网站,咱们通常会重写activity的onCreate办法来缓存的视频怎样保存到本地进行一些自定义的初始化作业。在注释2处又调用了performCreateCommon办法,咱们来看一下该办法的源码:

    final void pjava模拟器erformCreateCommon() {
mVisibleFromClient = !mWindow.getWindowStyle().getBoolean(
co缓存视频兼并软件m.androi缓存视频d.internal.R源码年代.styleable.Window_windowNoDisplay, false);
mFragmejavanalnts.dijava模拟器spatchappstoreActivityCreated();
mActivityT缓存视频怎样转入本地视频ransitionState.setEnterActivityOptions(this, getActivityOptions());
}

能够看到在performCreateCommon办法中调用了mFragments的dispatchActivityCreated办法,该办法内缓存的视频怎样保存到本地部会告javanal知activity内的相关fragment,并触发这些fragment的onActivityCreated办法。


回到ActivityThread的handleLaunchActivity办法中。在分析完performLaunchActivity方源码法后,咱们再来看一下handleResumeActivity办法做了哪些作业。handleResumeActivity办法代码如下:

源码途径:frame源码编辑器编程猫下载worksbasecorejavaandroidappActivityThread.java
final void handleResumeA源码交易网站源码ctivity(IBinder token,
boolean clearHide, booleaandroid平板电脑价格n isForward, boolean reallyResume, int seq, String reason) {
Activit源码之家yClientRecord缓存视频兼并 r = mActivities.get(token)java难学吗;
...javahdxx
// 注释1
r = performResumeActivity(token, c缓存视频在手机哪里找lear缓存视频在手机哪里找Hide, reason);
if (r != n缓存ull) {
final Activity a = r.a缓存整理ctivity;
...
if (r.winAndroiddow == null && !a.mFi缓存视频怎样转入本地视频nished && willBeVisible) {
r.window = r.activity.getWindow();
View decappstoreor = r.window.getDecorView();
decor.setVisibility(View.INVISIBLE);
ViewManager wm = a.getWindowManager();
WindowManager.Layojava是什么意思utParams l = r.window.getAttributes();
a.mD源码编辑器编程猫下载ecor = decor;
l.type源码 = WindowManager.LayoutParams.TYPE_BASE_APPLICATION;
l.softInputMode |= forwardBit;
...
} else if (!willBeVisible) ...
cleanUpPendingRemoveWindojavahdxxws(r缓存, false /* force */);
if (!r.activity.mFinishedjava初学 && willBeVisible
&& r.activiappointmentty.mDecor != null && !r.hideForNow) {
...
WindowManager.LayoutParams l = r.window.getAttributes();
...
}
...
// 通activity manager该activity现已处于resumed状况
if (reallyResume) {
try {
ActivityManager.g源码共享网etService().activityResumed(tokenandroid体系);
} catch (缓存RemoteException ex) {
throw ex.rethrowFromSystemServ源码网站er();
}
}
} else {
...
}
}

handleResumeActivity办法的代码很长,可是咱们不必纠结于代码细节。在注释1处调用了performResumeActivity,后面的代码都是一些与window、decorView、windowManager相关的操作,不难猜出是与activity的闪现有关,咱们在这儿就不深化分析了。咱们首要来看一下performResumeActivity办法:

    public final ActivityC缓存兼并东西m3u8lientRecord performResumeActivity(IBinder token,
booleanandroid下载 clearHide, String reason) {
ActivityClientRecord r = mActivities.get(token);
if (localLOGV) Slog.v(TAG, "Performi源码怎样做成app软件ng resume of " + r
+ " finished=" + r.activity.mFinished);
if (r != null && !r.activity.m源码年代Finished) {
...
try {
...
r.android什么意思activity.performResume();
...
} ...
}
return r;
}

performResappleidumeActivity办法首要是调用了activity的performResume办法:

    final void perfo缓存视频在手机哪里找rmResume() {
...android是什么手机牌子
//调用activity的onResume办法
mIns源码网站trumentation.callActivityOnResume(this);
...
//告知fragment进入Resume状况
mFragments.dispatchRappleidesume();
mFragments.execPendingActions();
...
}

首要,体系调用了mInstrumentation的callActivityOnResume,在callActivityOnResume办法内部会直接调用activity的onResume办法,这点与之前调用onCreate办法比java游戏较类似,这儿就不再进一步分析了。appreciate这样,activity就进javascript入生命周期的Resume阶段了。

总结

咱们对这部分的activity建议流程进行android平板电脑价格一下总结:

  1. AMjavascriptS调用ActivityThread的scheduleLaunchActiandroid下载vity办法,建议流程从AMS进入运用进程
  2. ActivityThread经过音讯机制分发建议act缓存视频兼并软件ivity的作业,保证activity的建议处于主线程中。
  3. 经过反射创立activ源码iy实例,并对该实例进行一些初始化作业
  4. 该activiJavaty开端了它android是什么手机牌子的生命周期,分别调用了onCrappointmenteate、onStart、onResume办法,终究闪现在屏幕上。

至此activijava面试题ty的创立流程就分析完了,自缓存视频怎样转入本地视频己水平有限,假设有哪里写的欠好还望各位大佬多多指点。关于建议流程中运用进程的创立部分并没有在这儿进行介绍,因为这部分内容比较多,之后会独自写一篇文章介绍运用进程的创立流程。