原文出处——>[ndroid应用程序内部启动Activity过程(startActivity)的源代码分析](http://blog.csdn.net/luoshengyang/article/details/6703247)
上文介绍了Android应用程序的启动过程,即应用程序默认Activity的启动过程,一般来说,这种默认Activity是在新的进程和任务中启动的;本文将继续分析在应用程序内部启动非默认Activity的过程的源代码,这种非默认Activity一般是在原来的进程和任务中启动的。
这里,我们像上一篇文章Android应用程序启动过程源代码分析一样,采用再上一篇文章Android应用程序的Activity启动过程简要介绍和学习计划所举的例子来分析在应用程序内部启动非默认Activity的过程。
在应用程序内部启动非默认Activity的过程与在应用程序启动器Launcher中启动另外一个应用程序的默认Activity的过程大体上一致的,因此,这里不会像上文Android应用程序启动过程源代码分析一样详细分析每一个步骤,我们着重关注有差别的地方。
回忆一下Android应用程序的Activity启动过程简要介绍和学习计划一文所用的应用程序Activity,它包含两个Activity,分别是MainActivity和SubActivity,前者是应用程序的默认Activity,后者是非默认Activity。MainActivity启动起来,通过点击它界面上的按钮,便可以在应用程序内部启动SubActivity。
我们先来看一下应用程序的配置文件AndroidManifest.xml,看看这两个Activity是如何配置的:
~~~
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="shy.luo.activity"
android:versionCode="1"
android:versionName="1.0">
<application android:icon="@drawable/icon" android:label="@string/app_name">
<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>
<activity android:name=".SubActivity"
android:label="@string/sub_activity">
<intent-filter>
<action android:name="shy.luo.activity.subactivity"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
</application>
</manifest>
~~~
这里可以很清楚地看到,MainActivity被配置成了应用程序的默认Activity,而SubActivity可以通过名称“shy.luo.activity.subactivity”隐式地启动,我们来看一下src/shy/luo/activity/MainActivity.java文件的内容,可以清楚地看到SubActivity是如何隐式地启动的:
~~~
public class MainActivity extends Activity implements OnClickListener {
......
@Override
public void onClick(View v) {
if(v.equals(startButton)) {
Intent intent = new Intent("shy.luo.activity.subactivity");
startActivity(intent);
}
}
}
~~~
这里,首先创建一个名称为“shy.luo.activity.subactivity”的Intent,然后以这个Intent为参数,通过调用startActivity函数来实现隐式地启动SubActivity。
有了这些背景知识后,我们就来看一下SubActivity启动过程的序列图:
![](https://box.kancloud.cn/6735add9d5a24dd971ca8eae41befc85_673x768.gif)
与前面介绍的MainActivity启动过程相比,这里少了中间创建新的进程的步骤;接下来,我们就详细分析一下SubActivity与MainActivity启动过程中有差别的地方,相同的地方请参考Android应用程序启动过程源代码分析一文。
* Step 1. Activity.startActivity
这一步与上一篇文章Android应用程序启动过程源代码分析的Step 2大体一致,通过指定名称“shy.luo.activity.subactivity”来告诉应用程序框架层,它要隐式地启动SubActivity。所不同的是传入的参数intent没有Intent.FLAG_ACTIVITY_NEW_TASK标志,表示这个SubActivity和启动它的MainActivity运行在同一个Task中。
* Step 2. Activity.startActivityForResult
这一步与上一篇文章Android应用程序启动过程源代码分析的Step 3一致。
* Step 3. Instrumentation.execStartActivity
这一步与上一篇文章Android应用程序启动过程源代码分析的Step 4一致。
* Step 4. ActivityManagerProxy.startActivity
这一步与上一篇文章Android应用程序启动过程源代码分析的Step 5一致。
* Step 5. ActivityManagerService.startActivity
这一步与上一篇文章Android应用程序启动过程源代码分析的Step 6一致。
* Step 6. ActivityStack.startActivityMayWait
这一步与上一篇文章Android应用程序启动过程源代码分析的Step 7一致。
* Step 7. ActivityStack.startActivityLocked
这一步与上一篇文章Android应用程序启动过程源代码分析的Step 8一致。
* Step 8. ActivityStack.startActivityUncheckedLocked
这一步与上一篇文章Android应用程序启动过程源代码分析的Step 9有所不同,主要是当前要启动的Activity与启动它的Activity是在同一个Task中运行的,我们来详细看一下。这个函数定义在frameworks/base/services/java/com/android/server/am/ActivityStack.java文件中:
~~~
public class ActivityStack {
......
final int startActivityUncheckedLocked(ActivityRecord r,
ActivityRecord sourceRecord, Uri[] grantedUriPermissions,
int grantedMode, boolean onlyIfNeeded, boolean doResume) {
final Intent intent = r.intent;
final int callingUid = r.launchedFromUid;
int launchFlags = intent.getFlags();
......
if (sourceRecord == null) {
......
} else if (sourceRecord.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE) {
......
} else if (r.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE
......
}
if (r.resultTo != null && (launchFlags&Intent.FLAG_ACTIVITY_NEW_TASK) != 0) {
......
}
boolean addingToTask = false;
if (((launchFlags&Intent.FLAG_ACTIVITY_NEW_TASK) != 0 &&
(launchFlags&Intent.FLAG_ACTIVITY_MULTIPLE_TASK) == 0)
|| r.launchMode == ActivityInfo.LAUNCH_SINGLE_TASK
|| r.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE) {
......
}
if (r.packageName != null) {
// If the activity being launched is the same as the one currently
// at the top, then we need to check if it should only be launched
// once.
ActivityRecord top = topRunningNonDelayedActivityLocked(notTop);
if (top != null && r.resultTo == null) {
if (top.realActivity.equals(r.realActivity)) {
......
}
}
} else {
......
}
boolean newTask = false;
// Should this be considered a new task?
if (r.resultTo == null && !addingToTask
&& (launchFlags&Intent.FLAG_ACTIVITY_NEW_TASK) != 0) {
......
} else if (sourceRecord != null) {
......
// An existing activity is starting this new activity, so we want
// to keep the new one in the same task as the one that is starting
// it.
r.task = sourceRecord.task;
......
} else {
......
}
......
startActivityLocked(r, newTask, doResume);
return START_SUCCESS;
}
......
}
~~~
这里,参数intent的标志位Intent.FLAG_ACTIVITY_NEW_TASK没有设置,在配置文件AndriodManifest.xml中,SubActivity也没有配置启动模式launchMode,于是它就默认标准模式,即ActivityInfo.LAUNCH_MULTIPLE,因此,下面if语句不会执行:
~~~
if (((launchFlags&Intent.FLAG_ACTIVITY_NEW_TASK) != 0 &&
(launchFlags&Intent.FLAG_ACTIVITY_MULTIPLE_TASK) == 0)
|| r.launchMode == ActivityInfo.LAUNCH_SINGLE_TASK
|| r.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE) {
......
}
~~~
于是,变量addingToTask为false。
继续往下看:
~~~
if (r.packageName != null) {
// If the activity being launched is the same as the one currently
// at the top, then we need to check if it should only be launched
// once.
ActivityRecord top = topRunningNonDelayedActivityLocked(notTop);
if (top != null && r.resultTo == null) {
if (top.realActivity.equals(r.realActivity)) {
......
}
}
}
~~~
这里看一下当前要启动的Activity是否就是当前堆栈顶端的Activity,如果是的话,在某些情况下,就不用再重新启动了。函数topRunningNonDelayedActivityLocked返回当前
堆栈顶端的Activity,这里即为MainActivity,而当前要启动的Activity为SubActivity,因此,这二者不相等,于是跳过里面的if语句。
接着往下执行:
~~~
// Should this be considered a new task?
if (r.resultTo == null && !addingToTask
&& (launchFlags&Intent.FLAG_ACTIVITY_NEW_TASK) != 0) {
......
} else if (sourceRecord != null) {
......
// An existing activity is starting this new activity, so we want
// to keep the new one in the same task as the one that is starting
// it.
r.task = sourceRecord.task;
......
} else {
......
}
~~~
前面说过参数intent的标志位Intent.FLAG_ACTIVITY_NEW_TASK没有设置,而这里的sourceRecord即为当前执行启动Activity操作的Activity,这里即为MainActivity,因此,它不为null,于是于MainActivity所属的Task设置到r.task中去,这里的r即为SubActivity。看到这里,我们就知道SubActivity要和MainActivity运行在同一个Task中了,同时,变量newTask的值为false。
最后,函数进 入startActivityLocked(r, newTask, doResume)进一步处理了。这个函数同样是定义在frameworks/base/services/java/com/android/server/am/ActivityStack.java文件中:
~~~
public class ActivityStack {
......
private final void startActivityLocked(ActivityRecord r, boolean newTask,
boolean doResume) {
final int NH = mHistory.size();
int addPos = -1;
if (!newTask) {
// If starting in an existing task, find where that is...
boolean startIt = true;
for (int i = NH-1; i >= 0; i--) {
ActivityRecord p = (ActivityRecord)mHistory.get(i);
if (p.finishing) {
continue;
}
if (p.task == r.task) {
// Here it is! Now, if this is not yet visible to the
// user, then just add it without starting; it will
// get started when the user navigates back to it.
addPos = i+1;
if (!startIt) {
mHistory.add(addPos, r);
r.inHistory = true;
r.task.numActivities++;
mService.mWindowManager.addAppToken(addPos, r, r.task.taskId,
r.info.screenOrientation, r.fullscreen);
if (VALIDATE_TOKENS) {
mService.mWindowManager.validateAppTokens(mHistory);
}
return;
}
break;
}
if (p.fullscreen) {
startIt = false;
}
}
}
......
// Slot the activity into the history stack and proceed
mHistory.add(addPos, r);
r.inHistory = true;
r.frontOfTask = newTask;
r.task.numActivities++;
......
if (doResume) {
resumeTopActivityLocked(null);
}
}
......
}
~~~
这里传进来的参数newTask为false,doResume为true。当newTask为false,表示即将要启动的Activity是在原有的Task运行时,如果这个原有的Task当前对用户不可见时,这时候就不需要继续执行下去了,因为即使把这个Activity启动起来,用户也看不到,还不如先把它保存起来,等到下次这个Task对用户可见的时候,再启动不迟。这里,这个原有的Task,即运行MainActivity的Task当前对用户是可见的,因此,会继续往下执行。
接下去执行就会把这个SubActivity通过mHistroy.add(addPos, r)添加到堆栈顶端去,然后调用resumeTopActivityLocked进一步操作。
* ep 9. ActivityStack.resumeTopActivityLocked
这一步与上一篇文章Android应用程序启动过程源代码分析的Step 10一致。
但是要注意的是,执行到这个函数的时候,当前处于堆栈顶端的Activity为SubActivity,ActivityStack的成员变量mResumedActivity指向MainActivity。
* Step 10. ActivityStack.startPausingLocked
这一步与上一篇文章Android应用程序启动过程源代码分析的Step 11一致。
从这里开始,ActivityManagerService通知MainActivity进入Paused状态。
* Step 11. ApplicationThreadProxy.schedulePauseActivity
这一步与上一篇文章Android应用程序启动过程源代码分析的Step 12一致。
* Step 12. ApplicationThread.schedulePauseActivity
这一步与上一篇文章Android应用程序启动过程源代码分析的Step 13一致。
* Step 13. ActivityThread.queueOrSendMessage
这一步与上一篇文章Android应用程序启动过程源代码分析的Step 14一致。
* Step 14. H.handleMessage
这一步与上一篇文章Android应用程序启动过程源代码分析的Step 15一致。
* Step 15. ActivityThread.handlePauseActivity
这一步与上一篇文章Android应用程序启动过程源代码分析的Step 16一致。
* Step 16. ActivityManagerProxy.activityPaused
这一步与上一篇文章Android应用程序启动过程源代码分析的Step 17一致。
* Step 17. ActivityManagerService.activityPaused
这一步与上一篇文章Android应用程序启动过程源代码分析的Step 18一致。
* Step 18. ActivityStack.activityPaused
这一步与上一篇文章Android应用程序启动过程源代码分析的Step 19一致。
* Step 19. ActivityStack.completePauseLocked
这一步与上一篇文章Android应用程序启动过程源代码分析的Step 20一致。
执行到这里的时候,MainActivity就进入Paused状态了,下面就开始要启动SubActivity了。
* Step 20. ActivityStack.resumeTopActivityLokced
这一步与上一篇文章Android应用程序启动过程源代码分析的Step 21一致。
* Sep 21. ActivityStack.startSpecificActivityLocked
这一步与上一篇文章Android应用程序启动过程源代码分析的Step 22就有所不同了,这里,它不会调用mService.startProcessLocked来创建一个新的进程来启动新的Activity,我们来看一下这个函数的实现,这个函数定义在frameworks/base/services/java/com/android/server/am/ActivityStack.java文件中:
~~~
public class ActivityStack {
......
private final void startSpecificActivityLocked(ActivityRecord r,
boolean andResume, boolean checkConfig) {
// Is this activity's application already running?
ProcessRecord app = mService.getProcessRecordLocked(r.processName,
r.info.applicationInfo.uid);
......
if (app != null && app.thread != null) {
try {
realStartActivityLocked(r, app, andResume, checkConfig);
return;
} catch (RemoteException e) {
......
}
}
......
}
......
}
~~~
这里由于不是第一次启动应用程序的Activity(MainActivity是这个应用程序第一个启动的Activity),所以下面语句:
~~~
ProcessRecord app = mService.getProcessRecordLocked(r.processName,
nfo.applicationInfo.uid);
~~~
取回来的app不为null。在上一篇文章Android应用程序启动过程源代码分析中,我们介绍过,在Activity应用程序中的AndroidManifest.xml配置文件中,我们没有指定application标签的process属性,于是系统就会默认使用package的名称,这里就是"shy.luo.activity"了。每一个应用程序都有自己的uid,因此,这里uid + process的组合就可以创建一个全局唯一的ProcessRecord。这个ProcessRecord是在前面启动MainActivity时创建的,因此,这里将它取回来,并保存在变量app中。注意,我们也可以在AndroidManifest.xml配置文件中指定SubActivity的process属性值,这样SubActivity就可以在另外一个进程中启动,不过很少有应用程序会这样做,我们不考虑这种情况。
这个app的thread也是在前面启动MainActivity时创建好的,于是,这里就直接调用realStartActivityLocked函数来启动新的Activity了,新的Activity的相关信息都保存在参数r中了。
* Step 22. ActivityStack.realStartActivityLocked
这一步与上一篇文章Android应用程序启动过程源代码分析的Step 28一致。
* Step 23. ApplicationThreadProxy.scheduleLaunchActivity
这一步与上一篇文章Android应用程序启动过程源代码分析的Step 29一致。
* Step 24. ApplicationThread.scheduleLaunchActivity
这一步与上一篇文章Android应用程序启动过程源代码分析的Step 30一致。
* Step 25. ActivityThread.queueOrSendMessage
这一步与上一篇文章Android应用程序启动过程源代码分析的Step 31一致。
* Step 26. H.handleMessage
这一步与上一篇文章Android应用程序启动过程源代码分析的Step 32一致。
* Step 27. ActivityThread.handleLaunchActivity
这一步与上一篇文章Android应用程序启动过程源代码分析的Step 33一致。
* Step 28. ActivityThread.performLaunchActivity
这一步与上一篇文章Android应用程序启动过程源代码分析的Step 34一致,不过,这里要从ClassLoader里面加载的类就是shy.luo.activity.SubActivity了。
* Step 29. SubAcitiviy.onCreate
这个函数定义在packages/experimental/Activity/src/shy/luo/activity/SubActivity.java文件中,这是我们自定义的app工程文件:
~~~
public class SubActivity extends Activity implements OnClickListener {
......
@Override
public void onCreate(Bundle savedInstanceState) {
......
Log.i(LOG_TAG, "Sub Activity Created.");
}
......
}
~~~
这样,SubActivity就在应用程序Activity内部启动起来了。
在应用程序内部启动新的Activity的过程要执行很多步骤,但是整体来看,主要分为以下四个阶段:
* 一. Step 1 - Step 10:应用程序的MainActivity通过Binder进程间通信机制通知ActivityManagerService,它要启动一个新的Activity;
* 二. Step 11 - Step 15:ActivityManagerService通过Binder进程间通信机制通知MainActivity进入Paused状态;
* 三. Step 16 - Step 22:MainActivity通过Binder进程间通信机制通知ActivityManagerService,它已经准备就绪进入Paused状态,于是ActivityManagerService就准备要在MainActivity所在的进程和任务中启动新的Activity了;
* 四. Step 23 - Step 29:ActivityManagerService通过Binder进程间通信机制通知MainActivity所在的ActivityThread,现在一切准备就绪,它可以真正执行Activity的启动操作了。
和上一篇文章Android应用程序启动过程源代码分析中启动应用程序的默认Activity相比,这里在应用程序内部启动新的Activity的过程少了中间创建新的进程这一步,这是因为新的Activity是在已有的进程和任务中执行的,无须创建新的进程和任务。
这里同样不少地方涉及到了Binder进程间通信机制,相关资料请参考Android进程间通信(IPC)机制Binder简要介绍和学习计划一文。
这里希望读者能够把本文和上文Android应用程序启动过程源代码分析仔细比较一下应用程序的默认Activity和非默认Activity启动过程的不同之处,以加深对Activity的理解。
最后,在本文和上文中,我们多次提到了Android应用程序中任务(Task)的概念,它既不是我们在Linux系统中所理解的进程(Process),也不是线程(Thread),它是用户为了完成某个目标而需要执行的一系列操作的过程的一种抽象。这是一个非常重要的概念,它从用户体验的角度出发,界定了应用程序的边界,极大地方便了开发者利用现成的组件(Activity)来搭建自己的应用程序,就像搭积木一样,而且,它还为应用程序屏蔽了底层的进程,即一个任务中的Activity可以都是运行在同一个进程中,也中可以运行在不同的进程中。Android应用程序中的任务的概念,具体可以参考官方文档http://developer.android.com/guide/topics/fundamentals/tasks-and-back-stack.html ,上面已经介绍的非常清楚了。
- 前言
- Android组件设计思想
- Android源代码开发和调试环境搭建
- Android源代码下载和编译
- Android源代码情景分析法
- Android源代码调试分析法
- 手把手教你为手机编译ROM
- 在Ubuntu上下载、编译和安装Android最新源代码
- 在Ubuntu上下载、编译和安装Android最新内核源代码(Linux Kernel)
- 如何单独编译Android源代码中的模块
- 在Ubuntu上为Android系统编写Linux内核驱动程序
- 在Ubuntu上为Android系统内置C可执行程序测试Linux内核驱动程序
- 在Ubuntu上为Android增加硬件抽象层(HAL)模块访问Linux内核驱动程序
- 在Ubuntu为Android硬件抽象层(HAL)模块编写JNI方法提供Java访问硬件服务接口
- 在Ubuntu上为Android系统的Application Frameworks层增加硬件访问服务
- 在Ubuntu上为Android系统内置Java应用程序测试Application Frameworks层的硬件服务
- Android源代码仓库及其管理工具Repo分析
- Android编译系统简要介绍和学习计划
- Android编译系统环境初始化过程分析
- Android源代码编译命令m/mm/mmm/make分析
- Android系统镜像文件的打包过程分析
- 从CM刷机过程和原理分析Android系统结构
- Android系统架构概述
- Android系统整体架构
- android专用驱动
- Android硬件抽象层HAL
- Android应用程序组件
- Android应用程序框架
- Android用户界面架构
- Android虚拟机之Dalvik虚拟机
- Android硬件抽象层
- Android硬件抽象层(HAL)概要介绍和学习计划
- Android专用驱动
- Android Logger驱动系统
- Android日志系统驱动程序Logger源代码分析
- Android应用程序框架层和系统运行库层日志系统源代码分析
- Android日志系统Logcat源代码简要分析
- Android Binder驱动系统
- Android进程间通信(IPC)机制Binder简要介绍和学习计划
- 浅谈Service Manager成为Android进程间通信(IPC)机制Binder守护进程之路
- 浅谈Android系统进程间通信(IPC)机制Binder中的Server和Client获得Service Manager接口之路
- Android系统进程间通信(IPC)机制Binder中的Server启动过程源代码分析
- Android系统进程间通信(IPC)机制Binder中的Client获得Server远程接口过程源代码分析
- Android系统进程间通信Binder机制在应用程序框架层的Java接口源代码分析
- Android Ashmem驱动系统
- Android系统匿名共享内存Ashmem(Anonymous Shared Memory)简要介绍和学习计划
- Android系统匿名共享内存Ashmem(Anonymous Shared Memory)驱动程序源代码分析
- Android系统匿名共享内存Ashmem(Anonymous Shared Memory)在进程间共享的原理分析
- Android系统匿名共享内存(Anonymous Shared Memory)C++调用接口分析
- Android应用程序进程管理
- Android应用程序进程启动过程的源代码分析
- Android系统进程Zygote启动过程的源代码分析
- Android系统默认Home应用程序(Launcher)的启动过程源代码分析
- Android应用程序消息机制
- Android应用程序消息处理机制(Looper、Handler)分析
- Android应用程序线程消息循环模型分析
- Android应用程序输入事件分发和处理机制
- Android应用程序键盘(Keyboard)消息处理机制分析
- Android应用程序UI架构
- Android系统的开机画面显示过程分析
- Android帧缓冲区(Frame Buffer)硬件抽象层(HAL)模块Gralloc的实现原理分析
- SurfaceFlinger
- Android系统Surface机制的SurfaceFlinger服务
- SurfaceFlinger服务简要介绍和学习计划
- 启动过程分析
- 对帧缓冲区(Frame Buffer)的管理分析
- 线程模型分析
- 渲染应用程序UI的过程分析
- Android应用程序与SurfaceFlinger服务的关系
- 概述和学习计划
- 连接过程分析
- 共享UI元数据(SharedClient)的创建过程分析
- 创建Surface的过程分析
- 渲染Surface的过程分析
- Android应用程序窗口(Activity)
- 实现框架简要介绍和学习计划
- 运行上下文环境(Context)的创建过程分析
- 窗口对象(Window)的创建过程分析
- 视图对象(View)的创建过程分析
- 与WindowManagerService服务的连接过程分析
- 绘图表面(Surface)的创建过程分析
- 测量(Measure)、布局(Layout)和绘制(Draw)过程分析
- WindowManagerService
- WindowManagerService的简要介绍和学习计划
- 计算Activity窗口大小的过程分析
- 对窗口的组织方式分析
- 对输入法窗口(Input Method Window)的管理分析
- 对壁纸窗口(Wallpaper Window)的管理分析
- 计算窗口Z轴位置的过程分析
- 显示Activity组件的启动窗口(Starting Window)的过程分析
- 切换Activity窗口(App Transition)的过程分析
- 显示窗口动画的原理分析
- Android控件TextView的实现原理分析
- Android视图SurfaceView的实现原理分析
- Android应用程序UI硬件加速渲染
- 简要介绍和学习计划
- 环境初始化过程分析
- 预加载资源地图集服务(Asset Atlas Service)分析
- Display List构建过程分析
- Display List渲染过程分析
- 动画执行过程分析
- Android应用程序资源管理框架
- Android资源管理框架(Asset Manager)
- Asset Manager 简要介绍和学习计划
- 编译和打包过程分析
- Asset Manager的创建过程分析
- 查找过程分析
- Dalvik虚拟机和ART虚拟机
- Dalvik虚拟机
- Dalvik虚拟机简要介绍和学习计划
- Dalvik虚拟机的启动过程分析
- Dalvik虚拟机的运行过程分析
- Dalvik虚拟机JNI方法的注册过程分析
- Dalvik虚拟机进程和线程的创建过程分析
- Dalvik虚拟机垃圾收集机制简要介绍和学习计划
- Dalvik虚拟机Java堆创建过程分析
- Dalvik虚拟机为新创建对象分配内存的过程分析
- Dalvik虚拟机垃圾收集(GC)过程分析
- ART虚拟机
- Android ART运行时无缝替换Dalvik虚拟机的过程分析
- Android运行时ART简要介绍和学习计划
- Android运行时ART加载OAT文件的过程分析
- Android运行时ART加载类和方法的过程分析
- Android运行时ART执行类方法的过程分析
- ART运行时垃圾收集机制简要介绍和学习计划
- ART运行时Java堆创建过程分析
- ART运行时为新创建对象分配内存的过程分析
- ART运行时垃圾收集(GC)过程分析
- ART运行时Compacting GC简要介绍和学习计划
- ART运行时Compacting GC堆创建过程分析
- ART运行时Compacting GC为新创建对象分配内存的过程分析
- ART运行时Semi-Space(SS)和Generational Semi-Space(GSS)GC执行过程分析
- ART运行时Mark-Compact( MC)GC执行过程分析
- ART运行时Foreground GC和Background GC切换过程分析
- Android安全机制
- SEAndroid安全机制简要介绍和学习计划
- SEAndroid安全机制框架分析
- SEAndroid安全机制中的文件安全上下文关联分析
- SEAndroid安全机制中的进程安全上下文关联分析
- SEAndroid安全机制对Android属性访问的保护分析
- SEAndroid安全机制对Binder IPC的保护分析
- 从NDK在非Root手机上的调试原理探讨Android的安全机制
- APK防反编译
- Android视频硬解稳定性问题探讨和处理
- Android系统的智能指针(轻量级指针、强指针和弱指针)的实现原理分析
- Android应用程序安装过程源代码分析
- Android应用程序启动过程源代码分析
- 四大组件源代码分析
- Activity
- Android应用程序的Activity启动过程简要介绍和学习计划
- Android应用程序内部启动Activity过程(startActivity)的源代码分析
- 解开Android应用程序组件Activity的"singleTask"之谜
- Android应用程序在新的进程中启动新的Activity的方法和过程分析
- Service
- Android应用程序绑定服务(bindService)的过程源代码分析
- ContentProvider
- Android应用程序组件Content Provider简要介绍和学习计划
- Android应用程序组件Content Provider应用实例
- Android应用程序组件Content Provider的启动过程源代码分析
- Android应用程序组件Content Provider在应用程序之间共享数据的原理分析
- Android应用程序组件Content Provider的共享数据更新通知机制分析
- BroadcastReceiver
- Android系统中的广播(Broadcast)机制简要介绍和学习计划
- Android应用程序注册广播接收器(registerReceiver)的过程分析
- Android应用程序发送广播(sendBroadcast)的过程分析