需求分析
- ForeGroundService.
阅读材料1:
材料链接
具体实现
foreground service是用来指示一些客户明了的Service,当系统内存不足时不会被回收。但是foreground service必须在状态栏提供notification,这个notification必须一直保持。
例如音乐播放器可以使用foreground service,然后在notification中显示当前的歌曲等信息,并且可以在notification中和音乐播放器进行交互,例如选择下一首歌等。代码如下:
Notification notification = new Notification(R.drawable.icon, getText(R.string.ticker_text),
System.currentTimeMillis());
Intent notificationIntent = new Intent(this, ExampleActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);
notification.setLatestEventInfo(this, getText(R.string.notification_title),
getText(R.string.notification_message), pendingIntent);
startForeground(ONGOING_NOTIFICATION, notification);
设计分析
startService和bindService的主要区别应该是bindService绑定后与service通信是在调用的Activity里面重写OnServiceConnected,service与用户不能进行直接的交互。
在上面的Service使用中,参考使用下面的Notification。
详细介绍了Notifcation中各个参数的使用。在这个中间涉及到Notification的尺寸的图片尺寸。SmallIconSize
You should check to see that your small icon follows the UX guidelines for icon size. Small icons are limited to 24x24dp.
大图片尺寸可以通过命令获取,得到宽高均为64dp。
int width = (int) getResources().getDimension(android.R.dimen.notification_large_icon_width);
int height = (int) getResources().getDimension(android.R.dimen.notification_large_icon_height);
6.1 查看模拟器的端口如5554。
telnet localhost 5554
6.2 使用命令调节电量。
power capacity 81
其他的power的子命令如下
display display battery and charger state
ac set AC charging state
status set battery status
present set battery present state
health set battery health state
capacity set battery capacity state
在发送Notifcation 过程中,因为使用了定时更新进度的方法,需要考虑怎样update。后来发现其实主要是进行builder的重写,重写完成后,manager去notify就可以了。这里需要注意的是我们已经使用那个startForeground调用notification去保证这个service不被轻易kill,所以使用过一次notification了,这里只要把builder重新设置值,然后用notifcationManger去update就可以。
重复notify为了开机自启动,可以使用如下链接中提供的方法,在启动的时候用广播接收器启动service.
开机自启动
阅读源材料1
- 其中第三点提到了 vold server
三、 vold server分析
1、在 system/vold/NetlinkManager.cpp中:
2、然后在 system/vold/NetlinkHandler.cpp的 NetlinkHandler::onEvent中处理
3、在 system/core/libsysutils/src/NetlinkListener.cpp中监听
针对Vold Server找到如下链接,其中就提到这个volume daemon是守护进程。链接中给出的文章详细介绍了热插拔的流程。材料
- 然后第四点提到了battery server的分析。
2.1 BatteryService.java就是我们主要要完成的service,该service一开始就被加入到了system_process中,而我们的需求是自己编写一个batteryservice练习。
2.2 其中这些数据是从底层JNI(com_android_server_BatteryService.cpp)来读取数据。
2.3 BatteryService把电池的信息通过intent广播发送出去。
2.4 需要处理这个电池信息,只需要注册广播接收器,接受这个电池变化的信息。
2.5系统会不断的UEvent来发送信息。