Sử dụng startActivityForResult, làm cách nào để lấy Mã yêu cầu trong hoạt động con?


85

Tôi có bốn hoạt động, giả sử A, B, C và D. Tình huống của tôi là A sẽ bắt đầu hoạt động B bằng startActivityForResult.

startActivityForResult(new Intent(this,B.class),ONE);

Trong tình huống khác tôi sẽ B với tình huống khác. giống

 startActivityForResult(new Intent(this,B.class),TWO);

Trong B, tôi cần gọi C hoặc D tùy thuộc vào Mã yêu cầu. Tức là nếu MỘT cần bắt đầu C else D.
Vì vậy, tôi cần biết cách kiểm tra Mã yêu cầu trong Hoạt động con (B ở đây).
Nói cách khác, tôi muốn lấy mã yêu cầu mà Hoạt động B đã được bắt đầu.

Câu trả lời:


137

Bạn có thể vượt qua mã yêu cầu bằng cách đặt thêm.

intent.putExtra("requestCode", requestCode);   

Hoặc nếu bạn đã sử dụng startActivityForResultnhiều lần, sau đó tốt hơn so với cách chỉnh sửa từng, bạn có thể overridecác startActivityForResulttrong của bạn Activity, thêm bạn mã có như thế này

@Override
    public void startActivityForResult(Intent intent, int requestCode) {
        intent.putExtra("requestCode", requestCode);
        super.startActivityForResult(intent, requestCode);
    }

Vì vậy, không cần phải chỉnh sửa tất cả startActivityForResult của bạn
Hy vọng nó sẽ giúp bạn


49
Có thực sự không có cách nào để một hoạt động con nhận được mã yêu cầu của nó không?
i_am_jorf

1
Cho đến bây giờ với Kiến thức tốt nhất của tôi, tôi nghĩ không còn cách nào khác.
Labeeb Panampullan

17
Cũng tự hỏi điều tương tự - đây là một trong những điều trong các API Android không có ý nghĩa logic nào.
Artem Russakovskii,

7
startActivityForResult có thể được sử dụng để bắt đầu các hoạt động trong các ứng dụng khác, requestCode là vấn đề riêng tư của ứng dụng của bạn. Trong trường hợp này, có nghĩa là Intent không có phương pháp nào như vậy và cách tiếp cận phù hợp là setAction tư vấn chính xác những gì bạn muốn Activity làm.
Maciej Beimcik

27

Mã yêu cầu không được tự động chuyển đến hoạt động đã bắt đầu vì nó không (và không nên) cần biết giá trị này. Nó chỉ cần biết phải làm gì và không phải bắt đầu từ đâu.

Bắt đầu một hoạt động thực sự chỉ là một hình thức khác của việc gọi một phương thức. Khi bạn gọi một phương thức, bạn sẽ nhận được kết quả đồng bộ (ngay tại nơi bạn thực hiện cuộc gọi). Trong trường hợp này, bạn chỉ chuyển thông tin mà phương thức cần để thực hiện công việc của nó. Bạn không nói cho nó biết bạn đã gọi nó từ đâu.

Bắt đầu một hoạt động là tương tự không đồng bộ của việc gọi một phương thức, trong trường hợp đó bạn nhận được kết quả trong phương thức đặc biệt onActivityResult (). Trong phương pháp này, bạn cần biết phải làm gì với kết quả bạn vừa nhận được và bạn có mã yêu cầu cho việc này.

Để làm rõ hơn một chút tại sao chuyển mã yêu cầu làm tham số không phải là ý kiến ​​hay, hãy xem xét hoạt động ví dụ đang hiển thị sản phẩm bạn có thể mua. Trên hoạt động này có hai nút có nhãn "Mua" và "Đăng nhập" (vì bạn hiện chưa đăng nhập). Nhấn "Đăng nhập" sẽ bắt đầu một hoạt động có tên "Đăng nhập" sẽ cố gắng đăng nhập người dùng bằng thông tin được cung cấp. Nhấn "Mua" trước tiên sẽ bắt đầu cùng một hoạt động "Đăng nhập" và nếu đăng nhập thành công, hãy bắt đầu hoạt động mua.

Bây giờ, nút "Đăng nhập" sử dụng mã yêu cầu 1 để bắt đầu hoạt động đăng nhập, nhưng nút "Mua" không thể sử dụng mã yêu cầu giống như vậy vì nó sẽ phải thực hiện điều gì đó khác nếu đăng nhập thành công. Vì vậy, nút "Mua" sử dụng mã yêu cầu 2.

Trong hoạt động "Đăng nhập", bạn có thể nhận được hai mã yêu cầu khác nhau tùy thuộc vào nơi nó được gọi đến, nhưng bạn sẽ cần thực hiện quy trình tương tự.

Vì vậy, nếu bạn chuyển mã yêu cầu dưới dạng tham số, bạn sẽ nhận được mã cần thực hiện cùng một thứ cho một vài mã yêu cầu khác nhau, như:

if (requestCode == LOGIN || requestCode == BUY) {
    // ...
} else ...

Bạn cũng sẽ kết thúc với việc lưu trữ các hằng số mã yêu cầu ở một vị trí trung tâm, ví dụ như một lớp có tên RequestCodes.

Tóm lại, mã yêu cầu chỉ nên được sử dụng để quyết định phải làm gì với kết quả nhận được. Bằng cách này, bạn sẽ có một mã mô-đun hơn, dễ bảo trì hơn và dễ mở rộng hơn.


1
Điều gì sẽ xảy ra nếu đó là một "trình quản lý" kiểu và bạn muốn một mã yêu cầu đi vào để "lưu" một giá trị nhất định (giá trị được lưu trong phần bổ sung). Một mã yêu cầu khác sẽ "truy xuất" một giá trị (và trả lại trong các tính năng bổ sung) nhưng trong hoạt động này, chúng cũng có thể quản lý tổng thể các giá trị đã lưu như đổi tên, chỉnh sửa, xóa, v.v. Bạn nghĩ gì về điều đó? Tôi nghĩ rằng nó sẽ ngăn việc trùng lặp mã / hoạt động để thực hiện các hành động tương tự.
JRomero

@ J.Romero Đừng làm vậy, nó sẽ chỉ làm phức tạp mọi thứ. Chỉ cần đặt chức năng đó trong một lớp (tiện ích / singleton). Bạn cũng có thể muốn nhìn vào HandlerDịch vụ
Szabolcs Berecz

3
Szabolcs Hoạt động con ngay cả khi nó "không cần biết giá trị này" có thể cần phải chuyển giá trị cho hoạt động tiếp theo trong một chuỗi. Trớ trêu thay, chúng ta cần viết nhiều mã dự phòng hơn cho việc này. Đối với những điều mà chúng ta không cần biết nhiều khi chúng ta có thêm bài giảng để đọc về những điều chúng ta không nên làm.
user250343 Ngày

Tôi không hiểu điều này minh họa như thế nào tại sao hoạt động con bị từ chối quyền truy cập vào mã yêu cầu. Tôi thậm chí không chắc tại sao việc truy cập mã yêu cầu lại cần thiết trong ví dụ cụ thể của bạn khi xem xét việc mua ngay và đăng nhập dù sao cũng là hai hoạt động riêng biệt.
Drazen Bjelovuk

1
@EvanR. có lẽ một kiến ​​trúc tốt hơn sẽ là phân lớp hoạt động mục "chủ" thành các hoạt động thêm / chỉnh sửa riêng biệt. Vì vậy, có rất ít việc sử dụng lại mã, nhưng mỗi hoạt động có thể được gọi một cách độc lập.
Dane Powell

11

Cuối cùng, tôi đã sử dụng hành động Ý định tùy chỉnh để chuyển loại thông tin này đến Hoạt động khởi chạy.

protected static final String ACTION_DO_C = "do_c";
protected static final String ACTION_DO_D = "do_d";

Sau đó, bạn muốn:

final Intent intent = new Intent(this,B.class)
intent.setAction(ACTION_DO_C);
startActivityForResult(intent,ONE);

Và trong Hoạt động, Bbạn dễ dàng thực hiện hành động:

getIntent().getAction();

0

Bạn có thể sử dụng getCallingActivity () để nhận hoạt động đã bắt đầu hoạt động hiện tại và hoạt động đó sẽ nhận được giá trị kết quả với mã phản hồi ở cuối.

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.