2010-08-04 25 views
19

Thông tin: Thiết bị của tôi là Nexus One với 2.2 và tôi đã thử nghiệm hai dự án, một trên 1.5 và một trên 2.1.Sự cố khi hiểu về vòng đời khi màn hình tắt và trên

Sự cố: Tôi gặp khó khăn khi hiểu vòng đời của ứng dụng khi màn hình tắt và bật.

Dưới đây là đầu ra của tôi

// activity starts 
08-04 17:24:17.643: ERROR/PlayActivity(6215): onStart executes ... 
08-04 17:24:17.643: ERROR/PlayActivity(6215): onResume executes ... 
// screen goes off 
08-04 17:24:28.943: ERROR/PlayActivity(6215): onPause executes ... 
08-04 17:24:32.113: ERROR/PlayActivity(6215): onStop executes ... 
08-04 17:24:32.113: ERROR/PlayActivity(6215): onDestroy executes ... 
08-04 17:24:32.983: ERROR/PlayActivity(6215): onStart executes ... 
08-04 17:24:32.983: ERROR/PlayActivity(6215): onResume executes ... 
08-04 17:24:32.983: ERROR/PlayActivity(6215): onPause executes ... 
// screen goes on 
08-04 17:24:47.683: ERROR/PlayActivity(6215): onResume executes ... 
// lock removed 
08-04 17:24:56.943: ERROR/PlayActivity(6215): onPause executes ... 
08-04 17:24:59.663: ERROR/PlayActivity(6215): onStop executes ... 
08-04 17:24:59.663: ERROR/PlayActivity(6215): onDestroy executes ... 
08-04 17:25:00.943: ERROR/PlayActivity(6215): onStart executes ... 
08-04 17:25:00.943: ERROR/PlayActivity(6215): onResume executes ... 

Tôi hoàn toàn bối rối. Tại sao khởi động lại hoạt động khi màn hình tắt? Và tại sao dừng lại và khởi động lại nó khi màn hình đã được bật và chỉ có khóa đã được gỡ bỏ?

Để đảm bảo rằng tôi không làm gì sai, tôi đã tạo một dự án mới chỉ với hoạt động này. Đầu ra là giống hệt nhau ...

public class LifeCycleTest extends Activity { 

    private final static String DEBUG_TAG = "FirstLifeLog"; 

    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     Log.e(DEBUG_TAG, "onCreate executes ..."); 
     setContentView(R.layout.main); 
    } 

    protected void onRestart() { 
     super.onRestart(); 
     Log.e(DEBUG_TAG, "onRestart executes ..."); 
    } 

    protected void onStart() { 
     super.onStart(); 
     Log.e(DEBUG_TAG, "onStart executes ..."); 
    } 

    protected void onResume() { 
     super.onResume(); 
     Log.e(DEBUG_TAG, "onResume executes ..."); 
    } 

    protected void onPause() { 
     super.onPause(); 
     Log.e(DEBUG_TAG, "onPause executes ..."); 
    } 

    protected void onStop() { 
     super.onStop(); 
     Log.e(DEBUG_TAG, "onStop executes ..."); 
    } 

    protected void onDestroy() { 
     super.onDestroy(); 
     Log.e(DEBUG_TAG, "onDestroy executes ..."); 
    } 
} 

Có ai có ý tưởng không?

Cập nhật từ ngày hôm nay (không hiểu tại sao nó cư xử không giống như lần trước, có lẽ tài nguyên miễn phí hơn?)

// activity starts 
08-09 12:14:03.122: ERROR/FirstLifeLog(15406): onCreate executes ... 
08-09 12:14:03.132: ERROR/FirstLifeLog(15406): onStart executes ... 
08-09 12:14:03.132: ERROR/FirstLifeLog(15406): onResume executes ... 
// screen off 
08-09 12:14:07.412: ERROR/FirstLifeLog(15406): onPause executes ... 
// screen on 
08-09 12:14:11.722: ERROR/FirstLifeLog(15406): onResume executes ... 
// no log for removed screen lock 
+0

Điều kỳ lạ là tôi thấy các cuộc gọi onDestroy(), onStart(), onResume() nhưng tôi không thấy bất kỳ cuộc gọi onCreate() nào. Tôi cũng quan tâm đến việc hiểu hành vi. –

+0

Thats vì onCreate của tôi đã bỏ lỡ bản ghi nhật ký ... Ngoài ra tôi đã thử lại ngày hôm nay ... bây giờ trò chơi của tôi có hành vi tương tự, nhưng thử nghiệm có hành vi mong đợi (xem cập nhật) – WarrenFaith

Trả lời

-2

Xem Activity Lifecycle tài liệu cho một mô tả tốt của vòng đời, với sơ đồ.

Rất có thể hoạt động của bạn bị giết khi màn hình tắt để tiết kiệm tài nguyên (nguồn pin). Như các tiểu bang tài liệu, bạn về cơ bản có thể bị giết bất cứ lúc nào mà Android muốn tài nguyên miễn phí. Vì vậy, bạn nên luôn luôn thiết kế các hoạt động của bạn để có thể được dừng lại và khởi động lại bất cứ lúc nào.

+1

Tôi biết tài liệu vòng đời. Việc giết để tiết kiệm tài nguyên không thể là lý do vì nó được khởi động lại ngay lập tức. Và đó chính xác là vấn đề của tôi. Tôi không hiểu tại sao nó bị giết và ngay lập tức khởi động lại. Tôi lưu trữ rất nhiều trong cơ sở dữ liệu khi onDestroy() được kích hoạt ... Ứng dụng không cần thiết hủy kết quả trong thời gian phản hồi dài ... – WarrenFaith

+0

Tôi hiểu ... Tôi chưa thực sự thử nghiệm lý thuyết này, nhưng tài liệu thảo luận về một số configChanges: http://developer.android.com/reference/android/R.attr.html#configThay đổi khiến ứng dụng được khởi động lại. Có thể bật và tắt màn hình phù hợp với uiMode? Bất kể, bạn có thể muốn xem liệu bạn có thể làm cho onDestroy hiệu quả hơn không. Có thể tiết kiệm nhà nước trong suốt, vì vậy có ít hơn để tiết kiệm tại thời điểm đó? –

0

Thats the way. Nếu bạn đọc vòng đời hoạt động, bạn sẽ thấy rằng các bước được đặt hàng khá nhiều theo cách đó. Nó không chỉ khi màn hình của bạn đi và tắt mà còn khi bạn chnage quặng của điện thoại. Android đã tạo lại hoạt động theo chính xác các bước bạn đã đề cập ở trên. Hãy thử xoay màn hình, bạn sẽ thấy sau đó! =)

+0

Tôi nghĩ rằng di sản của bạn rất giống với tình huống tôi đã đề cập ở trên. Nó phải có một cái gì đó với các quan điểm được thay đổi để hoạt động bị giết và tái tạo để chạy không có màn hình! Chỉ là phỏng đoán của tôi ... – Shouvik

30

Tôi gặp vấn đề tương tự với trò chơi của riêng mình. Trò chơi của tôi chỉ hoạt động ở chế độ ngang và khi tắt màn hình, trình bảo vệ màn hình Android sẽ điều khiển (ở chế độ dọc), do đó gửi một directionChange phá hủy và tạo lại hoạt động.

Một giải pháp đơn giản là để tuyên bố rằng bạn sẽ quản lý bản thân màn hình định hướng thay đổi:

<activity ... android:configChanges="orientation" ... > 

này là khá dễ dàng nếu hoạt động của bạn được tuyên bố là chỉ cảnh quan (bạn phải làm gì), nhưng có thể nhận được khó khăn hơn nếu hoạt động của bạn có thể xoay ...

+0

Cảm ơn! Có thể đã đưa tôi một thời gian để tìm ra điều đó. Có thể xác nhận whats happing với ứng dụng phong cảnh: tái tạo một lần để thay đổi để chân dung, tái tạo lần thứ 2 sau khi trở lại từ màn hình tắt. Ngoài ra các công cụ configChanges hoạt động. Điều này thực sự phải được ghi rõ (nổi bật). – oberstet

+3

Điều này có lẽ nên được thiết kế như là câu trả lời được chấp nhận, như mặc dù nó đến một tháng sau đó nó xác định nguyên nhân của những gì còn lại bí ẩn trong khác. –

+0

Có ai biết * cách * phát hiện vòng đời như vậy không? Tôi có nghĩa là phát hiện rằng onStop được gọi chỉ vì màn hình tắt và onStart sẽ sớm được thực hiện. – Snicolas

4

Ruben's answer hoàn toàn chính xác, nhưng chỉ khi ứng dụng của bạn nhắm mục tiêu cấp API 12 hoặc thấp hơn.

Nhưng kể từ mức API 13, thêm vào tùy chọn orientation, bạn phải khai báo các tùy chọn screenSize, bởi vì nó cũng được kích hoạt khi một thiết bị chuyển mạch giữa các bức chân dung và định hướng phong cảnh:

<activity ... android:configChanges="orientation|screenSize" ... > 

Nếu không , hoạt động của bạn sẽ vẫn được tái tạo thêm thời gian khi màn hình tắt trên API 13 hoặc nền tảng cao hơn.

Để tham khảo, xem API docs, android:configChanges ghi chú phần.

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