Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/191.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何在操作系统内存不足的情况下保持content observer运行_Android_Service_Contentobserver - Fatal编程技术网

Android 如何在操作系统内存不足的情况下保持content observer运行

Android 如何在操作系统内存不足的情况下保持content observer运行,android,service,contentobserver,Android,Service,Contentobserver,请让我先解释一下情况 我一直在写一个类似android的Dropbox应用程序,它可以自动将照片上传到服务器上。当用户打开上传服务时,它会尽可能长时间地在后台运行 该服务用于上传照片,但我还添加了一个内容观察者来观看拍照活动,因为我需要立即上传新拍摄的照片。内容观察者将检测摄像头事件并上传新照片。直到现在一切都很好 当我向服务传递START\u时,它会使服务保持运行,并在操作系统有足够内存后恢复自身。但《内容观察家》却没有。这就是问题所在 我需要确保Content Observer的功能与服务一

请让我先解释一下情况

我一直在写一个类似android的Dropbox应用程序,它可以自动将照片上传到服务器上。当用户打开上传服务时,它会尽可能长时间地在后台运行

该服务用于上传照片,但我还添加了一个内容观察者来观看拍照活动,因为我需要立即上传新拍摄的照片。内容观察者将检测摄像头事件并上传新照片。直到现在一切都很好

当我向服务传递START\u时,它会使服务保持运行,并在操作系统有足够内存后恢复自身。但《内容观察家》却没有。这就是问题所在

我需要确保Content Observer的功能与服务一样长,因为用户可以随时拍照。内容观察者必须在后台检测摄像头事件并上传

我在服务类下的onCreate方法中闪烁了Content Observer,并在onDestory方法中注销了它。参见代码

下面是cameraUploadObserver是如何创建和使用的


因此,任何人都可以告诉我为什么服务可以继续运行,但是Content Observer,是否需要添加任何代码来保持Content Observer的运行?如果您有任何意见、建议和参考,我们将不胜感激。

cameraUploadObserver是在哪里创建的,是如何创建的?另外,我在您的代码中看到,注销观察员已被注释掉。@Okas我更新了问题并发布了更多代码。@Okas我注销观察员以测试它是否在服务期间保持运行。请提供更多信息。您如何准确地检测到服务正在运行,而观察者没有收到通知?@Okas我在开始时分别向服务和观察者添加了日志,并打印了两个日志。即使在我将应用程序放在后台并打开许多其他使用ram的应用程序时,服务日志也会打印出来。注意到当操作系统内存非常低时,服务日志被中断了好几次,然后继续运行。但对于观察者来说,一旦日志停止,它就再也不会恢复。
@Override
public void onCreate() {
            Log.d(DEBUG_TAG, "onCreate");
            // bind transfer service
            Intent bIntent = new Intent(this, TransferService.class);
            bindService(bIntent, mConnection, Context.BIND_AUTO_CREATE);
            Log.d(DEBUG_TAG, "try bind TransferService");
            this.getApplicationContext()
                    .getContentResolver()
                    .registerContentObserver(
                            MediaStore.Images.Media.EXTERNAL_CONTENT_URI, false,
                            cameraUploadObserver);                        
        }
        @Override
        public void onDestroy() {
            Log.d(DEBUG_TAG, "onDestroy");
            cancelUploadTasks();
            /*this.getApplicationContext().getContentResolver()
            .unregisterContentObserver(cameraUploadObserver);
            cameraUploadObserver = null;*/
            if (mTransferService != null) {
                unbindService(mConnection);
                mTransferService = null;
            }                
        }
        @Override
        public int onStartCommand(Intent intent, int flags, int startId) {
            Log.d(DEBUG_TAG, "onStartCommand");
            Log.d(DEBUG_TAG, "onStartCommand.intent: " + intent);
            initializeCameraUploadPreference();
            if (repoId != null && accountEmail != null) {
                isCameraUpload = true;
                account = new Account(accountServer, accountEmail, null, accountToken);
                cUploadManager = new CameraUploadManager(account);
            }    
            if (isCameraUpload) {
                Log.d(DEBUG_TAG, "onStartCommand.startPhotoUploadTask");
                ConcurrentAsyncTask.execute(new PhotoUploadTask());
            }            
            return START_STICKY;
        }
private CameraObserver cameraUploadObserver = new CameraObserver();
    private class CameraObserver extends ContentObserver {
          public CameraObserver() {
              super(null);
          }
          @Override
          public void onChange(boolean selfChange) {
              super.onChange(selfChange);
              Log.d(DEBUG_TAG, "CameraOberser onChange");
              ConcurrentAsyncTask.execute(new CameraEventReceiverTask());
          }
      }