当前位置:编程学习 > JAVA >>

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、SensorService
   
   SystemServer.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.systemReady
 
 
ServerThread.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 ActivityManagerNative    
        implements Watchdog.Monitor, BatteryStatsImpl.BatteryCallback {    
    ......    
    public void systemReady(final Runnable goingCallback) {    
        ......    
        synchronized (this) {    
            ......    
            mMainStack.resumeTopActivityLocked(null);    
    &nbs
补充:软件开发 , Java ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,