Android 如何在操作系统内存不足的情况下保持content observer运行
请让我先解释一下情况 我一直在写一个类似android的Dropbox应用程序,它可以自动将照片上传到服务器上。当用户打开上传服务时,它会尽可能长时间地在后台运行 该服务用于上传照片,但我还添加了一个内容观察者来观看拍照活动,因为我需要立即上传新拍摄的照片。内容观察者将检测摄像头事件并上传新照片。直到现在一切都很好 当我向服务传递START\u时,它会使服务保持运行,并在操作系统有足够内存后恢复自身。但《内容观察家》却没有。这就是问题所在 我需要确保Content Observer的功能与服务一样长,因为用户可以随时拍照。内容观察者必须在后台检测摄像头事件并上传 我在服务类下的onCreate方法中闪烁了Content Observer,并在onDestory方法中注销了它。参见代码 下面是cameraUploadObserver是如何创建和使用的Android 如何在操作系统内存不足的情况下保持content observer运行,android,service,contentobserver,Android,Service,Contentobserver,请让我先解释一下情况 我一直在写一个类似android的Dropbox应用程序,它可以自动将照片上传到服务器上。当用户打开上传服务时,它会尽可能长时间地在后台运行 该服务用于上传照片,但我还添加了一个内容观察者来观看拍照活动,因为我需要立即上传新拍摄的照片。内容观察者将检测摄像头事件并上传新照片。直到现在一切都很好 当我向服务传递START\u时,它会使服务保持运行,并在操作系统有足够内存后恢复自身。但《内容观察家》却没有。这就是问题所在 我需要确保Content Observer的功能与服务一
因此,任何人都可以告诉我为什么服务可以继续运行,但是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());
}
}