2017-07-12 29 views
1

私はAndroidアプリを持っており、フォルダを監視したいと思います。私はサービスを作った(私は、ユーザーがアプリケーションを殺す場合でも、フォルダーをノンストップで監視したい)、私はインテントの余分にフォルダーのパスを入れた。このサービスでは、フォルダを監視し、フォルダ内にファイルが作成されるたびにイベントをトリガーするFileObserverがあります。問題は、イベントが決して引き起こされないということです。 何か間違っていますか?ありがとう!Androidサービスのフォルダを監視する

the documentation for FileObserverを引用
@Override 
public int onStartCommand(Intent intent, int flags, int startId){ 

    String mainFolder = intent.getStringExtra("mainFolder"); 

    Toast.makeText(getApplicationContext(), "Service start! Main folder is: " + mainFolder, Toast.LENGTH_LONG).show(); 

    FileObserver observer = new FileObserver(mainFolder) { 
      @Override 
      public void onEvent(int event, String path) { 
       if (path == null) { 
        return; 
       } 
       if (FileObserver.CREATE == event) { 
        Toast.makeText(getApplicationContext(), "This file was creted: " + path, Toast.LENGTH_LONG).show(); 

       } 
      } 
     }; 

    observer.startWatching(); 

    return START_REDELIVER_INTENT; 
} 

答えて

0

警告:FileObserverがガベージコレクトされた場合、それはイベントの送信を停止します。イベントを引き続き受信するには、他のライブオブジェクトからのFileObserverインスタンスへの参照を保持する必要があります。あなたはフィールドでそれを保持しますが、ローカル変数にされていないよう

あなたFileObserverインスタンスは、できるだけ早くonStartCommand()を返すようガベージコレクションの対象です。

また、サービスは永遠に実行されないことに注意してください。

+0

ありがとうございました!サービスは永遠に実行されていませんが、「START_REDELIVER_INTENTを返します。ステートメントはサービスを再開する必要があります。 –

+0

@AlexHash:はい、サービスはフォアグラウンドサービスではないため、Android 8.0以降では1分ほど実行されてから停止されます。 – CommonsWare

関連する問題