2010-01-09 26 views
17

Ok, vì vậy tôi đọc về cách Android xử lý "thay đổi cấu hình" - bằng cách hủy Hoạt động đang hoạt động.cấu hình đã thay đổi (thay đổi định hướng) và phá hủy Hoạt động - đây có phải là cách mà nó được cho là hoạt động không?

Câu hỏi đầu tiên Tôi thực sự muốn biết từ Nhóm Android - tại sao? Tôi sẽ đánh giá cao một cách giải thích về cách thức lý luận đã xảy ra, vì tôi không hiểu nó =)

Trong mọi trường hợp, thực tế là hành động theo cách đó khiến tất cả chúng ta thấy như thế, trong một thế giới đau đớn.

Giả sử bạn có Hoạt động trình bày một số EditText: s, hộp kiểm, v.v. Nếu Người dùng bắt đầu điền biểu mẫu đó với văn bản/dữ liệu và sau đó thay đổi hướng (hoặc nhận Phonecall), thì tất cả đều nhập Người dùng đã biến mất. Tôi havent tìm thấy bất kỳ cách nào để bảo tồn nhà nước. Điều đó buộc chúng tôi phải viết mã cực kỳ đau đớn để không mất tất cả dữ liệu. Như tôi thấy, bạn cần một lớp "không hoạt động" khác (hoặc "giá trị giữ" lớp có lẽ) có một trường cho mỗi "phần tử biểu mẫu" (EditText, hộp kiểm, v.v ...).

Đối với mỗi "phần tử biểu mẫu" tồn tại, bạn cần phải đính kèm Sự kiện như "onChanged" (hoặc onTextChanged hoặc một cái gì đó tương tự) cập nhật trường tương ứng trong lớp "giữ giá trị" chắc chắn rằng đối với mỗi ký tự đơn bạn nhập (trong EditText chẳng hạn) sẽ được lưu cùng một lúc.

lẽ bạn có thể sử dụng một số người nghe (như "onDestroy" hoặc một cái gì đó) và sau đó điền vào lớp giá trị gia nắm giữ với dữ liệu ...

Tôi cũng đã tìm thấy this piece of info nơi họ nói về việc sử dụng Bundle, onSaveInstanceState onRestoreInstanceState, nhưng điều đó cũng có nghĩa là lập trình viên phải lưu thủ công và sau đó đặt lại các giá trị vào đúng vị trí? Cách tiếp cận này hơi lộn xộn hơn các đề xuất của tôi ở trên, nhưng vẫn không đẹp lắm ...

Bây giờ, ai đó có thể nói với tôi rằng tôi hoàn toàn sai và rằng đây không phải là cách hoạt động và tôi đã bỏ lỡ một số thông tin quan trọng? ;-)

Kính trọng

+1

Khung tự động xử lý lưu và khôi phục một số trạng thái; phần còn lại bạn phải tự làm trong các phương thức như 'onPause' và' onResume'. Tôi biết rất khó để có được đầu của bạn xung quanh lúc đầu, nhưng bạn thực sự cần phải biết vòng đời của một Hoạt động: http://developer.android.com/guide/topics/fundamentals.html#actlife Thay đổi cấu hình như xoay màn hình cần phải bắt đầu lại vì họ phải bố trí lại hoàn toàn màn hình. Tôi chắc chắn một người khác sẽ đến và để lại một câu trả lời đúng đắn. :) –

+0

Câu trả lời hàng đầu trong câu hỏi trước bạn đã liên kết để tổng hợp nó khá tốt. Cách dễ nhất để xem những gì là hoặc không được lưu trong khi quay hoặc một cuộc gọi điện thoại, vv là để thử nó trong giả lập! –

+1

Tôi không hiểu lý do tại sao bố cục lại có bất kỳ điều gì liên quan đến dữ liệu chứa trong Chế độ xem. Nhóm Android - và mọi người khác - luôn luôn nói về tầm quan trọng của việc phân tách GUI và mã. Vậy tại sao không chỉ vẽ lại nội dung và giữ dữ liệu? Có một gợi ý như vậy ở đây: http://stackoverflow.com/questions/456211/activity-restart-on-rotation-android Ông đề nghị ghi đè lên onConfigurationChanged và sau đó chỉ làm setContentView, bỏ qua onCreate ... – Ted

Trả lời

11

Bạn nên đọc Application Fundamentals (cụ thể, Activity lifecycle).Kể từ khi Activity s phải có khả năng xử lý bị giết bất cứ lúc nào do các ràng buộc bộ nhớ, vv nó chỉ là một cách sạch hơn để xử lý phép quay mà không thêm quá phức tạp - thay vì kiểm tra mọi tài nguyên cho tài nguyên thay thế, tái cấu trúc bố cục, v.v. bạn chỉ cần lưu dữ liệu cần thiết, xóa hoạt động, tạo lại và tải dữ liệu trở lại (nếu bạn sẵn sàng giải quyết sự phức tạp hơn trong việc quản lý bản thân này, bạn có thể sử dụng onConfigurationChanged để xử lý thay đổi cấu hình chính mình.) Điều này cũng khuyến khích thực hành tốt hơn - các nhà phát triển phải được chuẩn bị cho Activity của họ để bị giết vì thay đổi định hướng, có hậu quả (tốt) được chuẩn bị để bị tiêu diệt bởi các hạn chế về bộ nhớ.

+1

Thx cho câu trả lời =) Câu hỏi logic tiếp theo là lý do tại sao Android hạn chế bộ nhớ đến 16MB hoặc 32MB ... thời gian để nhận ra chúng tôi không ở trong 80ies nữa =) Im tò mò là tại sao các thiết bị Windows Mobile (và họ có vấn đề của họ quá, tôi biết) không phàn nàn trên bộ nhớ. Tôi có thể chạy rất nhiều thứ ở đó, không sao cả. Nhưng trên Android, chúng có vẻ siêu nhạy cảm khi sử dụng RAM ...? – Ted

+2

Kích thước bộ nhớ bị hạn chế cũng như bộ nhớ * băng thông * trên thiết bị di động. 16MB là rất nhiều để làm việc với.Lưu ý rằng ứng dụng của bạn rất khó bị giết ngay sau khi bạn khởi chạy một ứng dụng khác (hoặc năm), nhưng bạn phải luôn chuẩn bị sẵn sàng - đó là công việc của nhà phát triển để đảm bảo rằng người dùng thậm chí không biết rằng ứng dụng của họ có bị giết và khởi động lại khi họ trở lại nơi họ rời đi - đó là những gì mà khung công tác Android dành cho và khuyến khích. –

+0

vâng, tôi hiểu điều đó. Nhưng một lần nữa, tại sao có thể ví dụ các thiết bị Windows Mobile hoạt động như một ứng dụng "bình thường", tức là nó không đi xung quanh phá hủy một phần ứng dụng "ad hoc". WinMobile có thể làm điều đó, và đó gần như là phần cứng giống như trên các thiết bị Android. Không khác nhau. Vì vậy, phàn nàn về số lượng RAM và tốc độ không thực sự giữ trong quan điểm của tôi ... – Ted

3

tại sao một phần câu trả lời ngắn - vì bạn có thể có tài nguyên cần thay đổi khi bạn xoay điện thoại. (Hình ảnh, bố cục có thể khác nhau, v.v.)

Khi lưu - bạn có thể lưu lại nội dung để nhóm và đọc lại.

@Override 
    protected void onSaveInstanceState(Bundle outState) { 

      String story_id = "123" 
      outState.putString(ContentUtils.STORYID, story_id); 

    } 

hoặc bạn có thể sử dụng onRetainNonConfigurationInstance() như mô tả ở đây http://developer.android.com/reference/android/app/Activity.html#onRetainNonConfigurationInstance()

Cuối cùng nếu bạn không có bất cứ điều gì bạn muốn xử lý trong quá trình luân chuyển - bạn có thể bỏ qua nó bằng cách đặt này vào hoạt động của bạn trong manifest

android:configChanges="keyboardHidden|orientation" 

Nói chung, tôi sẽ đọc bài viết máng từ url ở trên vài lần, cho đến khi vòng đời rõ ràng.

+1

Thx =) Vâng, như tôi đã nhận xét ở trên: họ không tách bố trí/GUI từ dữ liệu. Nếu LAYOUT cần vẽ lại, họ chỉ cần cạo toàn bộ. Thats không OK =) Thực hiện vẽ lại bằng mọi cách, nhưng giữ GUI riêng biệt với dữ liệu từ DATA. Họ thường nói rằng bản thân họ, nhưng bây giờ họ bỏ qua nó? – Ted

+0

Vâng, nếu bạn không có gì khôn ngoan mà phải được thay đổi - bỏ qua thay đổi định hướng. Nếu bạn làm - hãy đặt nó trong lớp với onRetainNonConfigurationInstance. Ngoài ra, tôi không đề xuất nó - nhưng bạn có thể bỏ qua thay đổi trong bản kê khai, và sau đó trên onConfigurationChanged xử lý nó cho mình –

4

Nội dung của EditText sẽ được lưu tự động cho bạn khi xoay màn hình nếu bạn đặt thuộc tính android: id trên đó. Tương tự, nếu bạn hiển thị các hộp thoại bằng cách sử dụng Activity # showDialog, thì các hộp thoại sẽ được hiển thị lại cho bạn sau khi quay.

+1

Ehm, tôi không nghĩ vậy. Tôi có một ID trên đó, android của nó: id = "@ + id/EditText01" và điều đó không làm cho nó tự động lưu ... – Ted

+2

Hành vi mặc định của việc lưu trạng thái chế độ xem với id được ghi lại ở đây: http://developer.android.com/intl/fr/reference/android/app/Activity.html#onSaveInstanceState%28android.os.Bundle%29 Tôi cũng thấy nó hoạt động trong thực tế. Nếu bạn không thấy hành vi này, thì bạn sẽ chặn nó theo một cách nào đó. Ví dụ: nếu bạn ghi đè onCreate hoặc onRestoreInstanceState và không gọi phương thức siêu với gói được cung cấp hoặc ghi đè onSaveInstanceState và không gọi phương thức siêu để thêm vào gói. –

+0

Tôi có thể xác nhận hành vi được mô tả, trạng thái màn hình được khôi phục sau khi xoay, trên thiết bị Android 1.6 vật lý (Xperia X10), tuy nhiên trên trình giả lập Android 1.6 mà tôi đang sử dụng, trạng thái màn hình bị mất khi tôi mô phỏng xoay vòng bằng ctrl-F11 . – user77115

0

Cách tiếp cận của Alex ở trên đã chỉ cho tôi giải pháp thực sự hữu ích khi sử dụng các đoạn:

Các mảnh vỡ thường được tạo lại khi thay đổi cấu hình. Nếu bạn không muốn điều này xảy ra, sử dụng

setRetainInstance(true); trong constructor của Fragment (s)

Điều này sẽ gây ra các mảnh vỡ để được giữ lại trong quá trình thay đổi cấu hình.

http://developer.android.com/reference/android/app/Fragment.html#setRetainInstance(boolean)

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