美文网首页
Android的一些冷知识

Android的一些冷知识

作者: Jerry2015 | 来源:发表于2017-04-21 17:03 被阅读210次

这里介绍一些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实例就会被销毁掉。

相关文章

  • Android的一些冷知识

    这里介绍一些Android的一些冷知识。 App进程是从哪里开始启动的 ActivityManagerServic...

  • Android 冷知识

    1.binder oneway oneway:调用方(Client)非阻塞(non-block)非 oneway:...

  • 一些冷知识

    Dialog初化始时是通过Context.getSystemServer 来获取 WindowManager,而如...

  • 一些冷知识

    1 “剃发易服”早在金的时候女真人就干过,当然也引起了一系列的反抗,不同的是那时候终是挺过去了 2 蒙古最早是个部...

  • 我的世界攻略大全011-MC玩家必备的冷知识(3)

    我的世界中有哪些冷知识?了解一些冷知识对游戏很有帮助,下面小白就为大家盘点《我的世界》冷知识大全,新手必看冷知识汇...

  • 初识Android Studio项目结构

    TwT-Android 新人培训——Android项目结构 目标 普及Android Studio的一些小知识。 ...

  • HTML标签那些事

    目录: 一. 一些HTML偏冷知识 二. HTML5语义化标签 一. 一些HTML偏冷知识 contentedit...

  • Android 进阶路线(思维导图)

    整理了Android开发中的一些知识点,包括Java基础、Android基础、Android进阶、开源框架和工具类...

  • Android的一些小知识

    0. 查看Android设备上所有安装的apk及路径的命令:adb shell pm list packages ...

  • Android 知识体系

    一. Android 知识体系图 花了一些时间整理的关于Android 开发相关的知识体系脑图,可根据这些点完善自...

网友评论

      本文标题:Android的一些冷知识

      本文链接:https://www.haomeiwen.com/subject/jgqdzttx.html