Android FileObserver里的一些坑

最近在做的东西,也就是在android上搭建一个PHP服务器,然后通过Browser端对手机进行一些简单(复杂)控制。

这个数据/控制流程就是Browser<=>Android Http Server<=>Android App

初步的构想就是使用网上的开源服务器方案,由lighttpd+php+sqlite来搭建一个完整的服务器环境。

因为打算先写个Demo进行尝试,所以没有将服务器直接编译并嵌到Android系统之中,而是直接安装了一个名为KSWEB的App,进行搭建(无需root权限。。

WEB前端跟后端,就是正常的HTML、JS、JQuery、CSS、PHP什么的,跟正常的WEB开发没什么区别。

由于,需求是把Android手机变成一台无线路由器+服务器(硬件设计跟咱没有半毛钱关系),所以一开始WEB端就是把这东西,当作路由器WEB控制面板来设计就对了。

前端UI使用了Bootstrap框架来做,已经做了简单的自适应

WEB前后端的东西,因为只是初步做个Demo,写了100多行的东西就OK了。。。。。使用json进行数据交换,使用AJAX。

然后就是手机端了,通过浏览器端传入数据到JSON之后,就要使用手机的APP来进行控制了,之前也有想过能不能通过服务器,直接透过后端脚本把一些数据写入手机系统的配置文件里面,后面考虑了下,好像不太妥,而且有些功能也没法透过配置文件来实现。所以还是需要一个App来作为控制端,从而获得更强的手机控制能力。

在App端,为了实时接收到来自服务器端的控制信息和一些数据,就需要使用到Android开发框架中的FileObserver(使用了Linux的Inotify机制,貌似实时性很好也不怎么影响性能)这个类来对数据文件变化进行监控。

FileObserver的用法,网上一搜一大把,估计也不用我重复详细讲。

总的来说,FileObserver是一个抽象类,需要自己构造一个类并继承实现,两个构造函数需要简单覆写,onEvent这个函数,自己实现,从而达到监控文件的不同变化情况。

因为要一直保持监控,所以最好是使用一个service(不依赖于Activity生命周期,即使应用退出了,如果没有调用stopService或stopSelf,Service是不会退出的,除非被Low memory killer干掉)来进行监控,FileObserver本身是通过一个独立线程实现的,切入到它的实现源码里边可以看到它的实现就是一个Thread,并有一个无限循环结构,不停地在监控文件的变化情况。

不过,老实说FileObserver刚用起来被坑了半天,怎么跑都不出结果,可能是自己有点二了。咱就说一下,自己遇到的问题。

1、记得要给写入/读入存储的权限。。。。。不明白为什么,看了很多资料,大多都没有提这一点,还好后面发现有人说到这一点,难道大家都已经知道了么?或是不用权限,也能正常运作?至少我自己写的Demo不给权限是不行的。Android 6.0之后,储存的管理机制变得更为复杂了,要么自己进设置里面手动给App权限,要么就通过代码提示用户给予适当的权限,特别是读写存储这类“特受照顾”的权限。反正咱不管三七二十一,都给它加上先。

<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

2、监控的时候,有些事件会重复刷几次(这个应该是文件操作事件的问题),所以一定要清楚自己监控的是什么事件,并且发生在什么过程中。

好了,没了。 咱准备重新写Blog了,懒了N久,这个“N久”好像有点久。

Leave a Reply

Your email address will not be published. Required fields are marked *