FileObserver使用

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。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章