Android系统默认Home应用程序Launcher的启动过程源代码分析Word下载.docx

上传人:b****4 文档编号:16710695 上传时间:2022-11-25 格式:DOCX 页数:24 大小:202.32KB
下载 相关 举报
Android系统默认Home应用程序Launcher的启动过程源代码分析Word下载.docx_第1页
第1页 / 共24页
Android系统默认Home应用程序Launcher的启动过程源代码分析Word下载.docx_第2页
第2页 / 共24页
Android系统默认Home应用程序Launcher的启动过程源代码分析Word下载.docx_第3页
第3页 / 共24页
Android系统默认Home应用程序Launcher的启动过程源代码分析Word下载.docx_第4页
第4页 / 共24页
Android系统默认Home应用程序Launcher的启动过程源代码分析Word下载.docx_第5页
第5页 / 共24页
点击查看更多>>
下载资源
资源描述

Android系统默认Home应用程序Launcher的启动过程源代码分析Word下载.docx

《Android系统默认Home应用程序Launcher的启动过程源代码分析Word下载.docx》由会员分享,可在线阅读,更多相关《Android系统默认Home应用程序Launcher的启动过程源代码分析Word下载.docx(24页珍藏版)》请在冰豆网上搜索。

Android系统默认Home应用程序Launcher的启动过程源代码分析Word下载.docx

final 

class 

ActivityManagerService 

extends 

ActivityManagerNative 

2. 

implements 

Watchdog.Monitor, 

BatteryStatsImpl.BatteryCallback 

3. 

...... 

4. 

5. 

public 

static 

Context 

main(int 

factoryTest) 

6. 

AThread 

thr 

new 

AThread();

7. 

thr.start();

8. 

9. 

synchronized 

(thr) 

10. 

while 

(thr.mService 

== 

null) 

11. 

try 

12. 

thr.wait();

13. 

catch 

(InterruptedException 

e) 

14. 

15. 

16. 

17. 

18. 

thr.mService;

19. 

mSelf 

m;

20. 

ActivityThread 

at 

ActivityThread.systemMain();

21. 

mSystemThread 

at;

22. 

context 

at.getSystemContext();

23. 

m.mContext 

context;

24. 

m.mFactoryTest 

factoryTest;

25. 

m.mMainStack 

ActivityStack(m, 

context, 

true);

26. 

27. 

m.mBatteryStatsService.publish(context);

28. 

m.mUsageStatsService.publish(context);

29. 

30. 

31. 

thr.mReady 

true;

32. 

thr.notifyAll();

33. 

34. 

35. 

m.startRunning(null, 

null, 

null);

36. 

37. 

return 

38. 

39. 

40. 

41.} 

这个函数首先通过AThread线程对象来内部创建了一个ActivityManagerService实例,然后将这个实例保存其成员变量mService中,接着又把这个ActivityManagerService实例保存在ActivityManagerService类的静态成员变量mSelf中,最后初始化其它成员变量,就结束了。

Step8. 

PackageManagerService.main

这个函数定义在frameworks/base/services/java/com/android/server/PackageManagerService.java文件中,具体可以参考前面一篇文章Android应用程序安装过程源代码分析的Step7。

执行完这一步之后,系统中的应用程序的所有信息都保存在PackageManagerService中了,后面Home应用程序Launcher启动起来后,就会把PackageManagerService中的应用程序信息取出来,然后以快捷图标的形式展示在桌面上,后面我们将会看到这个过程。

Step9. 

ActivityManagerService.setSystemProcess

void 

setSystemProcess() 

mSelf;

ServiceManager.addService("

activity"

 

m);

meminfo"

MemBinder(m));

if 

(MONITOR_CPU_USAGE) 

cpuinfo"

CpuBinder(m));

permission"

PermissionController(m));

ApplicationInfo 

info 

mSelf.mContext.getPackageManager().getApplicationInfo( 

"

android"

STOCK_PM_FLAGS);

mSystemThread.installSystemApplicationInfo(info);

(mSelf) 

ProcessRecord 

app 

mSelf.newProcessRecordLocked( 

mSystemThread.getApplicationThread(), 

info, 

info.processName);

app.persistent 

app.pid 

MY_PID;

app.maxAdj 

SYSTEM_ADJ;

mSelf.mProcessNames.put(app.processName, 

app.info.uid, 

app);

(mSelf.mPidsSelfLocked) 

mSelf.mPidsSelfLocked.put(app.pid, 

mSelf.updateLruProcessLocked(app, 

true, 

(PackageManager.NameNotFoundException 

throw 

RuntimeException( 

Unable 

to 

find 

android 

system 

package"

e);

40.} 

这个函数首先是将这个ActivityManagerService实例添加到ServiceManager中去托管,这样其它地方就可以通过ServiceManager.getService接口来访问这个全局唯一的ActivityManagerService实例了,接着又通过调用mSystemThread.installSystemApplicationInfo函数来把应用程序框架层下面的android包加载进来,这里的mSystemThread是一个ActivityThread类型的实例变量,它是在上面的Step7中创建的,后面就是一些其它的初始化工作了。

Step10. 

ActivityManagerService.systemReady

这个函数是在上面的Step6中的ServerThread.run函数在将系统中的一系列服务都初始化完毕之后才调用的,它定义在frameworks/base/services/java/com/android/server/am/ActivityManagerServcie.java文件中:

systemReady(final 

Runnable 

goingCallback) 

(this) 

mMainStack.resumeTopActivityLocked(null);

16.} 

这个函数的内容比较多,这里省去无关的部分,主要关心启动Home应用程序的逻辑,这里就是通过mMainStack.resumeTopActivityLocked函数来启动Home应用程序的了,这里的mMainStack是一个ActivityStack类型的实例变量。

Step11.ActivityStack.resumeTopActivityLocked

这个函数定义在frameworks/base/services/java/com/android/server/am/ActivityStack.java文件中:

ActivityStack 

boolean 

resumeTopActivityLocked(ActivityRecord 

prev) 

// 

Find 

the 

first 

activity 

that 

is 

not 

finishing. 

ActivityRecord 

next 

topRunningActivityLocked(null);

(next 

There 

are 

no 

more 

activities!

Let'

just 

start 

up 

Launcher... 

(mMainStack) 

mService.startHomeActivityLocked();

22.} 

这里调用函数topRunningActivityLocked返回的是当前系统Activity堆栈最顶端的Activity,由于此时还没有Activity被启动过,因此,返回值为null,即next变量的值为null,于是就调用mService.startHomeActivityLocked语句,这里的mService就是前面在Step7中创建的ActivityManagerService实例了。

Step12. 

ActivityManagerService.startHomeActivityLocked

startHomeActivityLocked() 

Intent 

intent 

Intent( 

mTopAction, 

mTopData 

!

null 

?

Uri.parse(mTopData) 

:

intent.setComponent(mTopComponent);

(mFactoryTest 

SystemServer.FACTORY_TEST_LOW_LEVEL) 

intent.addCategory(Intent.CATEGORY_HOME);

ActivityInfo 

aInfo 

intent.resolveActivityInfo(mContext.getPackageManager(), 

(aInfo 

intent.setComponent(new 

ComponentName( 

aInfo.applicationInfo.packageName, 

aInfo.name));

Don'

do 

this 

home 

currently 

being 

instrumented. 

getProcessRecordLocked(aInfo.processName, 

aInfo.applicationInfo.uid);

(app 

|| 

app.instrumentationClass 

intent.setFlags(intent.getFlags() 

Intent.FLAG_ACTIVITY_NEW_TASK);

mMainStack.startActivityLocked(null, 

intent, 

0, 

aInfo, 

false, 

false);

36.} 

函数首先创建一个CATEGORY_HOME类型的Intent,然后通过Intent.resolveActivityInfo函数向PackageManagerService查询Category类型为HOME的Activity,这里我们假设只有系统自带的Launcher应用程序注册了HOME类型的Activity(见packages/apps/Launcher2/AndroidManifest.xml文件):

1.<

manifest 

xmlns:

android="

package="

com.android.launcher"

android:

sharedUserId=

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 交通运输

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1