浏览 5292 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2011-05-04
最后修改:2011-05-04
在系统启动的时候,会做一系列初始化的工作包括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。
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2011-05-12
问一下楼主,如何手动启动一个自己写的服务呢?看了些代码都是用广播监听来开机启动的,我如何手动启动一个服务,难道要在activity里写一个intent?
|
|
返回顶楼 | |
发表时间: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广播事件,是为了激活后台服务。不是很明白你所说的手动启动时啥意思? |
|
返回顶楼 | |
发表时间: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); } 如果说广播监听是广播这个类被实例后才能监听的,那怎么监听系统开机的广播呢?开机前不可能实例好广播的这个类的吧 |
|
返回顶楼 | |
发表时间: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.你的监听事件是为了启动一个新的服务,而不是为了监听某一个服务所发出的事件。 ====该没什么问题了吧。我两说的不是一回事了,呵呵 |
|
返回顶楼 | |
发表时间:2011-05-18
ishelf 写道 1.监听特定事件需要相关的服务广播该事件,也就是说相关服务要启动(你的.MybootReceiver肯定是在ActivityManagerService之后启动的)。如果是activity的话,也可以广播事件,不过生命周期有限,不能一直跑在后台,可能我在解释的时候没有提及activity所以导致误解。 2.你的Receiver只能说明你可以监听到boot完成的事件,怎么可以自启动呢。 3.你的监听事件是为了启动一个新的服务,而不是为了监听某一个服务所发出的事件。 ====该没什么问题了吧。我两说的不是一回事了,呵呵 谢~谢~楼~主啊~你的帖子促使我已经搞明白广播、启动服务、自定义广播,自动启动服务这些相关知识,不过我在真机上测试,xml配置的receiver是可以监听到boot完成的广播,然后启动我的服务的,从而达到开机自动启动服务的目的 |
|
返回顶楼 | |