Android - Trình tạo hoạt động so với onCreate


88

Tôi hiểu rằng Android Activitiescó các vòng đời cụ thể và điều đó onCreatenên được ghi đè và sử dụng để khởi tạo, nhưng chính xác thì điều gì xảy ra trong hàm tạo? Có trường hợp nào khi bạn cũng có thể / nên ghi đè lên phương thức Activitykhởi tạo, hoặc bạn không bao giờ nên chạm vào nó không?

Tôi giả định rằng phương thức khởi tạo không bao giờ được sử dụng vì các tham chiếu đến Activitieskhông được dọn dẹp hoàn toàn (do đó cản trở bộ thu gom rác) và điều onDestroyđó ở đó cho mục đích đó. Điều này có chính xác?


2
Còn thực tế là Android có thể phá hủy / tạo lại Hoạt động của bạn bất cứ lúc nào? Bạn không biết liệu phương thức khởi tạo sẽ được gọi khi đó và ngay cả khi - phương thức khởi tạo nào sẽ được gọi ... (điều tương tự cũng áp dụng cho các Fragment và đây là lý do tại sao mọi Fragment phải triển khai một phương thức khởi tạo mặc định trống).
Marian Paździoch

Câu trả lời:


34

Tôi không thể nghĩ ra bất kỳ lý do chính đáng nào để làm bất cứ điều gì trong hàm tạo. Bạn không bao giờ trực tiếp xây dựng một hoạt động, vì vậy bạn không thể sử dụng nó để chuyển các tham số. Nói chung, chỉ cần thực hiện những việc trong onCreate.


73
onCreate () ngăn bạn sử dụng các trường cuối cùng.
Gili

2
Nhưng OnCreate không chỉ được gọi một lần, tôi có nhầm không? Khi tôi thay đổi hướng màn hình và lưng bằng tay của tôi, mỗi lần load lại hoạt động, onCreate được gọi là
fercis

2
@fercis onCreate chỉ được gọi một lần cho mỗi trường hợp mà tôi tin tưởng. Khi xoay thiết bị, phiên bản Activity đó sẽ bị hủy và một phiên bản mới được tạo, gọi onCreate. Điều đó nói rằng, tôi khá chắc chắn rằng bạn không thể khởi tạo các trường cuối cùng trong onCreate bởi vì Java không biết rằng onCreate sẽ chỉ được gọi một lần (và thực sự, bạn có thể tự gọi lại nó trong mã của mình - những điều tồi tệ sẽ xảy ra, nhưng nó vẫn sẽ biên dịch) và vì vậy cách duy nhất để khởi tạo các trường cuối cùng sẽ là trong hàm tạo.
Harvey Adcock

Khi nào thì sự kiện OnCreate bắt đầu chạy chính xác? Khi tôi đặt một điểm ngắt ở đầu sự kiện OnCreate để ứng dụng chạy và tải hoạt động lên màn hình thì điểm ngắt sẽ kích hoạt và ứng dụng sẽ tạm dừng. Tôi cần một sự kiện về hoạt động sẽ kích hoạt chính xác trước khi hoạt động được khởi chạy và khởi chạy.
Mohammad Afrashteh

@Cheryl Simon, Bạn đã nói rằng bạn không bao giờ tạo một hoạt động trực tiếp, vậy ai tạo ra hoạt động?
Sreekanth Karumanaghat

7

Một lý do chính đáng để đưa mọi thứ vào hàm tạo như nhận xét của Gili đã nêu là việc sử dụng các trường cuối cùng.

Tuy nhiên, nếu bạn khởi tạo mọi thứ trong hàm khởi tạo, thì tuổi thọ của đối tượng sẽ lâu hơn một chút, mặc dù tôi không nghĩ nhiều vì onCreatenó sẽ được gọi ngay sau đó.

Mặc dù điều đó đi ngược lại lý tưởng của tôi, nhưng tôi tránh hàm tạo để khởi tạo các thành viên hoạt động và dựa vào onResume()onPause()các tài nguyên mà ứng dụng của tôi đang xử lý.

onCreate()tôi thường sử dụng nó để thực hiện ánh xạ chế độ xem tới các biến cục bộ. Mặc dù android-annotations đã làm điều đó cho tôi, vì vậy tôi hiếm khi có onCreate()phương pháp cho Hoạt động của mình. Tôi vẫn sử dụng nó trong Dịch vụ.

Tuy nhiên, nếu bạn nhìn vào các thành viên, bạn có thể đang khởi tạo

  • họ sẽ có một phương thức "đóng" mà bạn phải gọi vào thời điểm thích hợp (onResume hoặc onPause)

  • chúng sẽ là một phần của chế độ xem có nghĩa là nó cần được khởi tạo sau đó onCreate cần được gọi

  • chúng là các hằng số không cần phải đặt trong hàm tạo, chỉ cần một cuối cùng tĩnh sẽ làm được. Điều này bao gồm các hằng số Paint và Path có thể được khởi tạo bằng một khối tĩnh


1
Ý bạn là gì? Tuổi thọ của đồ vật sẽ dài hơn một chút? Tôi cách nào? Vì nếu bạn chuyển các initalisations này vào onCreate, chẳng hạn, điều đó vẫn mất thời gian tương tự. Không có sự khác biệt về tuổi thọ mà tôi có thể xác định. Bạn có thể mở rộng thêm một chút về vấn đề này không, vì tôi cảm thấy, là một người mới tương đối, tôi có thể thiếu một cái gì đó quan trọng ở đây.
RichieHH

2
@RichieHH bởi còn Archimedes chỉ đang nói rằng các nhà xây dựng được gọi trước khi onCreate () và vì vậy bất cứ được thực hiện có sẽ vẫn kiên trì (hơi) dài hơn bằng cách khác bởi thời gian hoạt động bị phá hủy
pho79

6

Bây giờ tôi đang gặp trường hợp cần ghi đè hàm tạo. Trên thực tế, tôi có một số hoạt động có cấu trúc giống nhau. Vì vậy, thay vì tạo nhiều hoạt động, tôi sẽ tạo một hoạt động "Chính" và những hoạt động khác sẽ kế thừa hoạt động này. Vì vậy, tôi cần ghi đè phương thức khởi tạo của hoạt động con để có thể khởi tạo một số biến sẽ được sử dụng trong các phương thức oncreate.

Nói cách khác, hàm tạo làm cho bạn mô phỏng một "masteractivity" có thể được sử dụng lại bằng cách kế thừa!


15
Tôi biết điều này là cũ nhưng lợi ích ở đây là gì khi chỉ triển khai lập trình siêu trường trong đó onCreate (). Dù sao thì bạn cũng sẽ gọi super.onCreate () từ đứa trẻ.
Andrew G

Vì vậy, chỉ bằng cách chuyển các Giá trị khác nhau cho cùng một KEY trong gói hoặc mục đích trong khi khởi chạy hoạt động và do đó sử dụng cùng một Hoạt động, bạn có thể xác định nội dung sẽ hiển thị trong Hoạt động tùy thuộc vào giá trị nhận được. Lý do cụ thể mà bạn tìm đến các nhà xây dựng là gì? Hoặc nếu không, giữ phần không thay đổi của Hoạt động chung và đối với phần còn lại của phần thay đổi, bạn có thể đã tạo Phân đoạn.
Nayanesh Gupte

0

Bạn cần ghi đè Constructor khi hoạt động của bạn có các tham số tùy chỉnh hoặc bạn muốn theo dõi các cuộc gọi từ các lớp kế thừa từ đó.


1
Bạn có thể nói rõ hơn về điều này? Những gì bạn mô tả nghe có vẻ thú vị, nhưng nó hơi mơ hồ. Cảm ơn!
thần tượng

3
Giả sử bạn cần tạo một lớp Hoạt động tùy chỉnh có 2 tham số trở lên. Bạn chỉ cần sử dụng Constructor, bạn không thể làm điều đó thông qua onCreate và các tính năng bổ sung. Nó có ích gì không?
Pentium 10

1
Có thể tôi cần một cái riêng. Giả sử tôi muốn tạo một thành phần tùy chỉnh, chẳng hạn như một bộ chọn liên hệ tùy chỉnh. Để có được, startActivityForResulttôi phải bao gồm một phương thức khởi tạo riêng trong thành phần tùy chỉnh của mình, ngay cả khi hoạt động đó sẽ không bao giờ được khởi chạy và không có phần tử hiển thị, tôi chỉ sử dụng nội dung kết quả của nó.
Pentium 10

6
Tôi sẽ nói rằng điều đó không có ý nghĩa với tôi @Pentium, không phải là không có ví dụ về mã.
Blundell

Tôi nghĩ một lợi thế của việc thực hiện mọi thứ thông qua hàm tạo là có một hoạt động "khuôn mẫu" có thể nhận các tham số mà một lớp kế thừa có thể tận dụng. Ví dụ: nếu bạn có hai hoạt động chỉ khác nhau về một số thuộc tính, chẳng hạn như R.id.cameraSurface, R.id.videoSurface thì bạn có thể tạo một phương thức khởi tạo sẽ nhận tham số gọi là AbstractResourceActivity và sau đó bạn có CameraActivity đã được đăng ký trên tệp kê khai mở rộng AbstractResourceActivity chuyển trong ID tài nguyên.
Archimedes Trajano
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.