打算把平时阅读AOSP Camera源码的过程记录下,有些地方没有很精确的去揣摩,所以如果理解有误,烦请大家指出!
Camera Button启动APP,这个比较简单。原理就是当你长按Camera Button的时候,系统会发出一个Broadcast,所以APP只需要注册一个Receiver来接收这个broadcast message就好,当收到这个消息后就去启动APP。
直接用代码说明
Manifest当中有这段配置
<receiver android:name="com.android.camera.CameraButtonIntentReceiver"> <intent-filter> <action android:name="android.intent.action.CAMERA_BUTTON"/> </intent-filter> </receiver>
这个CameraButtonIntentReceiver中会去启动APP,但是它里面有个判断,先判断Hardware可不可以用,如果可以用,就去启动APP,不可以用就什么都不做,直接return掉。好处大概就是防止当你系统运行了很多指令之后,发现HW不可以用,尽早的把错误告诉用户,这是一个良好的程序设计思路。
这里需要关注的就是CameraHolder,它的作用级是保持一个android.hardware.Camera实例,并且记录有多少“用户”打开了android.hardware.Camera这个资源,从它的mUsers属性可以看出。
CameraHolder这个有个小小的特殊的地方,就是如果你有call它的keep方法,它会在你call它的release方法的时候短暂的保持android.hardware.Camera不被释放掉(这里是3秒),这时如果你再次调用open方法,就会节省一些不必要的开销。
这里开启的过程就不说了,比较简单明了。Receiver中一个startActivity就完成了。