2012-05-30 26 views
96

Bất kỳ ai cũng có thể giúp tôi biết về Bundle savedInstanceState trong onCreate(Bundle savedInstanceState) Tôi là người mới sử dụng trong Android. Tôi cố gắng hiểu nó từ developer.android.com. Nhưng tôi không thể hiểu được. Bất cứ ai có thể đơn giản hóa nó?Có gì trênCreate (Bundle savedInstanceState)

+2

Đây là video hay: https://www.youtube.com/watch?v=kkYIMZw9gzQ –

Trả lời

91

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

... 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ư 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 là , cho phép bạn tiết kiệm bất kỳ trạng thái thể hiện động nào trong hoạt động của mình vào Gói đã cho, sau này được 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 được gắn với hoạt động mà nó đang lưu trữ. Lưu ý rằng điều quan trọng là lưu dữ liệu liên tục trong onPause() thay vì onSaveInstanceState (Bundle) vì sau này không phải là một phần của cuộc 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ó.

source

+1

các hoạt động khác có 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? –

12

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

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

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

chúng tôi có thể tải trạng thái phiên bản đã lưu từ Gói được chuyển làm đối số cho phương thức onCreate. Chúng tôi cũng có thể tải trạng thái mẫu đã lưu theo phương thức onRestoreInstanceState. Nhưng tôi sẽ để điều đó cho độc giả tìm ra.

+8

'savedInstanceState' sẽ không phải' '' 'nếu' onSavedInstanceState() 'trước đây được gọi. thay đổi định hướng chỉ là một ví dụ trong đó điều này có thể xảy ra. –

+0

@ AlexLockwood, tôi đang cố gắng nghĩ về 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 ví dụ tôi có thể nghĩ là nếu người dùng chuyển các ứng dụng và quay lại, nhưng hoạt động đã bị phá 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 Có ... 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à đối số 'Bundle' vào' onCreate (Bundle) 'sẽ không' '' '' 'nếu và chỉ khi' Activity' có phương thức 'onSaveInstanceState' trước đó được gọi. Điều này xảy ra trong khi thay đổi hướng ... và cũng xảy ra khi hoạt động trở lại sau khi bị hệ điều hành giết và khi bạn kích hoạt bất kỳ thay đổi cấu hình nào khác trên thiết bị của mình. –

3

onCreate(Bundle) được gọi khi hoạt động là người đầu tiên khởi động. 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() lấy một tham số hoặc là null hoặc một số thông tin trạng thái đã được lưu trước đó bởi onSaveInstanceState.

0

onCreate (Bundle savedInstanceState) được gọi và lưuInstanceState sẽ không null nếu Activity của bạn và nó đã bị chấm dứt trong một kịch bản (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ừ savedInstanceState và tạo lại Hoạt động

7

Khi 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 savedInstanceState. Tôi đang cố gắng đưa ra một ví dụ rất đơn giản mà những người học mới như tôi có thể hiểu một cách dễ dàng.

Giả sử, bạn có một đoạn đơn giản với TextView và nút.Mỗi lần bạn nhấp vào nút, văn bản sẽ thay đổi. Bây giờ, thay đổi hướng của thiết bị/giả lập và thông báo rằng bạn đã mất dữ liệu (nghĩa là dữ liệu đã thay đổi sau khi bạn nhấp vào) và đoạn bắt đầu lại như lần đầu tiên. Bằng cách sử dụng Bundle savedInstanceState, chúng tôi có thể loại bỏ điều này. Nếu bạn có một cái nhìn vào cyle 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 mảnh vỡ sắp bị hủy.

Vì vậy, chúng ta có thể tiết kiệm nhà nước có nghĩa là giá trị văn bản thay đổi vào đó bó 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 các định hướng phương pháp "onCreate" sẽ được gọi đúng không? vì vậy chúng tôi chỉ có thể thực hiện đ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ị sau khi định hướng. Giá trị được sửa đổi luôn được hiển thị.

+0

Lưu ý rằng điều này cũng đúng với Hoạt động. Bạn có thể giải thích thêm về sự khác biệt của (Bundle of Activity) và Bundle of Fragment không? – laalaguer

+0

Bạn có thể hiểu rõ hơn từ vòng đời của hoạt động và đoạn mà một hoạt động có thể hiển thị nhiều đoạn tại một thời điểm. Do đó, 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 hoạt động. sẽ sử dụng bó hoạt động nếu không u nên sử dụng bó mảnh nếu nó là cho đoạn cụ thể. – Asad

1

onCreate (Bundle savedInstanceState) Chức năng trong Android:

1) Khi một Hoạt động cuộc gọi đầu tiên hoặc đưa ra sau đó onCreate (Bundle savedInstanceState) phương pháp có trách nhiệm để tạo ra hoạt động này.

2) Khi định hướng bao giờ (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 Hoạt động bị chấm dứt mạnh mẽ bởi bất kỳ Hệ điều hành nào thì đối tượng LưuInstanceState tức là lớp Bundle sẽ lưu trạng thái của Hoạt động.

3) Sau khi định hướng thay đổi sau đó onCreate (Bundle savedInstanceState) sẽ gọi và tạo lại hoạt động và tải tất cả dữ liệu từ savedInstanceState.

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 xảy ra tình trạng trên xảy ra trong ứng dụng.

5) onCreate() không bắt buộc đối với ứng dụng. Nhưng lý do nó được sử dụng trong ứng dụng là bởi vì phương pháp đó 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 trong onStart() hoặc onResume() và khi ứng dụng của bạn tải trước, nó sẽ hoạt động giống như trong onCreate().

Các vấn đề liên quan