【发布时间】:2012-03-16 19:57:32
【问题描述】:
[编辑:问题已解决。请参阅下面的my answer。]
在我的应用程序中,我调用系统相机拍照,然后在onActivityResult 中处理结果。你知道的,平常的。它曾经可以工作,但现在我的通话活动在我拍照时被杀死了。具体来说,onDestroy() 在我按下相机快门后立即调用我的活动。照片确实被拍摄并保存(我已经检查过文件是否写入了 SD 卡上)。在我接受照片后,不是返回调用活动并调用onActivityResult,而是调用活动堆栈中的前一个活动。我在 logcat 中没有看到任何异常。我的自定义异常处理程序没有被调用。如果重要的话,我的应用程序还包括一个侦听 GPS 更新的服务,但我在 onPause() 中取消了所有接收器的注册。
这是MyCallingActivity.onDestroy() 的调用堆栈:
Thread [<1> main] (Suspended (breakpoint at line 303 in NewPlaceDetailsActivity))
NewPlaceDetailsActivity.onDestroy() line: 303
ActivityThread.performDestroyActivity(IBinder, boolean, int, boolean) line: 2663
ActivityThread.handleDestroyActivity(IBinder, boolean, int, boolean) line: 2694
ActivityThread.access$2100(ActivityThread, IBinder, boolean, int, boolean) line: 117
BinderProxy(ActivityThread$H).handleMessage(Message) line: 968
ActivityThread$H(Handler).dispatchMessage(Message) line: 99
Looper.loop() line: 130
ActivityThread.main(String[]) line: 3687
Method.invokeNative(Object, Object[], Class, Class[], Class, int, boolean) line: not available [native method]
Method.invoke(Object, Object...) line: 507
ZygoteInit$MethodAndArgsCaller.run() line: 842
ZygoteInit.main(String[]) line: 600
NativeStart.main(String[]) line: not available [native method]
这就是我启动相机活动的方式,以防您想知道:
protected void startCamera() {
createPhotoDirsIfNeeded();
String fileName = "temp.jpg";
ContentValues values = new ContentValues();
values.put(MediaStore.Images.Media.TITLE, fileName);
m_capturedImageUri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
m_photoFileName = APP_PHOTO_PATH + "/" + DateFormat.format(DATE_FORMAT, Calendar.getInstance().getTime()) + ".jpg";
File picFile = new File(m_photoFileName);
if(picFile.exists()) {
picFile.delete();
}
// start the camera activity
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(picFile));
startActivityForResult(intent, IntentHelper.REQUEST_TAKE_PHOTO);
}
如何找出我的 Activity 为何会被杀死,并从堆栈中删除而不是重新创建?
【问题讨论】:
-
发布相关代码。看来您的代码查杀应用可能正在调用一些与查杀活动相关的命令。
-
发布了更多代码。 onActivityResult() 永远不会被调用,因为当我从相机返回时,活动已被破坏。
-
在
NewPlaceDetailsActivity.onDestroy()中,检查isFinishing()是否返回true。如果没有,您的活动将被销毁以便重新启动(可能是由于拍摄照片时方向发生变化)。 -
isFinishing() 返回真。我还确保这次不要改变方向。另外,即使由于方向改变而重新启动,onActivityResult 仍然会被调用,不是吗?
-
首先,您的进程极有可能被终止,以释放内存。没有什么不妥。关于您的异常,您在 Eclipse 中捕获异常。让执行继续,然后检查 LogCat 堆栈跟踪。如果您的
NewPlaceDetailsActivity中的第 303 行仍然显示您有问题,您将需要检查该行的内容。
标签: android android-activity android-intent