Android - startActivityForResult ngay lập tức kích hoạt onActivityResult


144

Tôi đang khởi chạy các hoạt động từ hoạt động chính trong ứng dụng của mình bằng cách sử dụng cuộc gọi startActivityForResult(intent, ACTIVITY_TYPE)và tất cả chúng đều hoạt động trừ một.

Cái này, khi được gọi, khởi chạy hoạt động như mong muốn, nhưng trong nhật ký tôi có thể thấy nó onActivityResult()ngay lập tức được kích hoạt. Các hoạt động hiện lên nhưng RESULT_CANCELEDngay lập tức trở lại onActivityResult().

Sau đó tôi tương tác với hoạt động, nhấn nút gọi finish()onActivityResult()không được gọi lần này (vì rõ ràng kết quả đã được trả về).

Liệu điều này có ý nghĩa với ai? Có ai nhìn thấy hành vi này trước đây?

Câu trả lời:


315

Bạn không thể sử dụng startActivityForResult()nếu hoạt động của bạn được khởi chạy dưới dạng singleInstancehoặc singleTask. standardhoặc singleTopchế độ khởi chạy sẽ khắc phục vấn đề.


2
Cảm ơn cả hai bạn, tôi đã có cái này trong tệp kê khai của mình và đã hoàn toàn quên nó
TomBomb

9
Ôi! Điều này có vẻ như là một điều rõ ràng để thêm vào javadocs! Tôi đã lãng phí cả một buổi tối để cố gắng làm việc này và câu trả lời SO này nhắc nhở tôi rằng Hoạt động của tôi được đặt thành singleTop.
swooby

20
singleTopcó vẻ tốt đối với tôi, singleTasktuy nhiên đã gây ra vấn đề này và do đó singleInstancechắc chắn cũng sẽ xảy ra
darnmason

4
Tôi cũng đã dành quá nhiều thời gian để gỡ lỗi này! Cảm ơn!!
suomi35

4
Trong trường hợp của tôi, đã không định nghĩa bất kỳ lớp nào là SingleInstance hoặc singleTop, nhưng nó vẫn đang xảy ra ... có đề xuất nào không?
CoDe

110

Ngoài ra, đảm bảo rằng ý định không có Intent.FLAG_ACTIVITY_NEW_TASKbộ.

Từ các tài liệu :

Cờ này không thể được sử dụng khi người gọi yêu cầu kết quả từ hoạt động được khởi chạy.


3
Điều này đã khắc phục vấn đề trong trường hợp của tôi. Vấn đề không phải do SingleInstance, singleTop hay singleTask gây ra.
Diana

Bạn là một bạc hà (Một người cứu mạng). Đây là vấn đề chính xác của tôi khi tôi muốn người dùng chụp ảnh trong Fragment
kyay 16/2/19

@Diana, bạn có nhớ những gì bạn đã sử dụng thay vì Intent.FLAG_ACTIVITY_NEW_TASK?
Keselme

@Keselme Xin lỗi, đã lâu rồi, tôi ước mình có thể giúp nhưng tôi không nhớ và tôi không thể truy cập mã đó nữa.
Diana

Vâng, đã sửa nó. startActivityForResult không nên được sử dụng với Intent.FLAG_ACTIVITY_NEW_TASK
hanilozmen

21

Tôi đã thấy hành vi này trước đây, vui lòng đảm bảo rằng hoạt động định mệnh của bạn (hoạt động đặc biệt đó) không có singleInstancetrong tệp AndroidManifest. Nếu Hoạt động là singleInstance, thì nó sẽ trở lại RESULT_CANCELEDtrước khi ra mắt!


18

Tôi cũng muốn thêm rằng bạn có thể gọi một ứng dụng bên ngoài bằng:
Intent in = caller.getPackageManager().getLaunchIntentForPackage("com.your.package.here");
Điều này sẽ tạo ra một ý định Intent.FLAG_ACTIVITY_NEW_TASKđược thêm vào theo mặc định, vì vậy hãy gọi:
in.setFlags(0);
Cái nào sẽ xóa cờ đó, và sau đó bạn có thể tiến hành:startActivityForResult(in, action);

Lý do tôi đang làm điều này là vì tôi có một ứng dụng tiện ích có chức năng chung giữa một vài ứng dụng khác và tôi có thể giữ các thay đổi mã ở một vị trí thay vì lo lắng về nhiều cập nhật.


Tôi biết điều này đã cũ, nhưng điều này hoàn toàn vô giá đối với tôi đến mức tôi muốn nói lời cảm ơn đến người dùng, và chỉ ra cho bất kỳ ai nhảy vào giữa các hoạt động mà điều này là vàng! Lưu lại mông của tôi trong một cuộc thi hackathon;)
Wes Winn

Đây là những gì cần quan tâm nhiều hơn. Đó là giải pháp tốt nhất và hoạt động hoàn hảo cho tôi. Bạn đã tiết kiệm cho tôi rất nhiều thời gian, cảm ơn bạn rất nhiều.
Aritra Roy

Bỏ phiếu cho câu trả lời này vì đây là vấn đề chính xác tôi gặp phải sáng nay! Cảm ơn giải pháp!
Will Johnson

Cảm ơn. aim.setFlags (0) đã giải quyết vấn đề. Bây giờ ứng dụng thứ hai bắt đầu ổn và trả về kết quả cho ứng dụng gọi điện
Niaz

5

startActivityForResult()không hoạt động với một singleInstancehoặc singleTaskhoạt động trong phiên bản tiền kẹo mút của Android. Vì Android 5 nó hoạt động (xem câu trả lời này để biết thêm chi tiết).


5

Nó cũng kích hoạt nếu bạn có FLAG_ACTIVITY_NEW_TASKý định của bạn.

Intent intent = new Intent(this, MyActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivityForResult(intent, REQUEST_CODE);

Cảm ơn. Tôi đã thêm FLAG_ACTIVITY_NEW_TASK trong hoạt động của mình.
Chirag Savsani

1

Vấn đề của tôi là với các hoạt động gọi điện thoại. Tuyên bố của nó trong AndroidManifest có thuộc tính sau:

android:noHistory="true"

Thay đổi nó thành "false" và bây giờ hoạt động tốt.


1

Android 4.4 có một vấn đề nhỏ về việc chờ đợi sự trở lại vào cuối thời điểm đóng cửa lực lượng Để giải quyết hành vi này, điều quan trọng là phải đặt:

  • tất cả các hoạt động sẽ có cùng thuộc tính tác vụ. ( TaskAffinity = "[SAME STRING]")
  • launchmode=singleTop,
  • launchIntent.SetFlags(0); // for reset default Intent flags if you launch from package manager

Giải pháp này hoạt động với tất cả các phiên bản Android

Xem phần này để biết tác vụ: https://asyoulook.com/computers%20&%20iNET/android-onactivityresult-being-called-instantly/1004072


1

Ngoài ra, hãy kiểm tra xem android: noHistory = "true" trên hoạt động trong Manifest, nếu có, nó sẽ không hoạt động.


0

Đối với ActivityGrouphoặc TabHostvà những người khác, có thể xxxActivitylà một subActivitytrong những cha mẹ của nó. Sau đó, startActivityForResultkhông thể làm việc nhưng cha mẹ có thể nhận được kết quả.

  1. cuộc gọi getParent().startActivityForResult()từ hoạt động phụ của bạn

  2. cha mẹ của bạn ( ActivityGroupsẽ) sẽ có thể xử lý onActivityResult. Vì vậy, tôi đã tạo ra một lớp con ActivityGroupvà xử lý này onActivityResult.

  3. Bạn có thể định tuyến lại kết quả đó trở lại hoạt động phụ nếu bạn cần. Chỉ cần có được các hoạt động hiện tại bằng cách getLocalActivityManager().getCurrentActivity(). Các hoạt động phụ của tôi kế thừa từ một hoạt động tùy chỉnh nên tôi đã thêm một handleActivityResult(requestCode, resultCode, data)trong lớp con đó ActivityGroupđể gọi.

ví dụ: http://www.cnbloss.com/relinson/archive/2012/03/25/startActivityForResult.html


Bạn nghĩ gì về trường hợp đặc biệt này khi gọi trình duyệt web mặc định: codeproject.com/Questions/990063/ mẹo
Ahmad Ebrahimi

0

onActivityResult()cũng sẽ vượt qua RESULT_CANCELEDnhư là resultCodenếu bạn đánh sai gói hoặc tên lớp trong file manifest.


0

Trong Android Manifest được đặt android:launchMode="singleTop"cho hoạt động bạn muốn mở với kết quả và trong khi mở cờ đặt hoạt độngintent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);


0

Nếu bạn đã xác định android:noHistory="true"trong hoạt động trong AndroidManifest.xml, nó sẽ gây ra vấn đề tương tự ở đây.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.