`
ishelf
  • 浏览: 105297 次
  • 性别: 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的启动过程介绍

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

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

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

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

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

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

    介绍android系统启动第二阶段,即init进程开始到systemserver启动详细流程

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

    zygote启动流程源码分析, 文件包含zygote systemService activityManager启动homeLauncher. 因为本地文字较长 不方便写blog发布 所以上传一下文档

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

    介绍android系统启动第三阶段,即launcher的详细启动流程

    Android系统-源码阅读-系统启动流程笔记

    Android系统启动流程源码分析; init进程的启动; 各个守护进程的启动; Zygote的启动; SystemServer的启动;

    System Server启动

    System Server启动

    Android启动-init启动介绍

    Linux内核启动之后,执行第一个进程 Init,init会启动本地服务,创建Zygote进程,并最终到达systemserver,systemserver再往上启动framework层相关服务和进程,启动launcher等完成整个开机流程。Android启动研究就从这里...

    android_wifi 从java层到wifi.c

    通过ServiceManager.addService启动了ConnectivityService,在android系统里面我们常见的属于Connectivity的有 wifi,mobile,bluetooth,wimax,ethernet。 &lt;framework/base/services/java/...

    Android 框架开发视频

    Android启动模式init启动分析init脚本执行和进程守护android服务davlink启动Zygote剖析system_server启动zygote_load系统资源分析及优化开机界面分析systemserver ServiceManager packageMangerService Android...

    Android_启动过程分析

    3. Zygote-Mode,Zygote 启动完SystemServer 后,进入Zygote Mode,在Socket 等候命令。随后,使用者将看到一个桌面环境(Home Screen)。桌面环境由一个名为[Launcher]的应用程序负责提供。 注:Zygote干嘛用的?...

    Android开机启动的那些事

    以前知道AMS、PMS这些概念及其功能,开发的过程中也会...装载与启动Linux内核 启动Android系统 其中启动Android系统过程又有以下过程: 启动Init进程 启动Zygote 启动SystemServer 启动Launcher android启动过程图示:

    探索Android FrameWork底层开发视频全套

    15.android服务介绍与davlink启动 16.Zygote剖析与system_server启动 17.Zygote创建APP分析 18.zygote_load系统资源分析及优化 19.开机界面分析 20.systemserver服务分析 21.ServiceManager服务分析 22....

    Android 启动流程分析

    android启动流程文档,Zygote,SystemServer分析,希望对大家有帮助

    《深入理解Android》卷Ⅱ

    2.2.3 addService实例分析 2.2.4 Java层Binder架构总结 2.3 心系两界的MessageQueue 2.3.1 MessageQueue的创建 2.3.2 提取消息 2.3.3 nativePollOnce函数分析 2.3.4 MessageQueue总结 2.4 本章小结 第3章 ...

    Android启动流程分析

    Android启动流程分析,对于Android只是触及皮毛的我,看到: init、ServiceManger、Zygote、SystemServer这些东东,完全联系不起来,总之是支离破碎呀! 下面我来梳理梳理自己那满天飞的思绪

    android从bootloader到launcher启动流程整理

    讲述android 开机流程 从boot rom---bootloader---init--zygote---systemserver---ams 并附上自己整理的每个流程的流程图 ,清晰熟悉android 启动流程

    浅谈framework之ConnectivityService

    这篇文章,主要是对之前学习ConnectivityService的再一次回顾与加深理解,先写个草稿,后面优化。 2. 服务的启动 frameworks/base/services/java/com/android/server/SystemServer.java 在判断网络可用的情况下,...

    android Watchdog 实现剖析

    系统启动过程图: Framework层所有的Service都是运行在SystemServer进程中;SystemServer进程是由Zygote进程创建。 SystemServer进程启动分两个过程init1创建Service和进程状态对象;init2创建Framework层的Service...

Global site tag (gtag.js) - Google Analytics