OnResume () có được gọi trước onActivityResult () không?


79

Đây là cách ứng dụng của tôi được bố trí:

  1. người dùng onResume () được nhắc đăng nhập
  2. Nếu người dùng đăng nhập, anh ta có thể tiếp tục sử dụng ứng dụng 3. Nếu người dùng đăng xuất bất kỳ lúc nào, tôi muốn nhắc đăng nhập lại

Làm thế nào tôi có thể đạt được điều này?

Đây là MainActivity của tôi:

@Override
    protected void onResume(){
        super.onResume();

        isLoggedIn = prefs.getBoolean("isLoggedIn", false);

        if(!isLoggedIn){
            showLoginActivity();
        }
    }

Đây là LoginActivity của tôi:

@Override
        protected void onPostExecute(JSONObject json) {
            String authorized = "200";
            String unauthorized = "401";
            String notfound = "404";
            String status = new String();

            try {
                // Get the messages array
                JSONObject response = json.getJSONObject("response");
                status = response.getString("status");

                if(status.equals(authorized)){
                    Toast.makeText(getApplicationContext(), "You have been logged into the app!",Toast.LENGTH_SHORT).show();
                    prefs.edit().putBoolean("isLoggedIn",true);

                    setResult(RESULT_OK, getIntent());
                    finish();
                }
                else if (status.equals(unauthorized)){
                    Toast.makeText(getApplicationContext(), "The username and password you provided are incorrect!",Toast.LENGTH_SHORT).show();
                     prefs.edit().putBoolean("isLoggedIn",true);
                }
                else if(status.equals(notfound)){
                    Toast.makeText(getApplicationContext(), "Not found",Toast.LENGTH_SHORT).show();
                     prefs.edit().putBoolean("isLoggedIn",true);
                }
            } catch (JSONException e) {
                System.out.println(e);
            } catch (NullPointerException e) {
                System.out.println(e);
            }
        }
    }

Sau khi người dùng đăng nhập thành công:

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (resultCode == RESULT_OK) {
            Toast.makeText(getApplicationContext(), "BOOM SHAKA LAKA!",Toast.LENGTH_SHORT).show();
        }
    }

Vấn đề là onResume () được gọi trước onActivityResult () nên khi người dùng đăng nhập thành công, hoạt động chính của tôi không được thông báo vì onResume () được gọi trước.

Đâu là nơi tốt nhất để nhắc đăng nhập?

Câu trả lời:


102

Cuộc gọi đến onActivityResult thực sự xảy ra trước onResume (xem tài liệu ). Bạn có chắc chắn rằng bạn đang thực sự bắt đầu hoạt động mà bạn muốn startActivityForResultvà bạn đang đặt kết quả của hoạt động được gọi RESULT_OKtrước khi trả về một giá trị cho hoạt động của mình không? Hãy thử chỉ cần đưa một Logcâu lệnh vào của bạn onActivityResultđể ghi lại giá trị đó và đảm bảo rằng giá trị đó được nhấn. Ngoài ra, bạn đang đặt giá trị của isLoggedIntùy chọn ở đâu? Có vẻ như bạn nên đặt điều đó thành truehoạt động đăng nhập của mình trước khi nó trả về, nhưng điều đó rõ ràng không xảy ra.

Biên tập

Các tài liệu nói:

Bạn sẽ nhận được cuộc gọi này ngay lập tức trước onResume () khi hoạt động của bạn bắt đầu lại.


tôi đang cài đặt isLoggedIn sau khi người dùng đã đăng nhập. hãy xem mã cập nhật của tôi. không chắc có chuyện gì vậy?
Sheehan Alam

1
bạn nói đúng, onActivityResult () đang được gọi trước onResume (). Không chắc tại sao các prefs của tôi lại bị đọc sai?
Sheehan Alam

4
Lưu ý rằng onActivityResultcũng được gọi trước onStart, được coi là một lỗi của nhiều người: code.google.com/p/android/issues/detail?id=17787
Denis Kniazhev

30

Với các phân đoạn, nó thậm chí không đơn giản như onActivityResult()được gọi trước khi gọi đến onResume(). Nếu hoạt động mà bạn đang quay lại bị loại bỏ trong thời gian tạm thời, bạn sẽ thấy rằng các lệnh gọi đến (ví dụ) getActivity()từ đó onActivityResult()sẽ trả về giá trị rỗng. Tuy nhiên, nếu hoạt động chưa được xử lý, một lệnh gọi tới getActivity()sẽ trả về hoạt động chứa.

Sự không nhất quán này có thể là nguồn gốc của các lỗi khó chẩn đoán nhưng bạn có thể kiểm tra hành vi của ứng dụng của mình bằng cách bật tùy chọn nhà phát triển "Không giữ các hoạt động". Tôi có xu hướng tiếp tục bật tính năng này - tôi muốn thấy một NullPointerExceptionsự phát triển hơn là sản xuất.


2

Bạn có thể muốn xem xét việc loại bỏ trạng thái đăng nhập khỏi hoạt động. Ví dụ: nếu người dùng có thể đăng nhận xét, hãy để hành động onPost ping cho trạng thái đăng nhập và chuyển từ đó, thay vì từ trạng thái hoạt động.


0

Các phương thức gọi lại như onResumekhông phải là nơi thích hợp để đạt được chức năng được yêu cầu. Tôi khuyên bạn nên tạo một lớp học và thêm chức năng đăng nhập / đăng xuất ở đó. khi nhận được lệnh gọi lại đăng nhập, sau đó gọi chức năng đăng nhập.

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.