2014-06-09 16 views
9

Tôi đang thử nghiệm phương thức onRestoreInstanceState và khi nào (chính xác) nó được gọi. Vì vậy, tôi đã làm theo các bước sau:Tại sao không onRestoreInstanceState được gọi sau onStart?

  1. bắt đầu hoạt động của tôi. onCreate -- > onStart --> onResume đã được gọi.
  2. nhấn nút Home trên trình giả lập. onPause --> onSaveInstanceState --> onStop được gọi.
  3. Nhấp vào biểu tượng trong trình khởi chạy và khởi chạy lại hoạt động của tôi. onRestart --> onStart --> onResume đã được gọi.

mã java của tôi:

package com.test.demostate.app; 

import android.os.Bundle; 
import android.support.v7.app.ActionBarActivity; 
import android.util.Log; 


public class MainActivity extends ActionBarActivity { 
    private int visiters=0; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     Log.d("TAG","onCreate"); 

    } 

    @Override 
    protected void onPause() { 
     super.onPause(); 
     Log.d("TAG","onPause"); 
    } 

    @Override 
    protected void onStop() { 
     super.onStop(); 
     Log.d("TAG","onStop"); 
    } 

    @Override 
    protected void onStart() { 
     super.onStart(); 
     Log.d("TAG","onStart"); 
    } 

    @Override 
    protected void onRestart() { 
     super.onRestart(); 
     Log.d("TAG","onRestart"); 

    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 
     visiters++; 
     Log.d("TAG","onResume"); 
    } 

    @Override 
    protected void onSaveInstanceState(Bundle outState) { 
     super.onSaveInstanceState(outState); 
     outState.putInt("visiters",visiters); 
     Log.d("TAG",visiters+" visiters was saved "); 
    } 

    @Override 
    protected void onRestoreInstanceState(Bundle savedInstanceState) { 
     super.onRestoreInstanceState(savedInstanceState); 
     visiters=savedInstanceState.getInt("visiters"); 
     Log.d("TAG",visiters+" visiters was restored"); 
    } 

    @Override 
    protected void onDestroy() { 
     super.onDestroy(); 
     Log.d("TAG","onDestroy"); 
    } 
} 

Từ các tài liệu: Instead of restoring the state during onCreate() you may choose to implement onRestoreInstanceState(), which the system calls after the onStart() method .

Vì vậy onRestoreInstanceState được gọi

  • sau hoạt động này đã bị phá hủy onPause --> onStop --> onDestroy sau đó onCreate --> onRestoreInstanceState --> onResume (do xoay màn hình cho ví dụ)
  • sau hoạt động này đã được ngừng lại onPause --> onStop --> onRestart --> onStart --> onRestoreInstanceState --> onResume (do biểu tượng nhà cách nhấn ví dụ)

Nhưng tại sao nó không được gọi sau khi onStart?

Cảm ơn

+0

".. hệ thống gọi * sau * phương thức onStart()". - Vui lòng viết tiêu đề liên quan đến vấn đề. – user2864740

+0

@ user2864740, tiêu đề câu hỏi của tôi đã được chỉnh sửa "Tại sao không ..." –

+0

Sau bước hai, nhấn nút home lần nữa và nhấp vào trong ứng dụng của bạn đã mở. Hãy thử chạy ứng dụng của bạn trên điện thoại thông minh. –

Trả lời

1

Sau onStart() chỉ khi onSaveInstanceState() đã được gọi.

Từ các tài liệu:

Phương pháp này được gọi sau khi onStart() khi hoạt động này đang được tái khởi tạo từ một trạng thái đã lưu trước đó, đưa ra ở đây trong savedInstanceState. Hầu hết các triển khai sẽ chỉ sử dụng onCreate (Bundle) để khôi phục trạng thái của chúng, nhưng đôi khi là thuận tiện để thực hiện tại đây sau khi tất cả việc khởi tạo đã được thực hiện hoặc để cho phép các lớp con quyết định sử dụng triển khai mặc định của bạn. Việc triển khai mặc định phương pháp này thực hiện khôi phục của bất kỳ trạng thái chế độ xem nào trước đó đã bị đóng băng trước onSaveInstanceState (Bundle).

Phương thức này được gọi giữa onStart() và onPostCreate (Bundle).

Activity#onRestoreInstanceState()

+0

ok hiểu.Trong mã của tôi, tôi đã gọi cả onSaveInstanceState và onRestoreInstanceState. Và tôi đã thử nghiệm nếu onRestoreInstanceState được gọi với phương thức Log.d Nhưng không có gì được hiển thị (tôi đang sử dụng android studio 0.5.2) –

+0

@JamesDaniel Bạn đã lưu bất kỳ trạng thái nào khi ghi đè 'onSaveInstanceState()'? –

+0

có @ Code-Apprentice và bạn có thể thấy mã java của tôi –

1

Các tài liệu chính thức nói về onRestoreInstanceState (Bundle savedInstanceState):

Phương pháp này được gọi sau khi onStart() khi hoạt động này đang được tái khởi từ một trạng thái đã lưu trước đó , được cung cấp tại đây trong savedInstanceState.Hầu hết các triển khai sẽ chỉ sử dụng onCreate (Bundle) để khôi phục trạng thái của chúng, nhưng đôi khi là thuận tiện để thực hiện tại đây sau khi tất cả việc khởi tạo đã được thực hiện hoặc để cho phép các lớp con quyết định sử dụng triển khai mặc định của bạn. Việc triển khai mặc định phương pháp này thực hiện khôi phục của bất kỳ trạng thái chế độ xem nào trước đó đã bị đóng băng trước onSaveInstanceState (Bundle).

Phương thức này được gọi giữa onStart() và onPostCreate (Bundle).

Khi hoạt động được thiết lập lại?

  • Khi định hướng thiết bị thay đổi hoạt động của bạn được khởi tạo lại.
  • Khi có một hoạt động khác ở phía trước ứng dụng của bạn và hệ điều hành giết ứng dụng của bạn vì một số lý do, có thể là tài nguyên miễn phí ví dụ.

Hãy thử thay đổi hướng của giả lập:

Ctrl + F12

Nhìn các answer về thành viên @GAThrawn

Nhấn nút Home khi rời khỏi ứng dụng của bạn và chuyển đến màn hình chính, trong khi rời khỏi ứng dụng của bạn đang chạy ẩn. Điều này hơi giống như chuyển đổi giữa các cửa sổ trên PC Windows.

Trừ khi điện thoại của bạn đang ở mức thấp về tài nguyên như bộ nhớ nó sẽ bắt đầu đóng các ứng dụng đang chạy ở chế độ nền, do đó điện thoại của bạn có đủ nguồn lực cho những gì bạn đang cố gắng để làm gì bây giờ. Trò chơi thường nằm trong số các ứng dụng đầu tiên điện thoại sẽ "giết" để tiết kiệm tài nguyên vì chúng thường sử dụng nhiều bộ nhớ và CPU hơn các ứng dụng khác. Đây là lý do tại sao đôi khi trò chơi của bạn vẫn đang chạy bị tạm dừng và đôi khi Android đã đóng nó cho bạn.

Vì vậy, tôi không thể chứng minh lập luận thứ hai của tôi, vì nó quyết định nó là hệ điều hành, ít nhất là không biết làm thế nào để chứng minh.

+0

bạn chỉ chứng minh đề xuất đầu tiên (sau khi hoạt động đã bị hủy) và điều đó là ổn. Nhưng làm thế nào về đề nghị thứ hai (Sau khi hoạt động đã được ngừng lại mà không bị phá hủy)? –

+0

Tôi đã chỉnh sửa câu trả lời của mình, hãy xem. Xin vui lòng chấp nhận câu trả lời của tôi nếu nó có ích cho anh ta và chữa lành câu hỏi của bạn. –

+0

Hãy thử bấm nút Home và giết ứng dụng của bạn, sau khi mở lại ứng dụng của bạn, hãy xem điều này chứng minh đối số thứ hai của tôi. –

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