调用"StartActivityForResult"时保留Activity"alive"
Keep Activity "alive" when calling "StartActivityForResult"
我一直在尽一切努力为结果启动 Activity,但保持调用者 activity 似乎是不可能的。
我已经尝试在清单 "android:onConfigChanges" 的调用方 activity 上设置屏幕大小、方向和键盘隐藏。
这非常重要,因为在调用者中 Activity 异步任务从 Web 服务加载内容。
当 Activity 在拍照后恢复时,调用者 activity 被销毁并再次从 Web 服务加载整个 UI 并销毁用户输入。有什么办法可以避免这种情况吗?
这是相机意图的 Caller 方法。
private void openCamera(){
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
// Ensure that there's a camera activity to handle the intent
if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
//takePictureIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); <- Commented and not commented with the same problem.
// Create the File where the photo should go
try {
photoFile = createImageFile();
} catch (IOException ex) {
ex.printStackTrace();
}
// Continue only if the File was successfully created
if (photoFile != null) {
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT,
Uri.fromFile(photoFile));
startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE);
}
}
}
这是 "createImageFile()":
private File createImageFile() throws IOException {
// Create an image file name
File file;
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
String imageFileName = timeStamp + "_";
File storageDir = new File(Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_PICTURES), "myAppDirectory");
if (!storageDir.mkdir()){
storageDir.mkdirs();
};
file = File.createTempFile(
imageFileName, /* prefix */
".jpg", /* suffix */
storageDir /* directory */
);
mCurrentPhotoPath = file.getAbsolutePath();
return file;
}
I have been trying everything to start an Activity for Result but keeping the caller activity seems impossible.
很可能,您的进程由于内存不足而被终止。当使用 ACTION_IMAGE_CAPTURE
或启动第三方相机应用程序的其他操作时,这是相当典型的。它也发生在许多其他地方,因为您的应用程序的进程不会永远存在。
It is very important because in the caller Activity an Asyn Task loads the content from a Web Service.
请记住,还有 大量 其他情况会终止您的进程,您需要能够处理这种情况。因此,如果您关心的是重新执行 Web 服务调用,请将前一次调用的结果缓存在一个文件中,并且仅在缓存的结果过时时才重新发出调用。您可能还会考虑您的 activity 是否应该执行此 Web 服务调用,而是将该逻辑移至 IntentService
.
我一直在尽一切努力为结果启动 Activity,但保持调用者 activity 似乎是不可能的。
我已经尝试在清单 "android:onConfigChanges" 的调用方 activity 上设置屏幕大小、方向和键盘隐藏。
这非常重要,因为在调用者中 Activity 异步任务从 Web 服务加载内容。
当 Activity 在拍照后恢复时,调用者 activity 被销毁并再次从 Web 服务加载整个 UI 并销毁用户输入。有什么办法可以避免这种情况吗?
这是相机意图的 Caller 方法。
private void openCamera(){
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
// Ensure that there's a camera activity to handle the intent
if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
//takePictureIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); <- Commented and not commented with the same problem.
// Create the File where the photo should go
try {
photoFile = createImageFile();
} catch (IOException ex) {
ex.printStackTrace();
}
// Continue only if the File was successfully created
if (photoFile != null) {
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT,
Uri.fromFile(photoFile));
startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE);
}
}
}
这是 "createImageFile()":
private File createImageFile() throws IOException {
// Create an image file name
File file;
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
String imageFileName = timeStamp + "_";
File storageDir = new File(Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_PICTURES), "myAppDirectory");
if (!storageDir.mkdir()){
storageDir.mkdirs();
};
file = File.createTempFile(
imageFileName, /* prefix */
".jpg", /* suffix */
storageDir /* directory */
);
mCurrentPhotoPath = file.getAbsolutePath();
return file;
}
I have been trying everything to start an Activity for Result but keeping the caller activity seems impossible.
很可能,您的进程由于内存不足而被终止。当使用 ACTION_IMAGE_CAPTURE
或启动第三方相机应用程序的其他操作时,这是相当典型的。它也发生在许多其他地方,因为您的应用程序的进程不会永远存在。
It is very important because in the caller Activity an Asyn Task loads the content from a Web Service.
请记住,还有 大量 其他情况会终止您的进程,您需要能够处理这种情况。因此,如果您关心的是重新执行 Web 服务调用,请将前一次调用的结果缓存在一个文件中,并且仅在缓存的结果过时时才重新发出调用。您可能还会考虑您的 activity 是否应该执行此 Web 服务调用,而是将该逻辑移至 IntentService
.