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>
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
2
3
4
Application类包含了4个公开的方法
void onConfigurationChanged(Configuration newConfig)
void onCreate()
void onLowMemory()
void onTerminate()
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