即使操作系统内存不足,如何保持内容观察者运行

时间:2014-09-17 06:58:06

标签: android service contentobserver

请允许我解释一下情景。

我一直在写一个像Android应用程序的Dropbox,它会自动将照片上传到服务器。当用户打开上传服务时,只要可以,它就会一直在后台运行。

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

当我将START_STICKY传递给服务以使其继续运行并在操作系统有足够的内存后自行恢复时。但内容观察者却没有。这就产生了问题。

我需要确保Content Observer功能,只要服务有效,因为用户可以随时拍摄相机照片。内容观察者必须在后台检测摄像机事件并上传。

我在Service Class的onCreate()方法中创建了Content Observer,并在onDestory()方法下取消注册。看到代码

@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;
        }

以下是cameraUploadObserver的创建和使用方式

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());
          }
      }

所以任何人都可以告诉我为什么服务可以继续运行但是内容观察器,是否需要添加任何代码来保持内容观察器的运行?任何意见,建议,参考将不胜感激。

0 个答案:

没有答案