ContentObserver可以监听不同程序间指定uri或者cursor内容的变化,如果两个无网络连接的设备通过OTG线相连,并且两设备可以通过U盘路径的方式相互访问存储,那么两设备的不同应用通信可以尝试通过FileObserver或者ContentObserver来进行,本文主要讲解FileObserver。
FileObserver是一个抽象类,可以创建FileObserver一个子类并且重写onEvent抽象方法来实现功能逻辑。
android10(sdk版本29)之前,FileObserver有两个构造函数
public FileObserver(String path) {
this(path, ALL_EVENTS);
}
public FileObserver(String path, int mask) {
m_path = path;
m_mask = mask;
m_descriptor = -1;
}
android10开始,上面有路径参数的构造函数被废弃掉,新增了以文件和文件集合为参数的构造方法。这里需要区分当前设备版本去有效的调用路径或者文件的构造函数,否则低版本找不到相应的构造函数导致应用挂掉。
public FileObserver(@NonNull File file, @NotifyEventType int mask) {
this(Arrays.asList(file), mask);
}
public FileObserver(@NonNull List<File> files, @NotifyEventType int mask) {
mFiles = files;
mMask = mask;
}
实例代码:
public class MyFileObserver extends FileObserver {
private static final String TAG = "MyFileObserverLog";
public MyFileObserver(File file) {
super(file.getAbsolutePath(), FileObserver.ALL_EVENTS);
Log.d(TAG, "MyFileObserver: "+file.getAbsolutePath()+",,"+FileObserver.ALL_EVENTS);
}
@Override
public void onEvent(int event, String path) {
Log.d(TAG, "onEvent path:"+ path+",event="+event);
switch (event){
case FileObserver.CREATE:
break;
}
}
}
public class MainActivity extends AppCompatActivity {
MyFileObserver myFileObserver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)!= PackageManager.PERMISSION_GRANTED) {
requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},22);
}
myFileObserver=new MyFileObserver(new File("/sdcard/test.txt")) ;
myFileObserver.startWatching();
FileProvider.getUriForFile()
}
@Override
protected void onDestroy() {
myFileObserver.stopWatching();
super.onDestroy();
}
}
修改文件内容,log打印如下,可以过滤对自己有用的event即可
2020-04-03 18:24:11.977 6173-6209/com.adups.myapplication D/MyFileObserverLog: onEvent path:null,event=2
2020-04-03 18:24:11.977 6173-6209/com.adups.myapplication D/MyFileObserverLog: onEvent path:null,event=32
2020-04-03 18:24:12.040 6173-6209/com.adups.myapplication D/MyFileObserverLog: onEvent path:null,event=2
2020-04-03 18:24:12.043 6173-6209/com.adups.myapplication D/MyFileObserverLog: onEvent path:null,event=2
2020-04-03 18:24:12.046 6173-6209/com.adups.myapplication D/MyFileObserverLog: onEvent path:null,event=8
上面日志对应id
public static final int MODIFY = 0x00000002;
public static final int OPEN = 0x00000020;
public static final int CLOSE_WRITE = 0x00000008;
谷歌推荐为了保证FileObserver不被垃圾回收,最好将FileObserver保定在一个长生命周期对象上,比如sevice,或者Application。