super.onCreate (saveInstanceState);


88

Tôi đã tạo một Dự án ứng dụng Android và trong MainActivity.java> onCreate()nó đang gọi super.onCreate(savedInstanceState).

Là một người mới bắt đầu, bất cứ ai có thể giải thích mục đích của dòng trên là gì?

Câu trả lời:


159

Mọi Hoạt động bạn thực hiện đều được bắt đầu thông qua một chuỗi các lệnh gọi phương thức. onCreate()là cuộc gọi đầu tiên trong số những cuộc gọi này.

Mỗi và mọi Hoạt động của bạn đều mở rộng android.app.Activitytrực tiếp hoặc bằng cách phân loại lớp con khác của Activity.

Trong Java, khi bạn kế thừa từ một lớp, bạn có thể ghi đè các phương thức của nó để chạy mã của riêng bạn trong chúng. Một ví dụ rất phổ biến về điều này là ghi đè toString()phương thức khi mở rộng java.lang.Object.

Khi chúng tôi ghi đè một phương thức, chúng tôi có tùy chọn thay thế hoàn toàn phương thức trong lớp của chúng tôi hoặc mở rộng phương thức hiện có của lớp cha. Bằng cách gọi super.onCreate(savedInstanceState);, bạn yêu cầu máy ảo Dalvik chạy mã của bạn ngoài mã hiện có trong onCreate () của lớp cha. Nếu bạn bỏ qua dòng này, thì chỉ có mã của bạn được chạy. Mã hiện tại bị bỏ qua hoàn toàn.

Tuy nhiên, bạn phải bao gồm lệnh gọi siêu này trong phương thức của mình, bởi vì nếu bạn không làm như vậy thì onCreate()mã trong đó Activitysẽ không bao giờ chạy và ứng dụng của bạn sẽ gặp phải tất cả các loại vấn đề như không có Ngữ cảnh được gán cho Hoạt động (mặc dù bạn sẽ gặp một SuperNotCalledExceptiontrước khi bạn có cơ hội để tìm ra rằng bạn không có ngữ cảnh).

Tóm lại, các lớp riêng của Android có thể vô cùng phức tạp. Mã trong các lớp khung xử lý những thứ như vẽ giao diện người dùng, dọn dẹp nhà cửa và duy trì các vòng đời của Hoạt động và ứng dụng. superlệnh gọi cho phép các nhà phát triển chạy mã phức tạp này trong hậu trường, trong khi vẫn cung cấp mức độ trừu tượng tốt cho các ứng dụng của chúng tôi.


2
một câu hỏi nữa - khi chúng ta ghi đè phương thức lớp cha thì phương thức dẫn xuất này vẫn giữ mã của phương thức lớp cha hay nó là một phương thức mới mới?
Pramod

15
Nếu bạn gọi super, mã của phương thức cha sẽ được đặt ở vị trí của super call. Nếu siêu không được gọi, nó là một phương pháp mới.
Raghav Sood

2
Raghav Sood, tôi nghĩ bạn nên thêm văn bản bình luận của mình vào câu trả lời vì nó giải thích cách sử dụng phương pháp siêu dễ hiểu hơn cho người mới bắt đầu. Ít nhất tôi hiểu nó chỉ từ nhận xét của bạn :)
Ayaz Alifov

5

* onCreate(bundle)Phương thức lớp dẫn xuất phải gọi hiện thực lớp cha của phương thức này. Nó sẽ ném ra một ngoại lệ SuperNotCalledException nếu từ khóa " super " không được sử dụng.

Để kế thừa trong Java, để ghi đè phương thức lớp cha và cũng để thực thi phương thức lớp trên, hãy sử dụng phương thức super.methodname()ghi đè lớp dẫn xuất;

Lớp Android hoạt động theo cách tương tự. Bằng cách mở rộng Activitylớp có onCreate(Bundle bundle)phương thức trong đó mã có nghĩa được viết và để thực thi mã đó trong hoạt động được xác định, hãy sử dụng từ khóa super với phương thức onCreate () như super.onCreate(bundle).

Đây là mã được viết bằng onCreate()phương thức lớp Activity và nhóm Android Dev có thể thêm một số mã có ý nghĩa hơn vào phương thức này sau đó. Vì vậy, để phản ánh các bổ sung, bạn phải gọi super.onCreate () trong Activitylớp của mình .

protected void  onCreate(Bundle savedInstanceState) {
    mVisibleFromClient = mWindow.getWindowStyle().getBoolean(
    com.android.internal.R.styleable.Window_windowNoDisplay, true);
    mCalled = true;
}

boolean mVisibleFromClient = true;

/**
 * Controls whether this activity main window is visible.  This is intended
 * only for the special case of an activity that is not going to show a
 * UI itself, but can't just finish prior to onResume() because it needs
 * to wait for a service binding or such.  Setting this to false prevents the UI from being shown during that time.
 * 
 * <p>The default value for this is taken from the
 * {@link android.R.attr#windowNoDisplay} attribute of the activity's theme.
 */

Nó cũng duy trì biến mCalledcó nghĩa là bạn đã gọi biến super.onCreate(savedBundleInstance)trong Hoạt động của mình.

final void performStart() {
    mCalled = false;
    mInstrumentation.callActivityOnStart(this);
    if (!mCalled) {
        throw new SuperNotCalledException(
            "Activity " + mComponent.toShortString() +
            " did not call through to super.onStart()");
    }
}

Xem mã nguồn tại đây.

http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/1.5_r4/android/app/Activity.java#Activity.onCreate%28android.os.Bundle%29


1

Bởi vì khi super.onCreate () nó sẽ đến lớp Activity (lớp cha của bất kỳ hoạt động nào) để tải SaveInstanceState và chúng tôi bình thường không đặt bất kỳ trạng thái phiên bản đã lưu nào, nhưng khung công tác android đã thực hiện theo cách đó, chúng tôi nên gọi cái đó.


Mã của bạn sẽ biên dịch hạnh phúc ngay cả khi bạn không gọi super.onCreate(savedInstanceState), trừ khi bạn có một số lỗi khác trong nó
Raghav Sood

1

Đó là thông tin bạn muốn được trả lại cho ứng dụng của mình, thông qua onCreate (), nếu hoạt động bị hủy và khởi động lại do một số lý do ngầm hiểu (ví dụ: không phải do người dùng nhấn nút quay lại). Cách sử dụng phổ biến nhất của onSaveInstanceState () là để xử lý các thao tác xoay màn hình, theo mặc định, các hoạt động bị hủy và tạo lại khi người dùng trượt bàn phím G1 ra.

Lý do để gọi super.onCreate (saveInstanceState) là vì mã của bạn sẽ không biên dịch theo cách khác. ;-)

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.