分析Android Activity的启动过程

分析Android Activity的启动过程

对于Android Activity 的启动过程,我在Android源码中读了好久的源码,以下是我整理出来的Activity启动过程和大家分享下:

Activity作为Android的四大组件之一,也是最基本的组件,负责与用户交互的所有功能。Activity的启动过程也并非一件神秘的事情,接下来就简单的从源码的角度分析一下Activity的启动过程。

根Activity一般就是指我们项目中的MainActivity,代表了一个android应用程序,一般也是在一个新的进程中启动起来。在Android系统中,所有的Activity组件都保存在堆栈中,我们启动一个新的Activity组件就位于上一个Activity的上面。那么我们从桌面(Launcher)打开一个App是一个怎样的过程呢,如下所示:

(1)Launcher向ActivityManagerService发送一个启动MainActivity的请求;
    (2)ActivityManagerService首先将MainActivity的相关信息保存下来,然后向Launcher发送一个使之进入中止状态的请求;
    (3)Launcher收到中止状态之后,就会想ActivityManagerService发送一个已进入中止状态的请求,便于ActivityManagerService继续执行启动MainActivity的操作;
    (4)ActivityManagerService检查用于运行MainActivity的进程,如果不存在,则启动一个新的进程;
    (5)新的应用程序进程启动完成之后,就会向ActivityManagerService发送一个启动完成的请求,便于ActivityManagerService继续执行启动MainActivity的操作;
    (6)ActivityManagerService将第(2)步保存下来的MainActivity相关信息发送给新创建的进程,便于该进程启动MainActivity组件。

Launcher.startActivitySafely

boolean startActivitySafely(Intent intent, Object tag) {
  intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  try {
   startActivity(intent);
   return true;
  } catch (ActivityNotFoundException e) {}
}

当我们在Launcher上点击应用程序图标时,startActivitySafely方法会被调用。需要启动的Activity信息保存在intent中,包括action、category等等。那么Launcher是如何获得intent里面的这些信息呢?首先,系统在启动时会启动一个叫做PackageManagerService的管理服务,并且通过他来安装系统中的应用程序,在这个过程中,PackageManagerService会对应用程序的配置文件AndroidManifest.xml进行解析,从而得到程序里的组件信息(包括Activity、Service、Broadcast等),然后PackageManagerService去查询所有action为“android.intent.action.MAIN”并且category为“android.intent.category.LAUNCHER”的Activity,然后为每个应用程序创建一个快捷方式图标,并把程序信息与之关联。上述代码中,Activity的启动标志位设置为“Intent.FLAG_ACTIVITY_NEW_TASK”,便于他可以在一个新的任务中启动。

Activity.startActivity

@Override
 public void startActivity(Intent intent, @Nullable Bundle options) {
  if (options != null) {
   startActivityForResult(intent, -1, options);
  } else {
   startActivityForResult(intent, -1);
  }
 }

调用startActivityForResult,第二个参数(requestCode)为-1则表示在Activity关闭时不需要将结果传回来。

Activity.startActivityForResult

public void startActivityForResult(Intent intent, int requestCode, @Nullable Bundle options) {
  if (mParent == null) { //一般的Activity其mParent都为null
   Instrumentation.ActivityResult ar = mInstrumentation.execStartActivity(this,
      mMainThread.getApplicationThread(), mToken, this,intent, requestCode, options);
   if (ar != null) { //发送结果,即onActivityResult会被调用
    mMainThread.sendActivityResult(mToken, mEmbeddedID, requestCode, ar.getResultCode(),
      ar.getResultData());
   }
   if (requestCode >= 0) {
    mStartedActivity = true;
   } 

   final View decor = mWindow != null ? mWindow.peekDecorView() : null;
   if (decor != null) {
    decor.cancelPendingInputEvents();
   }
  } else { //在ActivityGroup内部的Activity,内部处理逻辑和上面是类似的
   if (options != null) {
    mParent.startActivityFromChild(this, intent, requestCode, options);
   } else {
    mParent.startActivityFromChild(this, intent, requestCode);
   }
  }
  if (options != null && !isTopOfTask()) {
   mActivityTransitionState.startExitOutTransition(this, options);
  }
 }

不难发现,最后实际上是调用mInstrumentation.execStartActivity来启动Activity,mInstrumentation类型为Instrumentation,用于监控程序和系统之间的交互操作。mInstrumentation代为执行Activity的启动操作,便于他可以监控这一个交互过程。

mMainThread的类型为ActivityThread,用于描述一个应用程序进程,系统每启动一个程序都会在它里面加载一个ActivityThread的实例,并且将该实例保存在Activity的成员变量mMainThread中,而mMainThread.getApplicationThread()则用于获取其内部一个类型为ApplicationThread的本地Binder对象。mToken的类型为IBinder,他是一个Binder的代理对象,只想了ActivityManagerService中一个类型为ActivityRecord的本地Binder对象。每一个已经启动的Activity在ActivityManagerService中都有一个对应的ActivityRecord对象,用于维护Activity的运行状态及信息。

Instrumentation.execStartActivity

public ActivityResult execStartActivity(Context who, IBinder contextThread, IBinder token, Activity target,
   Intent intent, int requestCode, Bundle options) {
  IApplicationThread whoThread = (IApplicationThread) contextThread;
  if (mActivityMonitors != null) {
   synchronized (mSync) {
    final int N = mActivityMonitors.size();
    for (int i=0; i<N; i++) { //先查找一遍看是否存在这个activity
     final ActivityMonitor am = mActivityMonitors.get(i);
     if (am.match(who, null, intent)) {
      am.mHits++;
      if (am.isBlocking()) {
       return requestCode >= 0 ? am.getResult() : null;
      }
      break;
     }
    }
   }
  }
  try {
   intent.migrateExtraStreamToClipData();
   intent.prepareToLeaveProcess();
   int result = ActivityManagerNative.getDefault().startActivity(whoThread, who.getBasePackageName(), intent,
      intent.resolveTypeIfNeeded(who.getContentResolver()),token, target != null ? target.mEmbeddedID : null,
      requestCode, 0, null, options); //这里才是真正打开activity的地方,其核心功能在whoThread中完成。
   checkStartActivityResult(result, intent); // 处理各种异常,如ActivityNotFound
  } catch (RemoteException e) {
  }
  return null;
 }

上述代码可知,通过ActivityManagerNative.getDefault()获取一个ActivityManagerService的代理对象,然后调用他的startActivity方法来通知ActivityManagerService去启动Activity。

中间还有一系列过程,跟着源码走下去,不难发现,最后,是调用ApplicationThread的scheduleLaunchActivity来进行Activity的启动。

Application.scheduleLaunchActivity

public final void scheduleLaunchActivity(Intent intent, IBinder token, int ident,
    ActivityInfo info, Configuration curConfig, CompatibilityInfo compatInfo,
    String referrer, IVoiceInteractor voiceInteractor, int procState, Bundle state,
    PersistableBundle persistentState, List<ResultInfo> pendingResults,
    List<ReferrerIntent> pendingNewIntents, boolean notResumed, boolean isForward,
    ProfilerInfo profilerInfo) { 

   updateProcessState(procState, false); 

   ActivityClientRecord r = new ActivityClientRecord(); 

   r.token = token;
   r.ident = ident;
   r.intent = intent;
   r.referrer = referrer;
   r.voiceInteractor = voiceInteractor;
   r.activityInfo = info;
   r.compatInfo = compatInfo;
   r.state = state;
   r.persistentState = persistentState; 

   r.pendingResults = pendingResults;
   r.pendingIntents = pendingNewIntents; 

   r.startsNotResumed = notResumed;
   r.isForward = isForward; 

   r.profilerInfo = profilerInfo; 

   updatePendingConfiguration(curConfig); 

   sendMessage(H.LAUNCH_ACTIVITY, r);
  }

上述代码主要做的事就是构造一个ActivityClientRecord,然后调用sendMessage发送一个消息。在应用程序对应的进程中,每一个Activity组件都使用一个ActivityClientRecord对象来描述,他们保存在ActivityThread类的成员变量mActivities中。那么Handler是如何处理这个消息的呢?

H.handleMessage

switch (msg.what) { // 消息类型
  case LAUNCH_ACTIVITY: {
   Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "activityStart");
   final ActivityClientRecord r = (ActivityClientRecord) msg.obj; 

   r.packageInfo = getPackageInfoNoCheck(
     r.activityInfo.applicationInfo, r.compatInfo);
   handleLaunchActivity(r, null); // 处理消息
   Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
  } break;
  case RELAUNCH_ACTIVITY: {
   Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "activityRestart");
   ActivityClientRecord r = (ActivityClientRecord)msg.obj;
   handleRelaunchActivity(r);
   Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
  } break;
  case PAUSE_ACTIVITY:
   Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "activityPause");
   handlePauseActivity((IBinder)msg.obj, false, (msg.arg1&1) != 0, msg.arg2,
     (msg.arg1&2) != 0);
   maybeSnapshot();
   Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
   break;
  ... ...
}

首先将msg里面的obj转成一个ActivityClientRecord对象,然后调用来获取一个LoaderApk对象并保存在ActivityClientRecord对象的成员变量packageInfo中。Loader对象用于描述一个已经加载的APK文件。最后调用handleLaunchActivity来启动Activity组件。

ActivityThread.handleLaunchActivity

private void handleLaunchActivity(ActivityClientRecord r, Intent customIntent) {
  unscheduleGcIdler();
  mSomeActivitiesChanged = true; 

  if (r.profilerInfo != null) {
   mProfiler.setProfiler(r.profilerInfo);
   mProfiler.startProfiling();
  } 

  handleConfigurationChanged(null, null); 

  if (localLOGV) Slog.v(
   TAG, "Handling launch of " + r); 

  WindowManagerGlobal.initialize(); 

  Activity a = performLaunchActivity(r, customIntent); //performLaunchActivity真正完成了activity的调起,Activity被实例化,onCreate被调用 

  if (a != null) {
   r.createdConfig = new Configuration(mConfiguration);
   Bundle oldState = r.state;
   handleResumeActivity(r.token, false, r.isForward, // 再调用Activity实例的Resume(用户界面可见)
     !r.activity.mFinished && !r.startsNotResumed); 

   if (!r.activity.mFinished && r.startsNotResumed) {
    try {
     r.activity.mCalled = false;
     mInstrumentation.callActivityOnPause(r.activity); // finish的时候先调onPause
     if (r.isPreHoneycomb()) {
      r.state = oldState;
     }
     if (!r.activity.mCalled) {
      throw new SuperNotCalledException(
       "Activity " + r.intent.getComponent().toShortString() +
       " did not call through to super.onPause()");
     } 

    } catch (SuperNotCalledException e) {
     throw e; 

    } catch (Exception e) {
     if (!mInstrumentation.onException(r.activity, e)) {
      throw new RuntimeException(
        "Unable to pause activity "
        + r.intent.getComponent().toShortString()
        + ": " + e.toString(), e);
     }
    }
    r.paused = true;
   }
  } else {
   try {
    ActivityManagerNative.getDefault() // finishActivity 一样的原理
     .finishActivity(r.token, Activity.RESULT_CANCELED, null, false);
   } catch (RemoteException ex) {
   }
  }
 }

到了这一步,那就很清晰了。憋了一口气到这里,是不是突然放松了一下~~  再来看看performLaunchActivity做的事儿~~performLaunchActivity函数加载用户自定义的Activity的派生类,并执行其onCreate函数,它将返回此Activity对象。

ActivityThread.performLaunchActivity

private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) {
  ActivityInfo aInfo = r.activityInfo;
  if (r.packageInfo == null) {
   r.packageInfo = getPackageInfo(aInfo.applicationInfo, r.compatInfo,
     Context.CONTEXT_INCLUDE_CODE);
  }
  //从intent中取出目标activity的启动参数(包名、类名等)
  ComponentName component = r.intent.getComponent();
  if (component == null) {
   component = r.intent.resolveActivity(
    mInitialApplication.getPackageManager());
   r.intent.setComponent(component);
  } 

  if (r.activityInfo.targetActivity != null) {
   component = new ComponentName(r.activityInfo.packageName,
     r.activityInfo.targetActivity);
  } 

  Activity activity = null;
  try {
   java.lang.ClassLoader cl = r.packageInfo.getClassLoader(); // 将Activity类文件加载到内存中
   activity = mInstrumentation.newActivity( // 创建Activity实例
     cl, component.getClassName(), r.intent);
   StrictMode.incrementExpectedActivityCount(activity.getClass());
   r.intent.setExtrasClassLoader(cl);
   r.intent.prepareToEnterProcess();
   if (r.state != null) {
    r.state.setClassLoader(cl);
   }
  } catch (Exception e) {
   if (!mInstrumentation.onException(activity, e)) {
    throw new RuntimeException(
     "Unable to instantiate activity " + component
     + ": " + e.toString(), e);
   }
  } 

  try {
   Application app = r.packageInfo.makeApplication(false, mInstrumentation); 

   if (localLOGV) Slog.v(TAG, "Performing launch of " + r);
   if (localLOGV) Slog.v(
     TAG, r + ": app=" + app
     + ", appName=" + app.getPackageName()
     + ", pkg=" + r.packageInfo.getPackageName()
     + ", comp=" + r.intent.getComponent().toShortString()
     + ", dir=" + r.packageInfo.getAppDir()); 

   if (activity != null) {
    Context appContext = createBaseContextForActivity(r, activity); // 初始化Context对象,作为Activity的上下文
    CharSequence title = r.activityInfo.loadLabel(appContext.getPackageManager());
    Configuration config = new Configuration(mCompatConfiguration);
    if (DEBUG_CONFIGURATION) Slog.v(TAG, "Launching activity "
      + r.activityInfo.name + " with config " + config);
    activity.attach(appContext, this, getInstrumentation(), r.token,
      r.ident, app, r.intent, r.activityInfo, title, r.parent,
      r.embeddedID, r.lastNonConfigurationInstances, config,
      r.referrer, r.voiceInteractor); 

    if (customIntent != null) {
     activity.mIntent = customIntent;
    }
    r.lastNonConfigurationInstances = null;
    activity.mStartedActivity = false;
    int theme = r.activityInfo.getThemeResource();
    if (theme != 0) {
     activity.setTheme(theme);
    } 

    activity.mCalled = false;
    if (r.isPersistable()) { //下面就是调用到acitivity的onCreate方法了
     mInstrumentation.callActivityOnCreate(activity, r.state, r.persistentState);
    } else {
     mInstrumentation.callActivityOnCreate(activity, r.state);
    } // 至此,Activity启动过程就结束了,其生命周期由ApplicationThread来管理
    if (!activity.mCalled) {
     throw new SuperNotCalledException(
      "Activity " + r.intent.getComponent().toShortString() +
      " did not call through to super.onCreate()");
    }
    r.activity = activity;
    r.stopped = true;
    if (!r.activity.mFinished) {
     activity.performStart();
     r.stopped = false;
    }
    if (!r.activity.mFinished) {
     if (r.isPersistable()) {
      if (r.state != null || r.persistentState != null) {
       mInstrumentation.callActivityOnRestoreInstanceState(activity, r.state,
         r.persistentState);
      }
     } else if (r.state != null) {
      mInstrumentation.callActivityOnRestoreInstanceState(activity, r.state);
     }
    }
    if (!r.activity.mFinished) {
     activity.mCalled = false;
     if (r.isPersistable()) {
      mInstrumentation.callActivityOnPostCreate(activity, r.state,
        r.persistentState);
     } else {
      mInstrumentation.callActivityOnPostCreate(activity, r.state);
     }
     if (!activity.mCalled) {
      throw new SuperNotCalledException(
       "Activity " + r.intent.getComponent().toShortString() +
       " did not call through to super.onPostCreate()");
     }
    }
   }
   r.paused = true;
   mActivities.put(r.token, r); // 将ActivityRecord对象保存在ActivityThread的mActivities中
  } catch (SuperNotCalledException e) {
   throw e;
  } catch (Exception e) {
   if (!mInstrumentation.onException(activity, e)) {
    throw new RuntimeException(
     "Unable to start activity " + component
     + ": " + e.toString(), e);
   }
  }
  return activity;
 }

ActivityRecord里面的token,是一个Binder的代理对象,和ActivityClientRecord对象一样,都是用来描述所启动的Activity组件,只不过前者是在ActivityManagerService中使用,后者是在应用程序进程中使用。

至此,Activity的启动过程就分析完了。MainActivity的启动过程,其实也可以认为是应用程序的启动过程。
子Activity的启动过程和根Activity的启动过程也是类似的,过程如下:

(1)MainActivity向ActivityManagerService发送一个自动ChildActivity的请求;

(2)ActivityManagerService首先将ChildActivity的信息保存下来,再向MainActivity发送一个中止的请求;

(3)MainActivity收到请求进入中止状态,告诉ActivityManagerService,便于ActivityManagerService继续执行启动ChildActivity的操作

(4)ActivityManagerService检查ChildActivity所运行的进程是否存在,存在就发送ChildActivity信息给他,以进行启动。
源代码方面,原理类似,相比起来会比MainActivity的稍微简单一些,这里就不再详细叙述了,各位可以自行根据前面步骤,阅读源代码。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

(0)

相关推荐

  • Android Activity进出动画三种方法

     Android Activity进出动画三种方法 实现activity的进出场动画总共有3种方式,下面会一一列出,首先给出示例的动画xml文件. 动画的xml文件 <?xml version="1.0" encoding="utf-8"?> <translate xmlns:android="http://schemas.android.com/apk/res/android" android:fromYDelta="

  • Android DaggerActivityComponent错误解决办法详解

    Android DaggerActivityComponent错误解决办法详解 在使用dagger2的过程中,如果修改了某个类的内容,第一次编译运行时总会报错:错误: 找不到符号 符号: 类 DaggerActivityComponent 位置: 程序包 com--的错误,然后再重新编译一次,才会正常运行,经过仔细的检查终于找到问题的根源: 错误的原因是build.gradle(Module:app)引入'com.google.dagger:dagger-compiler:2.0.2'使用的是c

  • Android通过自定义Activity实现悬浮的Dialog详解

    前言 其实实现悬浮的自定义窗体有很多方法,自定义Dialog,自定义layout 均可以实现.自定义activity也是可以的,今天我就介绍一下activity的实现方法.下面来看看详细的介绍: 效果图 如图可以看出,当前的窗体,第一眼其实和dialog没有什么区别,但是它是自定义activity实现.如何实现的呢? 代码如下: 新建activity @Override protected void onCreate(Bundle savedInstanceState) { super.onCr

  • Android ActionBarActivity设置全屏无标题的方法总结

    Android ActionBarActivity设置全屏无标题的方法总结 新建的Activity继承自ActionBarActivity,设置全屏无标题本来很简单的事,但是没想到app竟然无缘无故的挂,要么就是白屏一片,要么就是黑屏.坑了我一个多小时!!! 原因是ActionBarActivity设置theme的时候只能使用v7包里的Theme.AppCompat***开头的主题,因此设置全屏无标题的话需要自定义个style: <style name="ActionBarFullScre

  • 详解Android Activity之间跳转出现短暂黑屏的处理方法

    摘要: 如何解决页面之间跳转时的黑屏问题呢? 在默认情况下,Android应用程序启动时,会有一个黑屏的时期.原因是,首个activity会加载一些数据,比如初始化列表数据.向服务器发送请求获取数据等等.同样,使用startActivity(intent)方法从一个Activity进入到新的Activity时,这个过程中也会出现短暂的黑屏.这个问题的存在是由Android应用框架决定的,但的确很影响用户体验.下面就动手来解决这个黑屏 问题! 第一步:自定义Theme(主题) 在your_proj

  • Android编程实现在Activity中操作刷新另外一个Activity数据列表的方法

    本文实例讲述了Android编程实现在Activity中操作刷新另外一个Activity数据列表的方法.分享给大家供大家参考,具体如下: 做Android项目中遇到这样一个问题:有两个acticity,一个显示好友列表,另外一个显示会话列表,现在问题是在会话界面增加一个添加好友功能,添加好友后要求实时的刷新好友列表. 想了想,找了两种方式 方法一:通过声明要刷新的activity(FriendActivity)为静态变量,然后在一个activity(SessionActivity)中直接调用刷新

  • Android中Activity滑动关闭的效果

    最近感觉有一个Activity关闭的效果挺不错的,就是手势滑动就可以关闭当前Activity,于是就想写一篇博客和大家一起分享下!废话不多说,老规矩,还先上效果图,更直观! 项目地址:https://github.com/xinyitiandi/SlidingFinishDemo 上代码: 1.第一个Activity: package com.ekeguan.slidingfinishdemo; import android.content.Intent; import android.os.B

  • 分析Android Activity的启动过程

    分析Android Activity的启动过程 对于Android Activity 的启动过程,我在Android源码中读了好久的源码,以下是我整理出来的Activity启动过程和大家分享下: Activity作为Android的四大组件之一,也是最基本的组件,负责与用户交互的所有功能.Activity的启动过程也并非一件神秘的事情,接下来就简单的从源码的角度分析一下Activity的启动过程. 根Activity一般就是指我们项目中的MainActivity,代表了一个android应用程序

  • Android 系统服务TelecomService启动过程原理分析

    由于一直负责的是Android Telephony部分的开发工作,对于通信过程的上层部分Telecom服务以及UI都没有认真研究过.最近恰好碰到一个通话方面的问题,涉及到了Telecom部分,因而就花时间仔细研究了下相关的代码.这里做一个简单的总结.这篇文章,主要以下两个部分的内容: 什么是Telecom服务?其作用是什么? Telecom模块的启动与初始化过程: 接下来一篇文章,主要以实际通话过程为例,分析下telephony收到来电后如何将电话信息发送到Telecom模块以及Telecom是

  • Android Activity的启动过程源码解析

    前言 Activity是Android中一个很重要的概念,堪称四大组件之首,关于Activity有很多内容,比如生命周期和启动Flags,这二者想要说清楚,恐怕又要写两篇长文,更何况分析它们的源码呢.不过本文的侧重点不是它们,我要介绍的是一个Activity典型的启动过程,本文会从源码的角度对其进行分析.我们知道,当startActivity被调用的时候,可以启动一个Activity,但是你知道这个Activity是如何被启动的吗?每个Activity也是一个对象,你知道这个对象是啥时候被创建的

  • 详解Android Activity的启动流程

    前言 activity启动的流程分为两部分:一是在activity中通过startActivity(Intent intent)方法启动一个Activity:二是我们在桌面通过点击应用图标启动一个App然后显示Activity:第二种方式相较于第一种方式更加全面,所以本文会以第二种流程来分析. 简要 我们手机的桌面是一个叫做Launcher的Activity,它罗列了手机中的应用图标,图标中包含安装apk时解析的应用默认启动页等信息.在点击应用图标时,即将要启动的App和Launcher.AMS

  • 简要分析linux系统的启动过程

    接触linux系统运维已经好几年了,常常被问到linux系统启动流程问题,刚好今天有空来梳理下这个过程: 一般来说,所有的操作系统的启动流程基本就是: 总的来说,linux系统启动流程可以简单总结为以下几步: 1)开机BIOS自检,加载硬盘. 2)读取MBR,进行MBR引导. 3)grub引导菜单(Boot Loader). 4)加载内核kernel. 5)启动init进程,依据inittab文件设定运行级别 6)init进程,执行rc.sysinit文件. 7)启动内核模块,执行不同级别的脚本

  • 分析Android中应用的启动流程

    前言 在我们开始之前,希望您能最好已经满足以下条件: 1.有一份编译后的Android源码(亲自动手实践才会有更深入的理解) 2.对Binder机制有一定的了解 本文启动流程分析基于Android 5.1的源码.为什么是5.1的源码呢?因为手边编译完的代码只有这个版本-另外,用什么版本的源码并不重要,大体的流程并无本质上的区别,仅仅是实现细节的调整,找一个你熟悉的版本就好. 1.启动时序图 作为一个轻微强迫症的人,整理的时序图,相信大家按图索骥,一定能搞明白整个启动流程: 说明:为了让大家更清楚

  • 详解Android中的ActivityThread和APP启动过程

    ActiviryThread ActivityThread的初始化 ActivityThread即Android的主线程,也就是UI线程,ActivityThread的main方法是一个APP的真正入口,MainLooper在它的main方法中被创建. //ActivityThread的main方法 public static void main(String[] args) { ... Looper.prepareMainLooper(); ActivityThread thread = ne

  • Android Activity启动流程刨析

    目录 前言 一.Binder的基本理解 二.Activity启动的双向IPC过程 三.AMS服务注册 前言 上篇文章写到 Service 的启动过程: 相对来说Activity的启动过程比Service的启动过程更为复杂,其一Activity的生命周期方法比Service多,其二Activity具有启动模式和返回栈: 写本文的目的在于更清晰的梳理Activity的启动过程,加强自己的内功修炼,力在以最简单的方式让大家理解,跟大家一起学习 一.Binder的基本理解 Activity的启动有多次I

  • Android系统进程间通信(IPC)机制Binder中的Server启动过程源代码分析

    在前面一篇文章Android系统进程间通信(IPC)机制Binder中的Server和Client获得Service Manager接口之路中,介绍了在Android系统中Binder进程间通信机制中的Server角色是如何获得Service Manager远程接口的,即defaultServiceManager函数的实现.Server获得了Service Manager远程接口之后,就要把自己的Service添加到Service Manager中去,然后把自己启动起来,等待Client的请求.

  • Android Service启动过程完整分析

    刚开始学习Service的时候以为它是一个线程的封装,也可以执行耗时操作.其实不然,Service是运行在主线程的.直接执行耗时操作是会阻塞主线程的.长时间就直接ANR了. 我们知道Service可以执行一些后台任务,是后台任务不是耗时的任务,后台和耗时是有区别的喔. 这样就很容易想到音乐播放器,天气预报这些应用是要用到Service的.当然如果要在Service中执行耗时操作的话,开个线程就可以了. 关于Service的运行状态有两种,启动状态和绑定状态,两种状态可以一起. 启动一个Servi

随机推荐