icode icode
首页
  • Android学习

    • 📁基础内容
    • 📺AndroidCore
    • 🎨Android-UI
    • 🏖️Components
    • 📊Fragment
    • 🔗网络操作
    • 🔏异步机制
    • 📦数据存储
    • 🗃️Gradle
  • 学习笔记

    • 『框架』笔记
    • 『Kotlin』笔记
    • 《Vue》笔记
    • 《Git》学习笔记
    • 『Bug踩坑记录』
  • ListView
  • RecyclerView
  • ViewPager
  • Java笔记

    • 🟠JavaSE
    • 🟢JavaWeb
    • 🔴JavaEE
    • ⚪JavaTopic
    • 🍳设计模式
  • 计算机基础

    • 📌计算机网络
    • 🔍数据结构
    • 📦数据库
    • 💻OS
  • 技术文档
  • GitHub技巧
  • Nodejs
  • 博客搭建
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
  • 关于

    • 📫关于我
  • 收藏

    • 网站
    • 资源
    • Vue资源
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

iqqcode

保持对技术的探索实践与热爱
首页
  • Android学习

    • 📁基础内容
    • 📺AndroidCore
    • 🎨Android-UI
    • 🏖️Components
    • 📊Fragment
    • 🔗网络操作
    • 🔏异步机制
    • 📦数据存储
    • 🗃️Gradle
  • 学习笔记

    • 『框架』笔记
    • 『Kotlin』笔记
    • 《Vue》笔记
    • 《Git》学习笔记
    • 『Bug踩坑记录』
  • ListView
  • RecyclerView
  • ViewPager
  • Java笔记

    • 🟠JavaSE
    • 🟢JavaWeb
    • 🔴JavaEE
    • ⚪JavaTopic
    • 🍳设计模式
  • 计算机基础

    • 📌计算机网络
    • 🔍数据结构
    • 📦数据库
    • 💻OS
  • 技术文档
  • GitHub技巧
  • Nodejs
  • 博客搭建
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
  • 关于

    • 📫关于我
  • 收藏

    • 网站
    • 资源
    • Vue资源
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 基础内容

    • Android入门

      • Android程序的执行入口
        • Android程序入口函数
        • Android应用程序的入口
        • Activity对象的onCreate方法
      • Android概况
      • AS项目常见问题
      • Android项目打包过程
      • Manifest功能清单文件
      • 调试工具的使用
      • Android中的属性长度单位
      • 接口回调-监听器
    • ADB

  • AndroidCore

  • Android UI

  • Components

  • Fragment

  • 网络操作

  • 异步机制

  • 数据存储

  • 学习笔记

  • 自定义View

  • View事件体系

  • Android
  • 基础内容
  • Android入门
iqqcode
2021-04-27
目录

Android程序的执行入口

Java程序入口

Java程序执行的入口是main方法,JVM通过类加载器将此类加载到内存中,在该类中搜索main方法并开始在该类中执行。


# Android程序入口函数

【结论】:

Android上一个应用的入口,是ActivityThread,和普通的java类一样,入口是一个main方法。Android应用中主线程的执行入口,是**ActivityThread.main()**。abdroid.app.ActivityThread类的main()方法,为OS进程创建Main(UI),对其进行设置Looper并启动事件循环。

ActivityThread.main()也是在ZygoteInit中被反射调用的。

Activity 的 onCreate方法,并不是此问题的答案!

Android框架负责创建和销毁OS进程,启动应用程序,启动活动,服务和其他组件ActivityManager是Android框架的一部分,它负责协调和管理不同的组件。所有组件(Activity,Service,BroadcastReceiver等)不一定都在同一OS进程或同一虚拟机(VM)中运行。可能有一个应用程序中的组件在不同的OS进程中运行,也有可能使不同应用程序中的组件在同一OS进程中运行。在传统的Java中,main方法是在创建OS进程并且虚拟机完成其初始化之后由虚拟机调用的方法。

[摘自StackOverFlow] https://stackoverflow.com/questions/9293329/where-is-main-in-android/9293488#9293488

Android不能像java一样直接跑在 main 方法的原因是什么?

Android应用程序的载体是APK文件,它本质上,是一个资源和组件的容器,APK文件 和我们常见的 可执行文件 的区别在何处?

每个可执行文件运行在一个进程中,但是APK文件可能运行在一个单独的进程,也可以和其他APK运行在同一进程中。Android应用程序可以是理解为是四大组件和各种资源的集合,它需要各种各样的环境资源,当然不能像Java直接跑在main方法里面

结合上面,我想表达的是:

Android系统的设计理念就是弱化进程,取而代之是组件的概念。

但是我们都知道,Android系统 基于 Linux系统 之上,而Linux系统的运行环境恰恰就是由进程组成。所有的Android应用进程都是由 Zygote进程 fork出来的,因此构成进程的地层系统、虚拟机、动态库等,都是相同的。

当然Android除了继承从 Zygote 中得到的某些基础的“家当”之外,Android还需要在应用的 Java层 建立一套框架来管理运行的组件。由于每个应用的配置都不相同,因此不能在 Zygote 中完全建立好再继承,只能在应用启动时创建。

这套框架就构成了Android应用的基础。

[摘自] MeloDev.ActivityThread的main方法究竟做了什么. http://www.jianshu.com/users/f5909165c1e8

  • [ ] 此处不做过多的源码分析,深入到这部分内容时,继续回来更新

# Android应用程序的入口

Android应用程序的入口是:Application类的onCreat方法

网上很多资料和文章很多都认为Android应用程序的“入口”是 Application的onCreat方法,准确来说,我认为应该是 一个Activity的生命周期的第一阶段。

Android应用程序中,并没有像c++和java这样有main函数来作为应用程序的入口。android应用程序提供的是入口Activity,它需要各种各样的环境资源,当然不能像Java直接跑在main方法里面,而非入口函数。

  • 如果指应用程序的入口函数 : ActivityThread 类的main
  • 如果是应用程序的入口 : Application 的 onCreat方法

对于Android,Dalvik虚拟机旨在查找一个类,该类是Activity的子类,并且被设置为LAUNCHER以便从其onCreate()方法开始执行应用程序,因此不需要 main方法。

当我们新建一个Android Project的时候,系统会默认新建一个MainActivity,它实际就是入口Activity了,从哪里可以看出来呢?

AndroidManifest.xml 文件中定义了程序中所有Activity

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.iqqcode.test">

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

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

</manifest>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

action节点中的 android.intent.action.MAIN 表明它所在的Activity是整个程序 开始运行时 的入口

category中的 android.intent.category.LAUNCHER 意思是把这个Activityg归属到加载器类,即把这个Activity标注为自动会加载和启动的Activity,这样程序启动时候就先加载这个Activity了


# Activity对象的onCreate方法

正是程序自动帮我们创建Application对象,很多情况下,我们不需具体实现的原因,导致我们忽略了Application对象,误以为activity对象中的onCreate方法才是Android应用程序的入口。

Android中activity可以有,也可以没有,也确实存在没有activity对象的Android程序。而Android中Application类是在程序启动时才创建,并且只会创建一个,通常情况下,我们是不需要创建自己的Aplication对象,程序会自动帮我们创建。

Application类的继承关系如下:

java.lang.Object
    android.content.Context
        android.content.ContextWrapper
            android.app.Application
1
2
3
4

Application类包含了4个公开的方法

void  onConfigurationChanged(Configuration newConfig)
void  onCreate()
void  onLowMemory()
void  onTerminate()
1
2
3
4

若想创建自己的application对象,只需继承Application类,并在 AndroidMainfest.xml 文件中的application标签中进行注册。

Application对象的声明周期是Android程序中最长的,它的声明周期相当于整个程序的生命周期。也就是说它是全局的,是单例的,所以在不同的activity,service中获得的对象都是同一个,可以通过Application对象来实现真正意义上的全局变量,进行数据传递,数据共享,数据缓存等操作,这种全局变量方法直到程序被destroy才会被销毁。


【文章参考】

[1] 椰子zZ.Android程序入口以及项目文件夹的含义和使用总结—入门 (opens new window). https://www.cnblogs.com/mingjiatang/p/5978538.html

[2] 笔墨.Android应用程序入口源码解析.https://awenzeng.me/2017/11/23/tech_android_framework_appstart/

[3] stackoverflow. https://stackoverflow.com/questions/9293329/where-is-main-in-android/9293488#9293488

[4] lxydo.Activity对象的onCreate方法真是Android程序的入口吗 (opens new window)

[5] MeloDev.ActivityThread的main方法究竟做了什么.https://www.jianshu.com/p/0efc71f349c8

[6] 查理吃西瓜.关于ActivityThread类的深入学习.https://www.jianshu.com/p/93c66b3f08d6

[7] 小河同学.ActivityThread的理解和APP的启动过程.https://blog.csdn.net/hzwailll/article/details/85339714

[8] 知乎.https://www.zhihu.com/question/50828920

[9] 知乎.https://www.zhihu.com/question/20284432

[10] AlanCheen.Android应用程序的入口是哪里.https://github.com/RTFSC-Android/RTFSC/blob/master/where-is-app's-entrance.md

编辑 (opens new window)
#basic
上次更新: 2022/03/27, 22:58:50
Android概况

Android概况→

最近更新
01
匿名内部类
10-08
02
函数式接口
10-08
03
ARouter-Kotlin踩坑
10-05
更多文章>
Theme by Vdoing | Copyright © 2021-2023 iqqcode | MIT License | 备案号-京ICP备2021028793号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式
×