android - home键及launcher启动流程分析
android - home键及launcher启动流程分析launcher,也就是android的桌面应用程序,开机启动的第一个应用程序及按home键进入的都是这个程序。如果需要修改启动流程或者制作一个新的launcher,都有必要了解一下这个流程。第一部分:系统默认Home应用程序(launcher)启动流程1、frameworks/base/services/java/com/android/server/SystemServer.java一直以来大家都记得"hello world"程序就是写一个main函数,那么我们这里也从main函数开始:public static void main(String[] args)这里分为两个过程:SystemServer.init1启动几个重要navtive service,比如 SurfaceFlinger、SensorServiceSystemServer.init2启动java service,比如 ContentService、PowerManagerService、MountService、WindowManagerService 等等2、frameworks/base/services/java/com/android/server/am/ActivityManagerServcie.java启动 ActivityManagerService跳到如下:[java]Slog.i(TAG, "Activity Manager");context = ActivityManagerService.main(factoryTest);public static final Context main(int factoryTest) {AThread thr = new AThread();thr.start();synchronized (thr) {while (thr.mService == null) {try {thr.wait();} catch (InterruptedException e) {}}}ActivityManagerService m = thr.mService;mSelf = m;ActivityThread at = ActivityThread.systemMain();mSystemThread = at;Context context = at.getSystemContext();context.setTheme(android.R.style.Theme_Holo);m.mContext = context;m.mFactoryTest = factoryTest;m.mMainStack = new ActivityStack(m, context, true);m.mBatteryStatsService.publish(context);m.mUsageStatsService.publish(context);synchronized (thr) {thr.mReady = true;thr.notifyAll();}m.startRunning(null, null, null, null);return context;}这个函数首先通过AThread线程对象来内部创建了一个ActivityManagerService实例,然后将这个实例保存其成员变量mService中,接着又把这个ActivityManagerService实例保存在ActivityManagerService类的静态成员变量mSelf中,最后初始化其它成员变量,就结束了。AThread 线程启动代码如下:[java]AThread thr = new AThread();thr.start();static class AThread extends Thread {ActivityManagerService mService;boolean mReady = false;public AThread() {super("ActivityManager");}public void run() {Looper.prepare();android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_FOREGROUND);android.os.Process.setCanSelfBackground(false);ActivityManagerService m = new ActivityManagerService();synchronized (this) {mService = m;notifyAll();}synchronized (this) {while (!mReady) {try {wait();} catch (InterruptedException e) {}}}...}3、ActivityManagerService.systemReadyServerThread.run函数在将系统中的一系列服务都初始化完毕之后才调用[java]SystemService.java:// We now tell the activity manager it is okay to run third party// code. It will call back into us once it has gotten to the state// where third party code can really run (but before it has actually// started launching the initial applications), for us to complete our// initialization.ActivityManagerService.self().systemReady(new Runnable() {public void run() {Slog.i(TAG, "Making services ready");核心代码如下:[java]public final class ActivityManagerService extends ActivityManagerNativeimplements Watchdog.Monitor, BatteryStatsImpl.BatteryCallback {......public void systemReady(final Runnable goingCallback) {......synchronized (this) {......mMainStack.resumeTopActivityLocked(null);&nbs补充:软件开发 , Java ,
上一个:Java IO--内存操作流
下一个:The constructor Intent(new View.OnClickListener(){}, Class<ButtonStudyActivity>) is undefined
- 更多JAVA疑问解答:
- java怎么在线读取ftp服务器上的文件内容
- 关于程序员的职业规划
- HTML和JSP矛盾吗?
- java小程序如何打包?
- java怎么split路径文件名?
- 关于Hibernate实体自身多对一的抓取问题
- 关于apache2+tomcat群集出现的问题
- SSH 导入导出excel 谁有这块的资料吗?
- springmvc 加载一个jsp页面执行多个方法 报404
- 关于用jquery 导入 excel
- java对时间进行循环放到List中
- 一个图片的输入输出程序,第一次调用某方法会中断,第二次调用则正常
- 请上过传智播客的人说一下传智播客怎么样呀!是不是像它说的那样好呀!
- spring的schema怎么配置
- 【菜鸟求助】SSH中怎么从JSP页面往后台传值呢