`
ishelf
  • 浏览: 106348 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

SystemServer Serivce 启动 与 获取 (addService ,checkService )

阅读更多

      在系统启动的时候,会做一系列初始化的工作包括service的创建。所以要了解系统中有多少种类的服务,每一类的服务都是如何实现的,这是一个最好的入口。这就直接从代码入手进行解析:

      转载请注明(http://ishelf.iteye.com/blog/1027886

      首先在SystemServer的run方法中,有如下代码

 

            try {
                Slog.i(TAG, "Input Method Service");
                imm = new InputMethodManagerService(context, statusBar);
                ServiceManager.addService(Context.INPUT_METHOD_SERVICE, imm);
            } catch (Throwable e) {
                Slog.e(TAG, "Failure starting Input Manager Service", e);
            }

            try {
                Slog.i(TAG, "NetStat Service");
                ServiceManager.addService("netstat", new NetStatService(context));
            } catch (Throwable e) {
                Slog.e(TAG, "Failure starting NetStat Service", e);
            }

            try {
                Slog.i(TAG, "NetworkManagement Service");
                ServiceManager.addService(
                        Context.NETWORKMANAGEMENT_SERVICE, new NetworkManagementService(context));
            } catch (Throwable e) {
                Slog.e(TAG, "Failure starting NetworkManagement Service", e);
            }

 

 

       如上所示,这段代码是在启动bootanim(setprop("ctl.start","bootanim"))服务时通过系统命令启动的,主要功能就是启动常驻android的所有后台服务,例如T卡服务、包解析服务、wifi服务、蓝牙服务等等。在addService方法中第一个参数表示该服务的名称,第二个参数表示该服务的类(Ibinder的子类)。接下来的问题就是服务已经启动了,可是如何在其他的地方调用这些服务并作出相应的动作,例如在关机过程中要UnMount sd卡等。

      这里需要使用到ServiceManager类,先给出调用代码

 

        final IBluetooth bluetooth =
                IBluetooth.Stub.asInterface(ServiceManager.checkService(
                        BluetoothAdapter.BLUETOOTH_SERVICE));
        try {
            bluetoothOff = bluetooth == null ||
                           bluetooth.getBluetoothState() == BluetoothAdapter.STATE_OFF;
            if (!bluetoothOff) {
                bluetooth.disable(false);  // disable but don't persist new state
            }
        } catch (RemoteException ex) {
            bluetoothOff = true;
        }

       方法checkService的参数就是addService中设置的对应service的名称,例如要获取蓝牙耳机的service,需要BluetoothA2dpService.BLUETOOTH_A2DP_SERVICE,而对应的Ibinder类则是IBluetoothA2dp。

 

 

 

 

 

 

 

 

分享到:
评论
5 楼 busiying119 2011-05-18  
ishelf 写道

1.监听特定事件需要相关的服务广播该事件,也就是说相关服务要启动(你的.MybootReceiver肯定是在ActivityManagerService之后启动的)。如果是activity的话,也可以广播事件,不过生命周期有限,不能一直跑在后台,可能我在解释的时候没有提及activity所以导致误解。
2.你的Receiver只能说明你可以监听到boot完成的事件,怎么可以自启动呢。
3.你的监听事件是为了启动一个新的服务,而不是为了监听某一个服务所发出的事件。


====该没什么问题了吧。我两说的不是一回事了,呵呵

谢~谢~楼~主啊~你的帖子促使我已经搞明白广播、启动服务、自定义广播,自动启动服务这些相关知识,不过我在真机上测试,xml配置的receiver是可以监听到boot完成的广播,然后启动我的服务的,从而达到开机自动启动服务的目的
4 楼 ishelf 2011-05-17  
busiying119 写道
[quote="ishelf广播监听事件是服务启动后才能监听的,前提是服务已经启动了.....如果是框架内的话,在systemserver中加载就可以了
   Slog.i(TAG, "Input Method Service");  
    imm = new InputMethodManagerService(context, statusBar);  
    ServiceManager.addService(Context.INPUT_METHOD_SERVICE, imm);  



那下面这种xml配置的方式是不是也可以开机自动启动服务呢?
<receiver android:name=".MyBootReceiver">  
            <intent-filter>  
                <action android:name="android.intent.action.BOOT_COMPLETED" />  
            </intent-filter>  
        </receiver>


    public void onReceive(Context arg0, Intent arg1) {   
       // 启动服务   
        Intent service = new Intent(arg0, MyService.class);   
       arg0.startService(service);   
    } 

如果说广播监听是广播这个类被实例后才能监听的,那怎么监听系统开机的广播呢?开机前不可能实例好广播的这个类的吧




1.监听特定事件需要相关的服务广播该事件,也就是说相关服务要启动(你的.MybootReceiver肯定是在ActivityManagerService之后启动的)。如果是activity的话,也可以广播事件,不过生命周期有限,不能一直跑在后台,可能我在解释的时候没有提及activity所以导致误解。
2.你的Receiver只能说明你可以监听到boot完成的事件,怎么可以自启动呢。
3.你的监听事件是为了启动一个新的服务,而不是为了监听某一个服务所发出的事件。


====该没什么问题了吧。我两说的不是一回事了,呵呵
3 楼 busiying119 2011-05-17  
[quote="ishelf广播监听事件是服务启动后才能监听的,前提是服务已经启动了.....如果是框架内的话,在systemserver中加载就可以了
   Slog.i(TAG, "Input Method Service");  
    imm = new InputMethodManagerService(context, statusBar);  
    ServiceManager.addService(Context.INPUT_METHOD_SERVICE, imm);  



那下面这种xml配置的方式是不是也可以开机自动启动服务呢?
<receiver android:name=".MyBootReceiver">  
            <intent-filter>  
                <action android:name="android.intent.action.BOOT_COMPLETED" />  
            </intent-filter>  
        </receiver>


    public void onReceive(Context arg0, Intent arg1) {   
       // 启动服务   
        Intent service = new Intent(arg0, MyService.class);   
       arg0.startService(service);   
    } 

如果说广播监听是广播这个类被实例后才能监听的,那怎么监听系统开机的广播呢?开机前不可能实例好广播的这个类的吧
2 楼 ishelf 2011-05-12  
busiying119 写道
问一下楼主,如何手动启动一个自己写的服务呢?看了些代码都是用广播监听来开机启动的,我如何手动启动一个服务,难道要在activity里写一个intent?


广播监听事件是服务启动后才能监听的,前提是服务已经启动了.....如果是框架内的话,在systemserver中加载就可以了
   Slog.i(TAG, "Input Method Service");  
    imm = new InputMethodManagerService(context, statusBar);  
    ServiceManager.addService(Context.INPUT_METHOD_SERVICE, imm);  



在activity中使用intent广播事件,是为了激活后台服务。不是很明白你所说的手动启动时啥意思?
1 楼 busiying119 2011-05-12  
问一下楼主,如何手动启动一个自己写的服务呢?看了些代码都是用广播监听来开机启动的,我如何手动启动一个服务,难道要在activity里写一个intent?

相关推荐

    android系统从systemserver开始的launcher启动详细流程.doc

    Android 系统从 SystemServer 开始的 Launcher 启动详细流程 Android 系统启动流程是一个复杂的过程,从 SystemServer 开始到 Launcher 的启动涉及到多个组件和服务的协作。本文将详细介绍 Android 系统从 ...

    Android启动-SystemServer的启动过程介绍

    Android启动,第三阶段,SystemServer创建。 紧接上两篇《 Android启动-init介绍》和《Android启动-Zygote启动介绍》Linux内核启动之后,执行第一个进程 Init--&gt;init创建Zygote--&gt;fork出SystemServer。 这里...

    Zygote启动流程-systemServer启动流程-homeLauncher启动

    通过对Zygote启动流程以及systemServer和Home Activity启动过程的详细解析,我们不仅了解了Android系统启动过程中的关键步骤和技术细节,还深入了解了ART虚拟机的工作原理。这些深入的理解对于开发者来说至关重要,...

    SystemServer启动阶段思维示意图

    SystemServer启动阶段思维示意图

    Android 8.1zygote服务 SystemServer启动流程 Activity创建

    Android zygote服务/SystemServer启动流程/Activity创建,本文档继承Android init的分析,继续往下分析Zygote进程、SystemServer进程的创建、Activity的建立

    android系统从systemserver开始的launcher启动详细流程

    - **创建ActivityManagerService实例**:在`SystemServer`启动时,会创建`ActivityManagerService`的实例。 - **创建ActivityThread实例,获取全局Context**:`ActivityManagerService`通过调用`ActivityThread`的...

    android系统从init进程开始到systemserver启动详细流程

    ### Android系统从init进程开始到systemserver启动详细流程 #### 1. 概述 在Android系统的启动过程中,从Linux内核加载完成后,系统将执行第一个用户空间进程——`init`进程,它作为后续所有进程的父进程。`init`...

    System Server启动

    本文将详细解析`SystemServer`的启动过程,特别是它与其他普通进程的区别,以及内部是如何启动和管理各种系统服务的。 #### 二、启动过程 ##### 2.1 启动入口 `SystemServer`进程的启动是由`ZygoteInit.java`中的...

    Android 启动过程详解

    2. **Android服务启动**:SystemServer启动后,会依次启动一系列重要的Android服务,如`ActivityManagerService`、`WindowManagerService`、`PackageManagerService`等。 3. **Home应用启动**:一旦SystemServer及其...

    android开机启动流程

    一旦`SystemServer` 启动完成,`ActivityManagerService` 会启动默认的主屏幕应用,用户就可以开始与系统交互了。 ### 结论 通过上述分析,我们可以看出Android系统的启动流程是一个复杂而有序的过程,涉及到多个...

    Android 启动流程分析

    SystemServer由Zygote孵化,启动时会进行一系列的初始化工作,包括启动Activity Manager Service(AMS)、Window Manager Service(WMS)和Content Provider等核心服务。 AMS负责管理所有应用程序的活动堆栈,控制...

    Android Launch Process(安卓系统启动过程)

    - **ActivityManagerService的启动**:SystemServer还会启动ActivityManagerService,它是负责管理应用程序活动生命周期的关键组件。 #### 六、ActivityManagerService - **职责**:ActivityManagerService负责...

    android GPS架构之GPS的开启与关闭

    在 SystemServer.java 中看不到循环结构,只是可以看到建立了 init2 的实现函数,建立了一大堆服务,并 AddService 到 service Manager。 八、小结 Android GPS 架构中的 GPS 开启与关闭需要了解普通应用程序启动 ...

    AMS启动流程源码分析

    1. 启动 SystemServer:使用 `SystemServer` 类启动系统服务。 2. 启动系统服务:使用 `SystemService` 类启动系统服务,例如网络服务、电话服务等。 在 StartServices 阶段,AMS 还会执行一些其他操作,例如: 1....

    Android_开机启动流程

    - 系统启动完成后,`SystemServer`会调用`ActivityManagerNative.getDefault().systemReady()`来通知`ActivityManager`,表明系统启动成功。`ActivityManager`会设置变量`mBooting`,并通知其内部的另一条线程。这...

Global site tag (gtag.js) - Google Analytics