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。