startService流程

本文详细解析了Android中Service的启动流程,从ContextWrapper的startService()方法开始,跨进程调用SystemService进程的ActivityManagerService的startService()方法,再到ActiveServices的realStartServiceLocked()方法,最终调用Service所在进程的ActivityThread的内部类ApplicationThread的scheduleCreateService()方法,创建Service实例并调用onCreate()方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

开启Service进程的主要类

android.content包的ContextWrapper类
android.content包的Context类
android.app包的ContextImpl类
android.app包的ActivityManager类
android.os包的ServiceManager类
android.os包的ServiceManagerNative类
android.os包的ServiceManagerProxy类(也在ServiceManagerNative中)

SystemService进程

com.android.server.am包的ActivityManagerService类
com.android.server.am包的ActiveServices类

创建Service的进程

android.app包的ActivityThread类内部类ApplicationThread类
android.app包的ActivityThread类内部类H类(Handler的子类)
android.app包的ActivityThread类

可先阅读Android Binder机制浅析APP进程和SystemServer进程通信会更好的理解其中的过程;

不考虑跨进程通信相关的类,主要使用的类其实只关注ContextImplActivityManagerServiceActiveServicesActivityThread

  • 开启Service的进程通过ContextImpl的startServiceCommon()方法,跨进程调用SystemService进程的ActivityManagerService的startService()方法;
  • 在SystemServer中通过层层跳转,调用ActiveServices的realStartServiceLocked()方法,跨进程调用Service所在进程的ActivityThread的内部类ApplicationThread的scheduleCreateService()方法;

SystemServer进程浅析

SystemServer进程是由Zygote进程孵化的第一个进程,大部分Android提供的服务都在该进程中,SystemServer中运行的进程公共有六十多种,主要包括:ActivityManagerService(AMS),WindowManagerService(WMS),PackagManagerService(PMS)等;这些系统服务都是以一个线程的方式存在SystemServer进程中。

ActivityManagerService简称AMS,它是android中很重要的一个服务,它统筹管理着android的四大组件,统一调度各应用进程。

ActivityThread管理应用进程的主线程的执行(相当于普通Java程序的main入口函数),并根据AMS的要求(通过IApplicationThread接口,AMS为Client、ActivityThread内部类ApplicationThread为Server)负责调度和执行activitiy、service、broadcast和其它操作。

开启Service的进程

ContextWrapper的startService()方法。

@Override
public ComponentName startService(Intent service) {
    return mBase.startService(service);
}

ContextImpl的startService()方法。

@Override
public ComponentName startService(Intent service) {
    warnIfCallingFromSystemProcess();
    return startServiceCommon(service, false, mUser);
}

ContextImpl的startServiceCommon()方法,通过跨进程通信调用SystemManagerService的startService()方法;

private ComponentName startServiceCommon(Intent service, boolean requireForeground,
        UserHandle user) {
  
    ComponentName cn = ActivityManager.getService().startService(
        mMainThread.getApplicationThread(), service, service.resolveTypeIfNeeded(
            getContentResolver()), requireForeground,
        getOpPackageName(), user.getIdentifier());
    
    return cn;
}

具体可参考APP进程和SystemServer进程通信
ActivityManager的getService():获取IActivityManager的对象;

public static IActivityManager getService() {
    return IActivityManagerSingleton.get();
}

//单例,创建IActivityManager的对象;
private static final Singleton<IActivityManager> IActivityManagerSingleton =
        new Singleton<IActivityManager>() {
            @Override
            protected IActivityManager create() {
                final IBinder b = ServiceManager.getService(Context.ACTIVITY_SERVICE);
                final IActivityManager am = IActivityManager.Stub.asInterface(b);
                return am;
            }
        };

ServiceManager类通过getService()获取IBinder对象,以及ServiceManagerNative和其内部类ServiceManagerProxy等Binder相关的内容,不深入展开,可自行深入理解。

public final class ServiceManager {

    private static IServiceManager sServiceManager;
    //缓存
    private static HashMap<String, IBinder> sCache = new HashMap<String, IBinder>();

    private static IServiceManager getIServiceManager() {
        if (sServiceManager != null) {
            return sServiceManager;
        }

        sServiceManager = ServiceManagerNative
                .asInterface(Binder.allowBlocking(BinderInternal.getContextObject()));
        return sServiceManager;
    }

    //获取对应的IBinder对象;
    public static IBinder getService(String name) {
        try {
            IBinder service = sCache.get(name);
            if (service != null) {
                return service;
            } else {
                return Binder.allowBlocking(getIServiceManager().getService(name));
            }
        } catch (RemoteException e) {
            Log.e(TAG, "error in getService", e);
        }
        return null;
    }
}
SystemService进程

进程间通信,进而调用ActivityManagerService的startService()方法,该方法主要调用ActiveServices的startServiceLocked();

@Override
public ComponentName startService(IApplicationThread caller, Intent service,
        String resolvedType, boolean requireForeground, String callingPackage, int userId)
        throws TransactionTooLargeException {
  
    synchronized(this) {
        final int callingPid = Binder.getCallingPid();
        final int callingUid = Binder.getCallingUid();
        final long origId = Binder.clearCallingIdentity();
        ComponentName res;
        try {
            res = mServices.startServiceLocked(caller, service,
                    resolvedType, callingPid, callingUid,
                    requireForeground, callingPackage, userId);
        } finally {
            Binder.restoreCallingIdentity(origId);
        }
        return res;
    }
}

ActiveServices的startServiceLocked()方法,主要调用retrieveServiceLocked()方法;

ComponentName startServiceLocked(IApplicationThread caller, Intent service, String resolvedType,
        int callingPid, int callingUid, boolean fgRequired, String callingPackage, final int userId)
        throws TransactionTooLargeException {
  
    ServiceLookupResult res =
        retrieveServiceLocked(service, resolvedType, callingPackage,
                callingPid, callingUid, userId, true, callerFg, false);

    ComponentName cmp = startServiceInnerLocked(smap, service, r, callerFg, addToStarting);
    return cmp;
}

ActiveServices的startServiceInnerLocked(),主要调用bringUpServiceLocked()方法;

ComponentName startServiceInnerLocked(ServiceMap smap, Intent service, ServiceRecord r,
        boolean callerFg, boolean addToStarting) throws TransactionTooLargeException {
    ServiceState stracker = r.getTracker();
    
    String error = bringUpServiceLocked(r, service.getFlags(), callerFg, false, false);
    if (error != null) {
        return new ComponentName("!!", error);
    }
    return r.name;
}

ActiveServices的bringUpServiceLocked()中判断要启动的Service是否在单独的进程中;

  1. 在同一个进程中,调用realStartServiceLocked()方法;
  2. 在不同的进程中,调用ActivityManagerService的startProcessLocked(),通过Zygote进程孵化Service所在的进程;最后也会调用realStartServiceLocked()方法;
private String bringUpServiceLocked(ServiceRecord r, int intentFlags, boolean execInFg,
        boolean whileRestarting, boolean permissionsReviewRequired)
        throws TransactionTooLargeException {
	//判断要启动的Service是否在单独的进程中;
    final boolean isolated = (r.serviceInfo.flags&ServiceInfo.FLAG_ISOLATED_PROCESS) != 0;
    final String procName = r.processName;
    String hostingType = "service";
    ProcessRecord app;

    //在同一个进程中;
    if (!isolated) {
        app = mAm.getProcessRecordLocked(procName, r.appInfo.uid, false);
        if (app != null && app.thread != null) {
            try {
                app.addPackage(r.appInfo.packageName, r.appInfo.versionCode, mAm.mProcessStats);
                realStartServiceLocked(r, app, execInFg);
                return null;
            }
        }
    } else {
        //如果Service运行在单独的进程中(和开启Service的进程不同),则调用tartProcessLocked()得到一个新的进程;
    }

    if (app == null && !permissionsReviewRequired) {
        //startProcessLocked()通过Zygote进程孵化Service所在的进程;
        if ((app=mAm.startProcessLocked(procName, r.appInfo, true, intentFlags,
                hostingType, r.name, false, isolated, false)) == null) {
            bringDownServiceLocked(r);
            return msg;
        }
        if (isolated) {
            r.isolatedProc = app;
        }
    }
    return null;
}

ActiveServices的realStartServiceLocked()方法主要做两件事:

  1. 调用IApplicationThread的scheduleCreateService()方法,回到创建Service进程中,调用ActivityThread的内部类ApplicationThread的scheduleCreateService()方法;
  2. 调用sendServiceArgsLocked(),该方法中最后也是调用ActivityThread的内部类ApplicationThread的scheduleServiceArgs()方法;
private final void realStartServiceLocked(ServiceRecord r,
        ProcessRecord app, boolean execInFg) throws RemoteException {
    
    boolean created = false;
    try {
        app.thread.scheduleCreateService(r, r.serviceInfo,
                mAm.compatibilityInfoForPackageLocked(r.serviceInfo.applicationInfo),
                app.repProcState);
        created = true;
    } catch (DeadObjectException e) {
        Slog.w(TAG, "Application dead when creating service " + r);
        mAm.appDiedLocked(app);
        throw e;
    } finally {
    }
    
    sendServiceArgsLocked(r, execInFg, true);
}

ActiveServices的sendServiceArgsLocked(),最后调用ActivityThread的内部类ApplicationThread的scheduleServiceArgs()方法;

private final void sendServiceArgsLocked(ServiceRecord r, boolean execInFg,
        boolean oomAdjusted) throws TransactionTooLargeException {
    try {
        r.app.thread.scheduleServiceArgs(r, slice);
    } catch (TransactionTooLargeException e) {
    }
}
创建Service的APP进程

ActivityThread的内部类ApplicationThread的scheduleCreateService()方法,发送Handler消息;在ActivityThread的内部类H(Handler的子类)的handleMessage中调用ActivityThread的handleCreateService()方法

public final void scheduleCreateService(IBinder token,
        ServiceInfo info, CompatibilityInfo compatInfo, int processState) {
    updateProcessState(processState, false);
    CreateServiceData s = new CreateServiceData();
    s.token = token;
    s.info = info;
    s.compatInfo = compatInfo;
	//发送Handler消息;handleMessage中调用handleCreateService();
    sendMessage(H.CREATE_SERVICE, s);
}

ActivityThread的内部类ApplicationThread的scheduleServiceArgs()

public final void scheduleServiceArgs(IBinder token, ParceledListSlice args) {
    List<ServiceStartArgs> list = args.getList();

    for (int i = 0; i < list.size(); i++) {
        ServiceStartArgs ssa = list.get(i);
        ServiceArgsData s = new ServiceArgsData();
        s.token = token;
        s.taskRemoved = ssa.taskRemoved;
        s.startId = ssa.startId;
        s.flags = ssa.flags;
        s.args = ssa.args;
		//发送Handler消息;handleMessage中调用handleCreateService();
        sendMessage(H.SERVICE_ARGS, s);
    }
}

ActivityThread的handleCreateService()方法创建对应Service的实例,调用Service的onCreate()方法;

private void handleCreateService(CreateServiceData data) {
   
    LoadedApk packageInfo = getPackageInfoNoCheck(
            data.info.applicationInfo, data.compatInfo);
    Service service = null;
    //通过反射创建对应Service的实例;
    try {
        java.lang.ClassLoader cl = packageInfo.getClassLoader();
        service = (Service) cl.loadClass(data.info.name).newInstance();
    } catch (Exception e) {  
        throw new RuntimeException( "Unable to instantiate service ");
    }

    try {
        if (localLOGV) Slog.v(TAG, "Creating service " + data.info.name);
		//创建ContextImpl实例;
        ContextImpl context = ContextImpl.createAppContext(this, packageInfo);
        context.setOuterContext(service);

        Application app = packageInfo.makeApplication(false, mInstrumentation);
        //调用Service的attach()方法;
        service.attach(context, this, data.info.name, data.token, app,
                ActivityManager.getService());
        //调用Service的onCreate()方法;
        service.onCreate();
        //将Service保存到ArrayMap<IBinder, Service> mServices中;
        mServices.put(data.token, service);
    } catch (Exception e) {
        throw new RuntimeException("Unable to create service ");
    }
}

ActivityThread的handleServiceArgs()方法根据IBinder获取Service实例,调用Service的onStartCommand()方法;

private void handleServiceArgs(ServiceArgsData data) {
    //根据IBinder获取对应的Service实例;
    Service s = mServices.get(data.token);
    if (s != null) {
        try {
            int res;
            if (!data.taskRemoved) {
                //调用Service的onStartCommand()方法;
                res = s.onStartCommand(data.args, data.flags, data.startId);
            }
        } catch (Exception e) {
            throw new RuntimeException("Unable to start service " + s + " with ");
        }
    }
}

以上就是startService的主要流程,binderService、stopService和unbindService的主要流程和startService的流程基本类似,如有问题,请多指教,谢谢!

<think>好的,我现在需要帮助用户了解Service的启动流程,特别是Android中的Service。用户提到了一些引用内容,看起来和Android的Service启动流程、ElasticSearch的启动以及一些初始化步骤有关。我需要先理清用户的需求,他们可能是在Android开发中遇到了Service启动的问题,想要一个详细的流程图解析和步骤说明。 首先,用户提供的引用[1]和[2]是关于Android Service的启动流程。引用[1]提到通过context.startService启动Service,引用[2]详细描述了从应用进程到AMS的交互过程。这部分应该是重点,因为用户的问题直接相关。而引用[3]、[4]、[5]可能涉及其他系统或服务的启动流程,比如ElasticSearch和BlobCacheService的初始化,但用户的问题集中在Service上,所以可能需要忽略或次要处理这些内容。 接下来,我需要按照系统级指令的要求来组织回答。必须使用中文,行内数学表达式用$...$,独立公式用$$...$$,不过在这个问题中可能用不上太多数学公式,但需要确保LaTeX正确。然后生成相关问题,并在回答中正确添加引用标识。 用户的需求是了解Service启动流程的图解和初始化步骤。根据引用[2],Android Service的启动流程涉及应用进程、AMS、Zygote进程等。需要分步骤解释每个阶段的关键操作,比如应用进程发送请求、AMS的处理、进程创建Service创建生命周期回调等。可能需要将流程分成几个步骤,并配以流程图说明。 同时,要注意引用标注的正确位置。例如,在提到AMS处理的部分,末尾需要添加[^2]。另外,用户示例中的代码块是用Python,但这里涉及的是Android,可能需要用Java或Kotlin代码示例,但用户没有提供具体代码,所以可能不需要代码块,但需要流程图描述。 然后需要生成相关问题,这些问题应该与Service启动流程相关,比如优化方法、生命周期、与绑定启动的区别等。确保问题符合用户可能进一步询问的方向。 现在需要组织回答的结构,首先概述Service启动流程,然后分步骤详细说明,每个步骤引用对应的引用内容,最后生成相关问题。同时,确保语言简洁,结构清晰,符合用户可见层的要求,帮助用户逐步理解。 需要注意的是,用户提供的引用中有部分可能不直接相关,比如ElasticSearch和BlobCacheService的初始化,但引用[2]是最相关的,需要重点参考。另外,要确保回答中的引用标识正确对应,例如引用[2]对应AMS流程,引用[1]对应startService方法。 总结步骤: 1. 概述Service启动流程的重要性。 2. 分步骤详细描述流程:应用进程请求、AMS处理、进程创建Service创建生命周期回调。 3. 结合流程图解释各步骤的关系。 4. 添加相关问题,如优化、生命周期管理、与其他启动方式的区别等。 在写作过程中,要检查是否符合所有系统级指令,特别是引用标注和格式要求。确保每个引用只在相关部分标注,例如当提到AMS处理时标注,提到context.startService时标注[^1]。</think>### Service启动流程解析 #### 1. 应用进程发起启动请求 通过调用`context.startService(Intent)`向Android系统发起服务启动请求。此时系统将启动请求转发给ActivityManagerService(AMS)。 #### 2. AMS处理请求 AMS执行以下关键操作: - **合法性检查**:验证Service是否在AndroidManifest.xml中声明。 - **进程状态判断**:若目标Service所属的进程未启动,AMS请求Zygote创建新进程,并初始化主线程(`ActivityThread.main()`)。 - **延迟启动判断**:根据系统负载决定是否延迟启动。 #### 3. Service实例创建Service尚未创建,AMS触发以下流程: - **进程初始化**:新进程通过`ActivityThread`加载应用资源。 - **生命周期回调**:调用`onCreate()`完成Service初始化。 #### 4. 执行启动命令 AMS将启动参数(如Intent)传递给应用进程,触发`onStartCommand()`,完成服务启动。 #### 流程图 ``` 应用进程 → AMS → Zygote(创建进程) → ActivityThread初始化 → Service.onCreate() → Service.onStartCommand() ``` ### 关键点说明 - **跨进程通信**:应用进程与AMS通过Binder机制交互。 - **生命周期顺序**:首次启动时先执行`onCreate()`再执行`onStartCommand()`;多次启动仅重复执行`onStartCommand()`。 - **进程优先级**:Service所在进程的优先级会提升,降低被系统回收的概率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值