Android Activity 启动流程

Android Activity 启动流程,第1张

[1] 一个 APP 从启动到主页面显示经历了哪些过程

[2] startActivity 启动过程分析 - Gityuan

[3] 译Android Application 启动流程分析

[4] 凯子哥带你学 FrameworkActivity 启动过程全解析

[5] Android Framework 之 Activity 启动流程(一)

[6] 任务和返回堆栈

开发中我们会调用startActivity来启动一个Activity,最终会调到 startActivityForResult

Instrumentation 是Android系统里面的一套控制方法或者“钩子”。这些钩子可以在正常的生命周期(正常是由 *** 作系统控制的)之外控制Android控件的运行。

Application和Activity的所有生命周期中,都会先调用Instrumentation提供的相应方法(如callActivityOnCreate,callApplicationOnCreate,newActivity,callActivityOnNewIntent)

InstrumentationexecStartActivity

ActivityTaskManagergetService()返回了一个IActivityTaskManager,拿到的是ATMS的代理对象,跨进程调用了ATMS的startActivity方法。

ActivityStarterstartActivityMayWait

ActivityStarter中做了一系列的调用(收集Intent信息,处理startActivityForResult,做一些校验判断等),最终进入startActivityUnchecked。

startActivityUnchecked

startActivityUnchecked中处理了关于Activity启动模式的处理,接着真正的resume我们的Activity

这里会先判断应用进程是否创建,创建了就进入 realStartActivityLocked ,没创建就会调用 ActivityManagerInternalstartProcess

①热启动realStartActivityLocked

接着看ActivityThread中接收并处理消息的handleMessage

前面realStartActivityLocked方法中通过addCallback,传入参数LaunchActivityItem。executeCallbacks方法中取出callbacks集合中的LaunchActivityItem,并调用其execute方法

handleLaunchActivity

②冷启动创建应用进程ActivityManagerInternalstartProcess

ActivityManagerInternal的实现类是AMS中的LocalService,AMS通过Socket与Zygote通信,fork出App进程,app进程创建后,会执行ActivityThread的main方法(Android进程入口方法)

调用ActivityThread的attach

[4]threadbindApplication 这是一个binder通信的过程

ActivityThread内部的Handler接收到BIND_APPLICATION消息

回到上面attachApplicationLocked的mAtmInternalattachApplication,调用ATMS的attachApplication

看到了似曾相识的realStartActivityLocked,后面流程和之前一样。Activity启动流程分析完毕。

总结

1)与Activity管理有关的类:

ActivityRecord :历史栈中的一个条目,代表一个Activity

TaskRecord :内部维护了一个ArrayList<ActivityRecord> ,来保存ActivityRecord

ActivityStack :内部维护了一个ArrayList<TaskRecord>,用来管理TaskRecord

ActivityStackSupervisor :用来管理ActivityStack的

2)Activity启动流程

第一篇: Android系统启动之bootloader

第二篇: Android系统启动之Init流程(上)

第三篇: Android系统启动之Init流程(下)

第四篇: Android系统启动之initrc文件解析过程

第五篇: Android系统启动之zyogte进程

第六篇: Android系统启动之zyogte进程java(上)

第七篇: Android系统启动之zyogte进程java(下)

第八篇: Android系统启动之SystemServer

Android initrc文件由系统第一个启动的init程序解析。是启动系统服务使用的文件。

主要包含了四种类型的语句:

Action和services显式声明了一个语句块,而commands和options属于最近声明的语句块。

在第一个语句块之前 的commands和options会被忽略

基本规则如下:

动作表示了一组命令(commands)组成动作包括一个触发器,决定了何时运行这个动作。

注意: 当触发器的条件满足时,这个动作会被增加到已被运行的队列尾。假设此动作在队列中已经存在,那么它将不会运行

一个动作所包括的命令将被依次运行。

在"动作"(action)里面的,on后面跟着的字符串是触发器(trigger),trigger是一个用于匹配某种事件类型的字符串,它将对应的Action的执行。

触发器(trigger)有几种格式:

常见的格式:

command是action的命令列表中的命令,或者是service中的选项 onrestart 的参数命令

命令将在所属事件发生时被一个个地执行

常见命令:

服务是指那些须要在系统初始化时就启动或退出时自己主动重新启动的程序

解释一下各个参数:

options是Service的修订项。它们决定一个服务何时以及如何运行

使用例子:

源码路径 system/core/init/initcpp 中:

开始解析rc文件.

ParseConfig函数在文件 core/init/init_parsercpp 140行:

ParseConfigFile函数:

Android initrc文件浅析

安卓系统启动--3initrc解析

initrc深入学习

相关源码:

在四大组件:Activity、Service、ContentProvider、BroadcastReceiver,启动过程中,如果其承载的进程不存在,则会调用 AMSstartProcessLocked 方法创建进程。

调用 startProcessLocked() 方法开始启动进程

ActivityManagerService服务的startProcessLocked方法通过调用 ProcessListstartProcessLocked 方法,接下来看看ProcessList如何处理:

对于非独立App,会根据进程名和uid查找到进程的信息,如果存在进程并且不在bad进程列表并且没有thread对象attached到该进程则直接返回该进程信息。否则创建新的进程,并且通过 ProcessList startProcessLocked 层层调用最终调用 Processstart 向Zygote进程发起请求。

第一个参数processClass为:ActivityThread。

第二个参数niceName为:进程名 。

Processstart方法继续调用 ZygoteProcess start 方法。

调用 startViaZygote 方法将接收的进程的参数,写入到 argsForZygote 数组中。最后分别调用了 openZygoteSocketIfNeeded 方法建立与zygote进程的通信,和调用 zygoteSendArgsAndGetResult 方法给zygote进程发送并返回消息。

openZygoteSocketIfNeeded 方法通过abi匹配是和zygote通信还是和zygote64通信,通过 ZygoteStateconnect 方法通过socket与Zygote建立通信连接。

zygoteSendArgsAndGetResult 方法通过调用 attemptZygoteSendArgsAndGetResult 方法去发送消息,attemptZygoteSendArgsAndGetResult通过 ZygoteState 拿到BufferedWriter和DataInputStream,通过 BufferedWriter 去写入数据发送,通过 DataInputStream 去等待Zygote创建进程的pid。

在 runSelectLoop 方法中死循环调用 Ospoll 处理轮询状态,如果有新进程需要创建则激活继续执行,没有常见新进程事件则一直阻塞。当收到客户端连接时,会调用 acceptCommandPeer 创建一个 ZygoteConnection 。最后调用 ZygoteConnectionprocessOneCommand 创建新进程。

processOneCommand 方法主要做了两件事:

在创建子进程前,会把Zygote进程的4个Daemon子线程stop,在创建完子进程后,重新对Zygote进程的4个Daemon子线程start。

通过调用 nativeForkAndSpecialize JNI方法去创建子进程,对应执行[com_android_internal_os_Zygotecpp]com_android_internal_os_Zygote_nativeForkAndSpecialize方法

fork() 是Linux创建进程的标准方法,采用 copy on write 技术,这里要注意的两点是:

自此已经完成新子进程的创建,下面开始调用``处理关于子进程的 *** 作。

对于新创建的子进程会复制Zygote进程的Socket,所以会关闭此socket连接,接着调用 ZygoteInitzygoteInit 方法返回一个Runnable。ZygoteInitzygoteInit方法会做三件事:

做些通用的设置,比如设置默认的未捕捉异常处理方法、设置时区,设置log,设置Hppt等。

ProcessState::self()会调用open()方法打开Binder设备,执行mmap()方法进行映射。

startThreadPool()启动新Binder线程,循环监听事件。

argsstartClass 就是ActivityThread类,通过反射调用 ActivityThreadmain() 方法,MethodAndArgsCaller是一个Runnable类,最终在ZygoteInitmain执行Runnablerun方法。

新进程创建后会执行 ActivityThreadmain() 方法:

创建完主线程的 Looper ,并通过调用 attach() 方法,调用Binder跨进程的方式调用 AMS attachApplication 方法,并让其绑定ApplicationThread类。

阅读顺序,

先看Binder机制, 接着对照此图看ServiceManager的启动和获取,

先了解基础启动流程, 后面的文章都会再次基础上进行增加, 例如AMS的启动和注册等

Android adbexe程序启动详细处理步骤如下:

1、打开Android adbexe程序,输入:     netstat -aon|findstr "5037"  回车;

2、5037 这是adb要的端口,有时候会被其他进程(程序)占用了(一般是会连接手机的软件)所以要查询是谁占用了,然后就可以Kill(停止)它;

3、根据上图然后输入     taskkill /pid 1156 /f     (1156就是占用此端口的进程id);正常情况下,就可以使用adb了,如果还是没有成功的,可以看看是不是adbexe被电脑防火墙屏蔽了。

扩展资料:

1、Android adbexe程序处理方法详细讲解:

cmd命令进入sdk/platform-tools文件下,adb kill-server;

启动adb服务,adb start-server;

如果启动失败,可能是某个进程占用了adb的5037端口,查找占用端口号5037的连接netstat -ano findstr "5037" ;

2、手动结束此进程,重启adb服务 adb start-server;

adb kill-server --停止adb服务;

adb start-server --开启adb服务;

参考资料来源:百度百科-Android系统级深入开发:移植与调试

上电之后到U-boot的流程

暂不关心CP的启动,而主要关心AP

Android启动流程——1序言、bootloader引导与Linux启动

Android开发中,当需要创建在后台运行的程序的时候,就要使用到Service。Service 可以分为有无限生命和有限生命两种。特别需要注意的是Service跟Activities是不同的(简单来说可以理解为后台与前台的区别),例如,如果需要使用Service的话,需要调用startService(),从而利用startService()去调用Service中的OnCreate()和onStart()方法来启动一个后台的Service。 启动一个Service的过程如下:contextstartService() ->onCreate()- >onStart()->Service running其中onCreate()可以进行一些服务的初始化工作,onStart()则启动服务。 停止一个Service的过程如下:contextstopService() | ->onDestroy() ->Service stop 接下来的实例是一个利用后台服务播放音乐的小例子,点击start运行服务,点击stop停止服务。ServicesDemojava(是一个Activity)

package comandroidmyservice;

import androidappActivity;

import androidcontentIntent;

import androidosBundle;

import androidutilLog;

import androidviewView;

import androidviewViewOnClickListener;

import androidwidgetButton;

public class ServiceDemo extends Activity implements OnClickListener {

private static final String TAG = "ServiceDemo";

Button buttonStart, buttonStop;

}

除此之外还要在Manifest里面声明服务:

<xml version="10" encoding="utf-8">

<manifest xmlns:android=" >

以上就是关于Android Activity 启动流程全部的内容,包括:Android Activity 启动流程、Activity的启动流程、Android系统启动之init.rc文件解析过程等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9827915.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-02
下一篇 2023-05-02

发表评论

登录后才能评论

评论列表(0条)

保存