What onCreate (Gói đã lưuInstanceState)


Câu trả lời:


106

Nếu bạn lưu trạng thái của ứng dụng trong một gói (thường là dữ liệu động, không liên tục onSaveInstanceState), nó có thể được chuyển trở lại onCreatenếu hoạt động cần được tạo lại (ví dụ: thay đổi hướng) để bạn không mất dữ liệu này trước đó thông tin. Nếu không có dữ liệu nào được cung cấp, savedInstanceStatelà null.

... bạn nên sử dụng phương thức onPause () để ghi bất kỳ dữ liệu liên tục nào (chẳng hạn như các chỉnh sửa của người dùng) vào bộ nhớ. Ngoài ra, phương thức onSaveInstanceState (Bundle) được gọi trước khi đặt hoạt động ở trạng thái nền như vậy, cho phép bạn lưu bất kỳ trạng thái phiên bản động nào trong hoạt động của mình vào Gói đã cho, để sau này nhận được trong onCreate (Gói) nếu hoạt động cần được tạo lại. Xem phần Vòng đời quy trình để biết thêm thông tin về cách vòng đời của quy trình gắn liền với các hoạt động mà nó đang lưu trữ. Lưu ý rằng điều quan trọng là phải lưu dữ liệu liên tục trong onPause () thay vì onSaveInstanceState (Bundle) vì phần sau không phải là một phần của các lệnh gọi lại vòng đời, vì vậy sẽ không được gọi trong mọi tình huống như được mô tả trong tài liệu của nó.

nguồn


2
các hoạt động khác có chia sẻ cùng một Gói không ?, Nếu tôi bắt đầu một hoạt động khác, nó có vượt qua Gói từ hoạt động đầu tiên không?
Francisco Corrales Morales

17

onCreate(Bundle savedInstanceState)bạn sẽ nhận được Bundlegiá trị rỗng khi hoạt động bắt đầu lần đầu tiên và nó sẽ được sử dụng khi hướng hoạt động thay đổi .......

http://www.gitshah.com/2011/03/how-to-handle-screen-orientation_28.html

Android cung cấp một cách khác để đạt được điều này. Để đạt được điều này, chúng ta phải ghi đè một phương thức được gọi onSaveInstanceState(). Nền tảng Android cho phép người dùng lưu bất kỳ trạng thái phiên bản nào. Trạng thái phiên bản có thể được lưu trong Gói. Gói được truyền dưới dạng đối số cho phương thức onSaveInstanceState.

chúng ta có thể tải trạng thái phiên bản đã lưu từ Gói được truyền dưới dạng đối số cho onCreatephương thức. Chúng ta cũng có thể tải trạng thái phiên bản đã lưu trong onRestoreInstanceStatephương thức. Nhưng tôi sẽ để điều đó cho độc giả tìm hiểu.


11
savedInstanceStatesẽ không phải nullnếu onSavedInstanceState()trước đó đã được gọi. thay đổi hướng chỉ là một ví dụ mà điều này có thể xảy ra.
Alex Lockwood,

1
@AlexLockwood, tôi đang cố gắng nghĩ đến tất cả các tình huống mà điều này có thể xảy ra. Có tài liệu nào không? Một trường hợp tôi có thể nghĩ đến là nếu người dùng chuyển đổi ứng dụng và quay lại, nhưng hoạt động đã bị hủy để khôi phục tài nguyên. Trong trường hợp này, android sẽ tạo lại hoạt động với một gói nếu onSaveInsanceState () bị ghi đè, phải không?
batbrat

1
@batbrat Vâng ... nhận xét tôi đã đưa ra (gần hai năm trước) không hoàn toàn chính xác. Tôi đoán cách tốt nhất để đặt nó là Bundleđối số onCreate(Bundle)sẽ không phải là nullnếu và chỉ khi phương thức Activitycủa nó onSaveInstanceStateđã được gọi trước đó. Điều này xảy ra trong quá trình thay đổi hướng ... và cũng xảy ra khi hoạt động quay trở lại sau khi bị hệ điều hành loại bỏ và khi bạn kích hoạt bất kỳ thay đổi cấu hình nào khác mà thiết bị của bạn quan tâm.
Alex Lockwood

Cảm ơn Alex đã làm rõ. Thật tốt khi có một số rõ ràng về chủ đề. Tôi đã quên về những thay đổi cấu hình ngoài công tắc định hướng nói riêng.
batbrat

15

Như Dhruv Gairola đã trả lời, bạn có thể lưu trạng thái của ứng dụng bằng cách sử dụng Bundle saveInstanceState. Tôi đang cố gắng đưa ra một ví dụ rất đơn giản mà những người mới học như tôi có thể hiểu một cách dễ dàng.

Giả sử, bạn có một phân đoạn đơn giản với một TextView và một nút. Mỗi lần bạn nhấp vào nút, văn bản sẽ thay đổi. Bây giờ, hãy thay đổi hướng của thiết bị / trình giả lập của bạn và nhận thấy rằng bạn đã mất dữ liệu (có nghĩa là dữ liệu đã thay đổi sau khi nhấp vào bạn nhận được) và phân đoạn bắt đầu lại như lần đầu tiên. Bằng cách sử dụng Bundle saveInstanceState, chúng ta có thể loại bỏ điều này. Nếu bạn nhìn vào cuộc sống của mảnh vỡ. Fragment Lifecylce bạn sẽ nhận được rằng một phương thức "onSaveInstanceState" được gọi khi phân mảnh sắp bị phá hủy.

Vì vậy, chúng ta có thể lưu trạng thái có nghĩa là giá trị văn bản đã thay đổi vào gói đó như thế này

 int counter  = 0;
 @Override
 public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putInt("value",counter);
 }

Sau khi bạn thực hiện định hướng, phương thức "onCreate" sẽ được gọi phải không? vì vậy chúng tôi chỉ có thể làm điều này

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    if(savedInstanceState == null){
        //it is the first time the fragment is being called
        counter = 0;
    }else{
        //not the first time so we will check SavedInstanceState bundle
        counter = savedInstanceState.getInt("value",0); //here zero is the default value
    }
}

Bây giờ, bạn sẽ không mất giá trị của mình sau khi định hướng. Giá trị đã sửa đổi sẽ luôn được hiển thị.


Lưu ý rằng điều này cũng đúng trên Activity. Bạn có thể giải thích thêm về sự khác biệt của (Gói hoạt động) và Gói phân mảnh?
laalaguer

Bạn có thể hiểu rõ từ các vòng đời của hoạt động và phân đoạn nơi một hoạt động có thể hiển thị nhiều phân đoạn cùng một lúc. Vì vậy, sự khác biệt cơ bản là bạn có thể muốn lưu một số giá trị cho tất cả các phân đoạn của một hoạt động, sau đó bạn sẽ sử dụng gói hoạt động nếu không bạn nên sử dụng gói phân đoạn nếu nó dành cho phân đoạn cụ thể.
Asad

5

Hàm onCreate (Bundle saveInstanceState) trong Android:

1) Khi một Activity lần đầu tiên được gọi hoặc khởi chạy thì phương thức onCreate (Bundle saveInstanceState) có trách nhiệm tạo hoạt động.

2) Khi nào hướng (tức là từ ngang sang dọc hoặc dọc sang ngang) của hoạt động bị thay đổi hoặc khi một Hoạt động bị bất kỳ Hệ điều hành nào buộc phải chấm dứt thì đối tượng SaveInstanceState tức là đối tượng của Lớp gói sẽ lưu trạng thái của một Hoạt động.

3) Sau khi Định hướng được thay đổi thì onCreate (Bundle đã lưuInstanceState) sẽ gọi và tạo lại hoạt động và tải tất cả dữ liệu từ SaveInstanceState.

4) Về cơ bản, lớp Bundle được sử dụng để lưu trữ dữ liệu hoạt động bất cứ khi nào điều kiện trên xảy ra trong ứng dụng.

5) onCreate () không bắt buộc đối với các ứng dụng. Nhưng lý do nó được sử dụng trong ứng dụng là vì phương thức đó là nơi tốt nhất để đặt mã khởi tạo.

6) Bạn cũng có thể đặt mã khởi tạo của mình trong onStart () hoặc onResume () và khi ứng dụng của bạn tải đầu tiên, nó sẽ hoạt động giống như trong onCreate ().


4

onCreate(Bundle)được gọi khi hoạt động bắt đầu lần đầu tiên. Bạn có thể sử dụng nó để thực hiện khởi tạo một lần như tạo giao diện người dùng. onCreate()nhận một tham số là giá trị rỗng hoặc một số thông tin trạng thái được lưu trước đó bởi onSaveInstanceState.


0

onCreate (Bundle saveInstanceState) được gọi và saveInstanceState sẽ không rỗng nếu Hoạt động của bạn và nó bị kết thúc trong một kịch bản (dạng xem trực quan) được mô tả ở trên. Sau đó, ứng dụng của bạn có thể lấy (bắt) dữ liệu từ SaveInstanceState và tạo lại Hoạt động của bạn

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.