这里介绍一些Android的一些冷知识。

App进程是从哪里开始启动的

ActivityManagerService类的源码在Sdk里有,是Android中最核心的服务之一,负责系统中四大组件的启动、切换、调度及应用进程的管理和调度等等工作。这个类是运行在系统进程里,由系统管理,通过跨进程通信的方式与我们的App进行通信。这个类有个方法

private final void startProcessLocked(ProcessRecord app, String hostingType, String hostingNameStr, String abiOverride, String entryPoint, String[] entryPointArgs) {    ......    Process.ProcessStartResult startResult = Process.start(entryPoint,            app.processName, uid, uid, gids, debugFlags, mountExternal,            app.info.targetSdkVersion, app.info.seinfo, requiredAbi, instructionSet,            app.info.dataDir, entryPointArgs);    ......}

我们的App进程最初就是由这个方法创建的。

App的入口方法在哪里?

任何语言写的任何程序都会有执行入口。Android App的入口是ActivityThread的main方法。具体定义是在ActivityManagerService的startProcessLocked方法里。

private final void startProcessLocked(ProcessRecord app, String hostingType, String hostingNameStr, String abiOverride, String entryPoint, String[] entryPointArgs) {    ......    // Start the process.  It will either succeed and return a result containing    // the PID of the new process, or else throw a RuntimeException.    boolean isActivityProcess = (entryPoint == null);    if (entryPoint == null) entryPoint = "android.app.ActivityThread";    Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "Start proc: " +            app.processName);    checkTime(startTime, "startProcess: asking zygote to start proc");    Process.ProcessStartResult startResult = Process.start(entryPoint,            app.processName, uid, uid, gids, debugFlags, mountExternal,            app.info.targetSdkVersion, app.info.seinfo, requiredAbi, instructionSet,            app.info.dataDir, entryPointArgs);    checkTime(startTime, "startProcess: returned from zygote!");    Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);    ......}

if (entryPoint == null) entryPoint = "android.app.ActivityThread";这一行定义了App的入口类。

App创建Activity的地方在哪里

创建Activity的消息是从ActivityManagerService通过跨进程通信的方式发送到

-> ApplicationThread      -> scheduleLaunchActivity     mH->handleMessage -> LAUNCH_ACTIVITY     -> handleLaunchActivity     -> performLaunchActivity        -> mInstrumentation.newActivity            -> (Activity)cl.loadClass(className).newInstance();

最终通过反射的方式创建出了Activity实例。

Activity实例引用被谁持有?

Activity创建了实例对象后,肯定会被某个对象持有,否则引用计数为0后,Activity实例就会被GC回收掉。

private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) {    ......      Activity activity = null;      ......      activity = mInstrumentation.newActivity(cl,component.getClassName(), r.intent);      ......      r.activity = activity;      mActivities.put(r.token, r);      ......}

Activity在创建之后就被mActivities持有。mActivities被ActivityThread持有。ActivityThread对象是在App的入口main方法实例化的。main方法除非进程被杀死否则main是不会结束的。

public static void main(String[] args) {    ......    ActivityThread thread = new ActivityThread();    ......}

Activity实例什么时候被销毁?

前面说到Activity被ActivityThread的mActivities持有。那什么时候Activity实例被销毁呢?说到销毁大家可能会想到Activity生命周期的onDestory方法。

-> ApplicationThread      -> scheduleDestroyActivity     mH->handleMessage -> DESTROY_ACTIVITY     -> handleDestroyActivity     -> performDestroyActivity        // 从这里继续会执行到Activity的onDestory方法        -> mInstrumentation.callActivityOnDestroy(r.activity);     // Activity实例从mActivities被移除     -> mActivities.remove(token);

当Activity实例从mActivities里移除后,如果当前Activity实例没有被其他对象强引用或者说Activity没有内存泄漏,那么下次GC的时候Activity实例就会被销毁掉。

更多相关文章

  1. 为 Android(安卓)添加 Java 层服务(二)
  2. Android中Context的总结及其用法
  3. Android类库打包方法探究
  4. android 监听电话去电接通瞬间[非来电]
  5. Android中滑屏初探 - scrollTo 以及 scrollBy方法使用说明
  6. Android:异步处理之Handler、Looper、MessageQueue之间的恩怨(三)
  7. 【起航计划 013】2015 起航计划 Android(安卓)APIDemo的魔鬼步伐
  8. Android(安卓)之 Choreographer 详细分析
  9. 【Android】点击WebView中的按钮,关闭当前activity

随机推荐

  1. android:persistentDrawingCache用法说明
  2. Gson包冲突解决方案
  3. android 布局练习
  4. android Html Package机制说明
  5. android 版本号比较大小
  6. Android动态生成RadioButton
  7. Android 获取网络图片
  8. Android SharedPreferences本地缓存
  9. 如何开始使用Android应用程序模板
  10. iphone、android的mimetype