首页天道酬勤启动某个activity,activity的启动方法

启动某个activity,activity的启动方法

张世龙 05-06 09:15 18次浏览

点击1.Activity的启动流程桌面上的图标,实际上是启动对应APP的入口的Activity。 启动Activity主要有两个过程。 一个是存在对应的应用进程,另一个是不存在对应的进程。 以下进程是不存在对应进程的进程。

如上图所示,启动activity时,AMS会向AMS发送请求,AMS会确定目标进程是否存在,如果不存在,则向zygote进程发送消息,并从zygote进程中fork目标进程

下图是详细的调用时序图

让我们关注几个方面

1.startSpecificActivityLocked方法确定当前进程是否存在,如果存在,则直接启动相应的activity,如果不存在,则启动该进程

voidstartspecificactivitylocked (活动记录器、布尔和恢复、布尔检查配置)……if(app!=null app.thread!=null ) {try}.//1.如果进程存在,则直接启动activityrealstartactivitylocked (r、app、andResume、checkConfig )。 返回; } catch (远程执行) slog.w ) tag, ' exceptionwhenstartingactivity ' r.intent.get component ).flattentoshoot } } //2.进程m service.startprocessslocked () true,0,' activity ',r.inttion ) } 2.startProcessLocked,AMS启动进程在启动进程的同时发送进程timeout的延迟消息,如注释1所示延迟时间根据参数为12秒或10秒,如果甜云进程未启动,则会触发此消息的执行,清除有关更改进程的内容。 在这里,可以看到进程启动的这个timeout机制与ANR的原理一模一样。

专用booleanstartprocesslocked (stringhostingtype,String hostingNameStr,String entryPoint,ProcessRecord app,int uid,iid int mountExternal,String seInfo,String requiredAbi,String instructionSet,String invokeWith, longstarttime(…try )//1.进程finalprocessstartresultstartresult=start process (主机类型,进入点,应用程序,uid mocess //2 .进程启动timeout消息handleprocessstartedlocked(app,startResult.pid,startResult.usingWrapper,seq,false } catch (运行时exceptione )……}3.attachApplicationlocked,应用进程启动后,立即调用attach应用程序,最终应用程序

应用进程现在已启动,可以处理活动,如注释3所示。

专用蓝牙应用锁定(iapplicationthreadthread,

int pid, int callingUid, long startSeq) { ...... //1.remove timeout消息 mHandler.removeMessages(PROC_START_TIMEOUT_MSG, app); ...... //2.让应用进程初始化 thread.bindApplication(processName, appInfo, providers, app.instr.mClass, profilerInfo, app.instr.mArguments, app.instr.mWatcher, app.instr.mUiAutomationConnection, testMode, mBinderTransactionTrackingEnabled, enableTrackAllocation, isRestrictedBackupMode || !normalMode, app.persistent, new Configuration(getGlobalConfiguration()), app.compat, getCommonServicesLocked(app.isolated), mCoreSettingsObserver.getCoreSettingsLocked(), buildSerial, isAutofillCompatEnabled); //3.启动activity mStackSupervisor.attachApplicationLocked(app); //4.处理service mServices.attachApplicationLocked(app, processName); //5.处理broadcast sendPendingBroadcastsLocked(app); ......}

4.realStartActivityLocked,如注释1所示,创建activity的启动transaction,然后将其发送到应用端。

final boolean realStartActivityLocked(ActivityRecord r, ProcessRecord app, boolean andResume, boolean checkConfig) throws RemoteException { ...... //1. 创建activity launch transaction. final ClientTransaction clientTransaction = ClientTransaction.obtain(app.thread, r.appToken); clientTransaction.addCallback(LaunchActivityItem.obtain(new Intent(r.intent), System.identityHashCode(r), r.info, // TODO: Have this take the merged configuration instead of separate global // and override configs. mergedConfiguration.getGlobalConfiguration(), mergedConfiguration.getOverrideConfiguration(), r.compat, r.launchedFromPackage, task.voiceInteractor, app.repProcState, r.icicle, r.persistentState, results, newIntents, mService.isNextTransitionForward(), profilerInfo)); // Set desired final state. final ActivityLifecycleItem lifecycleItem; if (andResume) { lifecycleItem = ResumeActivityItem.obtain(mService.isNextTransitionForward()); } else { lifecycleItem = PauseActivityItem.obtain(); } clientTransaction.setLifecycleStateRequest(lifecycleItem); // 2.Schedule transaction mService.getLifecycleManager().scheduleTransaction(clientTransaction);......}

5.应用端收到请求会调用ActivityThread的handleLaunchActivity,然后调用performLaunchActivity,此方法会创建Activity,并调用对应的周期函数。

2.总结

1.冷启动优化
冷启动的时间我们可以大致分成两个阶段,
第一阶段:AMS调度+zygote进程启动+进程初始化
第二阶段:Application初始化+Activity的初始化和现实+自身业务的任务
通常我们测试冷启动的时间是从手指离开应用图标开始到应用进程完全显示且图像静止,而这个时间包含上述两段时间,第一个阶段是应用层很难去影响的,对于单个应用来说,尽可能的去优化第二个阶段。

2.自身应用所占用的内存
当我们在测试自身应用所占内存时,有时候会发现,明明没有做什么占用内存的修改,怎么这个版本比上个版本所占内存增加了这么多呢?这时我们可以通过相关工具对比一下是否是zygote进程占用内存增加了,因为所有的应用进程均从zygote进程继承而来,所以若zygote进程占用内存增加,那么应用的内存也会相应地增加。

cacheable注解,spring缓存有哪些技术