Khi bạn cố gắng startActivityForResult
cho Activity
có launchMode="singleTask"
; nó sẽ không trả lại bất kỳ giá trị nào với onActivityResult
và khi bạn đặt launchMode="standard"
; tất cả mọi thứ hoạt động tốt, nhưng yêu cầu hệ thống nói rằng Activity
này phải là singleTask
, có cách nào để giải quyết vấn đề này không?onActivityResult Với launchMode = "singleTask"?
Trả lời
Các tài liệu của startActivityForResult
nói:
For example, if the activity you are launching uses the singleTask launch mode,
it will not run in your task and thus you will immediately receive a cancel result.
Có vẻ như không có cách nào để làm được việc này.
Nếu bạn là nhà phát triển của Hoạt động được gọi, sau đó bạn có thể yêu cầu phát sóng khi có một số kết quả. Hoạt động gọi điện sau đó có thể liệt kê các chương trình phát sóng này.
gì @ Peter Knego nói
cộng
có vẻ như được làm việc trong 5.1, không phải trong 4.4.4
nghĩa rằng onActivityResult cháy
Có Tôi cũng quan sát thấy nó hoạt động trong 5.o và cao hơn không trong 4.4.4 – Mahesh
Câu trả lời cho thấy chức năng của startActivityUncheckedLocked
lớp ActivityStackSupervisor
. Trước khi Android 5.x, khi bắt đầu một hoạt động, nó sẽ kiểm tra launchMode đầu tiên và thêm FLAG_ACTIVITY_NEW_TASK
để launchFlags nếu launchMode là singleTask hoặc singleInstance. Nếu launchFlags của hoạt động chứa FLAG_ACTIVITY_NEW_TASK
, nó sẽ gửi lại hủy ngay lập tức và cho phép tác vụ mới tiếp tục khởi chạy như bình thường mà không phụ thuộc vào người khởi tạo của nó.
if (sourceRecord == null) {
// This activity is not being started from another... in this
// case we -always- start a new task.
if ((launchFlags&Intent.FLAG_ACTIVITY_NEW_TASK) == 0) {
Slog.w(TAG, "startActivity called from non-Activity context; forcing " +
"Intent.FLAG_ACTIVITY_NEW_TASK for: " + intent);
launchFlags |= Intent.FLAG_ACTIVITY_NEW_TASK;
}
} else if (sourceRecord.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE) {
// The original activity who is starting us is running as a single
// instance... this new activity it is starting must go on its
// own task.
launchFlags |= Intent.FLAG_ACTIVITY_NEW_TASK;
} else if (r.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE
|| r.launchMode == ActivityInfo.LAUNCH_SINGLE_TASK) {
// The activity being started is a single instance... it always
// gets launched into its own task.
launchFlags |= Intent.FLAG_ACTIVITY_NEW_TASK;
}
// ......
if (r.resultTo != null && (launchFlags&Intent.FLAG_ACTIVITY_NEW_TASK) != 0) {
// For whatever reason this activity is being launched into a new
// task... yet the caller has requested a result back. Well, that
// is pretty messed up, so instead immediately send back a cancel
// and let the new task continue launched as normal without a
// dependency on its originator.
Slog.w(TAG, "Activity is launching as a new task, so cancelling activity result.");
r.resultTo.task.stack.sendActivityResultLocked(-1,
r.resultTo, r.resultWho, r.requestCode,
Activity.RESULT_CANCELED, null);
r.resultTo = null;
}
Nhưng trong 5.x Android, điều này đã được thay đổi như sau:
final boolean launchSingleTop = r.launchMode == ActivityInfo.LAUNCH_SINGLE_TOP;
final boolean launchSingleInstance = r.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE;
final boolean launchSingleTask = r.launchMode == ActivityInfo.LAUNCH_SINGLE_TASK;
int launchFlags = intent.getFlags();
if ((launchFlags & Intent.FLAG_ACTIVITY_NEW_DOCUMENT) != 0 &&
(launchSingleInstance || launchSingleTask)) {
// We have a conflict between the Intent and the Activity manifest, manifest wins.
Slog.i(TAG, "Ignoring FLAG_ACTIVITY_NEW_DOCUMENT, launchMode is " +
"\"singleInstance\" or \"singleTask\"");
launchFlags &=
~(Intent.FLAG_ACTIVITY_NEW_DOCUMENT | Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
} else {
switch (r.info.documentLaunchMode) {
case ActivityInfo.DOCUMENT_LAUNCH_NONE:
break;
case ActivityInfo.DOCUMENT_LAUNCH_INTO_EXISTING:
launchFlags |= Intent.FLAG_ACTIVITY_NEW_DOCUMENT;
break;
case ActivityInfo.DOCUMENT_LAUNCH_ALWAYS:
launchFlags |= Intent.FLAG_ACTIVITY_NEW_DOCUMENT;
break;
case ActivityInfo.DOCUMENT_LAUNCH_NEVER:
launchFlags &= ~Intent.FLAG_ACTIVITY_MULTIPLE_TASK;
break;
}
}
final boolean launchTaskBehind = r.mLaunchTaskBehind
&& !launchSingleTask && !launchSingleInstance
&& (launchFlags & Intent.FLAG_ACTIVITY_NEW_DOCUMENT) != 0;
if (r.resultTo != null && (launchFlags & Intent.FLAG_ACTIVITY_NEW_TASK) != 0) {
// For whatever reason this activity is being launched into a new
// task... yet the caller has requested a result back. Well, that
// is pretty messed up, so instead immediately send back a cancel
// and let the new task continue launched as normal without a
// dependency on its originator.
Slog.w(TAG, "Activity is launching as a new task, so cancelling activity result.");
r.resultTo.task.stack.sendActivityResultLocked(-1,
r.resultTo, r.resultWho, r.requestCode,
Activity.RESULT_CANCELED, null);
r.resultTo = null;
}
Đó là lý do onActivityResult
công trình trong Android 5.x thậm chí bạn thiết launchMode để singleTask
hoặc singleInstance
.
Tôi biết điều này khá muộn nhưng bạn có thể có OnActivityResult loại hiệu ứng trên phương thức onNewIntent() vì đây là hoạt động singleTask của bạn.
- 1. Android: Hành vi của launchMode = "singleTask" không như mô tả?
- 2. startActivityForResult không hoạt động đúng với launchMode singleInstance
- 3. Android: tiếp tục Hoạt động với singleTop hoặc SingleTask
- 4. onActivityResult trả về với dữ liệu = null
- 5. onActivityResult() & onResume()
- 6. Testing onActivityResult()
- 7. Android onActivityResult được gọi là đầu tiên
- 8. FLAG_ACTIVITY_CLEAR_TOP và onActivityResult
- 9. Hoạt động Launcher + singleTask trong Android
- 10. Singleletance và single singletask của Android
- 11. OnActivityResult không hoạt động (Android)
- 12. android android.provider.MediaStore.ACTION_VIDEO_CAPTURE trả lại null onActivityResult với nexus 7
- 13. vòng đời android onActivityResult vs onStop
- 14. onActivityResult bên ngoài phạm vi hoạt động
- 15. onActivityResult() không được thực hiện trong DialogFragment
- 16. onDestroy() trong khi "chờ" cho onActivityResult()
- 17. Xử lý onActivityResult trên Dịch vụ
- 18. Nhiệm vụ và quy trình Android, SingleTask và SingleInstance
- 19. Chế độ khởi chạy singleTask hoặc singleInstance trên Android?
- 20. Android: onActivityResult trong phân đoạn không được gọi là
- 21. onActivityResult() không được gọi khi Activity bắt đầu từ Fragment
- 22. onActivityResult luôn trả về 0 (RESULT_CANCELED) khi gọi thiết lập
- 23. Android onActivityResult. Biến thành viên đôi khi bị vô hiệu
- 24. Mục đích mới() bắt đầu phiên bản mới bằng Android: launchMode = "singleTop"
- 25. Khi nào cần sử dụng singleTop launchMode trong một widget hoặc ứng dụng Android?
- 26. Khi nào thì onActivityResult của fragment được gọi trong vòng đời của các mảnh vỡ?
- 27. onActivityResult nhận được gọi ngay sau khi mục đích máy ảnh được gửi
- 28. Bắt đầu Hoạt động từ preferences.xml và nhận kết quả trong onActivityResult
- 29. Hành động trong onActivityResult và "Lỗi Không thể thực hiện thao tác này sau khi onSaveInstanceState"
- 30. Xử lý onActivityResult trong ứng dụng Android có nhiều hoạt động
Vậy làm cách nào để ngăn việc tạo nhiều phiên bản (ví dụ: listview) trong onClick? – Imon
Imon, sử dụng singleTop – joox