FileObserver在后台服务中调用时不会触发事件

时间:2018-05-17 15:40:50

标签: android service fileobserver

在Android中有关于FileObserver的回答问题,我正在关注它们,但我的代码仍然无效。我在这里发布我的代码,我正在尝试通过服务设置fileObserver,因此即使应用程序本身已关闭它也能正常工作。运行时,它调用DirectoryObserver构造函数,但添加或删除文件不会调用该事件

public class MainActivity extends AppCompatActivity
{
    private String sharedPreferencesKey = "IsThisFIrstTime";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);

    if (!preferences.contains(sharedPreferencesKey)) {
        SharedPreferences.Editor editor = preferences.edit();
        editor.putBoolean(sharedPreferencesKey, false);
        editor.apply();

        try {
            startTheServices();
        }
        catch (Exception ex) {
        }
    }

    setContentView(R.layout.activity_main);
}

private void startTheServices()
{
    Intent intent = new Intent(this, BackgroundServices.class);
    startService(intent);
}
}



public class BackgroundServices extends Service {

@Override
public void onCreate(){
    super.onCreate();
    Toast.makeText(this, "This is on Create", Toast.LENGTH_LONG).show();


}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    Toast.makeText(this, "This is on onStartCommand", Toast.LENGTH_LONG).show();
     Thread thread = new Thread(new ThreadClass(startId));
    thread.start();
    return super.onStartCommand(intent, flags, startId);
    //return START_STICKY;
}

@Override
public void onDestroy(){
    super.onDestroy();
}

@Nullable
@Override
public IBinder onBind(Intent intent) {
    return null;
}


final class ThreadClass implements Runnable {
    int _serviceId;

    ThreadClass(int serviceId) {
        _serviceId = serviceId;
    }

    @Override
    public void run() {
        DirectoryObserver directoryObserver = new DirectoryObserver(new File(Environment.getExternalStorageDirectory(), Constants.Camera_Directory).getAbsolutePath(), getApplicationContext());
        directoryObserver.startWatching();
    }
}
}





public class DirectoryObserver extends FileObserver {
    private static final String TAG = "DIRECTORY_OBERSVER";
    private String directoryPath;
    private Context _context;

public DirectoryObserver(String path, Context context) {
    super(path);

    Log.i(TAG, "Something Happening " + path);
    _context = context;
    directoryPath = path;
}

@Override
public void onEvent(int event, @Nullable String path) {
    if (path == null) {
        return;
    }
    //a new file or subdirectory was created under the monitored directory
    if ((FileObserver.CREATE & event)!=0) {
        Log.i(TAG, "A file is added to the path " + path);

        Toast.makeText(_context, "A new file has been added", Toast.LENGTH_LONG).show();
    }

    if ((FileObserver.DELETE & event)!=0) {
        Log.i(TAG, "A file is deleted to the path " + path);
        //Context.getApplicationContext();
    }
}
}

以下是清单:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="someone.package">

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

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <service android:name=".BackgroundServices" android:exported="false"></service>
    </application>

</manifest>

3 个答案:

答案 0 :(得分:0)

您是否添加了权限?我没有足够的代表,否则我会评论。

答案 1 :(得分:0)

这里的问题是FileObserver可能正在被垃圾收集,你可以看到here

  

警告:如果垃圾收集了FileObserver,它将停止发送事件。为确保您继续接收事件,您必须保留对其他实时对象的FileObserver实例的引用。

Android可能会摆脱您的服务,甚至是FileObserver本身。尝试查看代码是否正在进入&#34; startWatching()&#34;方法,或者即使服务正在启动。

答案 2 :(得分:0)

我找到的解决方案是移动DirectoryObserver的以下初始化

 DirectoryObserver directoryObserver = new DirectoryObserver(new File(Environment.getExternalStorageDirectory(), Constants.Camera_Directory).getAbsolutePath(), getApplicationContext());

public int onStartCommand(Intent intent, int flags, int startId)
在跟随行

之前的BackgroundService类中的

方法

Thread thread = new Thread(new ThreadClass(startId));
    thread.start();