2012-11-30 18 views
5

Tôi đã sử dụng cả hai phương pháp:Lợi thế của việc cho phép một hoạt động bị phá hủy khi xoay vòng là gì?

  1. Hãy hoạt động bị phá hủy trên xoay
  2. Đừng để hoạt động bị phá hủy trên xoay

Tiếp cận của tôi gần như mọi là để nắm bắt những sự kiện xoay và nếu cần thiết, hãy gọi setContentView và thêm lại một số thành phần. Nếu không, chỉ cần để nó xoay và bố trí được thiết kế để thích nghi.

Cho đến nay tôi chỉ thấy lợi thế khi để nó bị phá hủy trên màn hình với cấu trúc rất phức tạp, rất linh động và bất cứ khi nào tôi xoay và không phá hủy, hãy hiển thị một số nhấp nháy khi xây dựng lại màn hình.

Chi phí phải vượt qua trạng thái với onSaveInstance, onRestoreInstace đôi khi rất dễ bị lỗi và tốn thời gian bằng cách nào đó.

Tôi có thiếu gì đó không?

UPDATE:

Tôi không làm bất kỳ loại nếu "Orientation.XPTO == ..." trên mã của tôi. Đây là logic của mỗi 2 cách tiếp cận (mã được tái sử dụng):

Khi phá hủy

onCreate -> DrawUI() setContentView and add views -> fill() add content 

Khi không phá hủy:

onCreate -> DrawUI() setContentView and add views -> fill() add content 
onRotation -> DrawUI() setContentView and add views -> fill() add content 

Khi gọi setContentView sau khi xoay nó sẽ chọn bố cục đúng cho hướng thiết bị (Kiểm tra câu trả lời này của Google Reto Meier https://stackoverflow.com/a/456918/327011)

Và DrawUI và điền sẽ phải có logic cho cả bố cục dọc và ngang khi hoạt động có thể được tạo trên mỗi hai hướng để bắt đầu.

+1

"Nếu khởi động lại hoạt động của bạn yêu cầu bạn khôi phục bộ dữ liệu lớn, thiết lập lại kết nối mạng hoặc thực hiện các hoạt động chuyên sâu khác, thì khởi động lại đầy đủ do thay đổi cấu hình có thể là trải nghiệm người dùng chậm.Ngoài ra, bạn có thể không hoàn toàn khôi phục trạng thái hoạt động của mình bằng 'Bundle' mà hệ thống tiết kiệm cho bạn với cuộc gọi lại' onSaveInstanceState() '- nó không được thiết kế để mang các đối tượng lớn (như bitmap) và dữ liệu bên trong nó phải được tuần tự hóa sau đó deserialized, có thể tiêu thụ rất nhiều bộ nhớ và làm thay đổi cấu hình chậm. " – jnthnjns

Trả lời

10

Tôi có thiếu gì đó không?

Có. Bạn đang giả định rằng thay thế của bạn bằng cách nào đó ít bị lỗi.

Bằng cách không trải qua chu kỳ hủy và tái tạo, bạn phải đảm bảo rằng bạn đang xử lý thay đổi mọi tài nguyên cho mọi thay đổi cấu hình có thể.

Đừng để hoạt động bị phá hủy trên xoay

Trừ khi bạn đang sử dụng android:screenOrientation để buộc hoạt động của bạn thành một định hướng duy nhất (ví dụ: landscape), bạn có thể không chỉ xử lý các thay đổi cấu hình luân chuyển liên quan đến . Bạn cần xử lý tất cả các thay đổi cấu hình. Nếu không, ngay khi người dùng thả thiết bị của họ vào đế, hãy xóa thiết bị khỏi đế, thay đổi ngôn ngữ từ Cài đặt, gắn hoặc tháo bàn phím, thay đổi tỷ lệ phông chữ chung, v.v., ứng dụng của bạn sẽ bị hỏng.

này, đến lượt nó, có nghĩa là trên tất cả các thay đổi cấu hình, bạn cần phải:

  • cập nhật giao diện người dùng của bạn cho các nguồn lực chuỗi tiềm năng mới của bạn
  • điều chỉnh hoặc tải lại bố trí của bạn (và bởi "điều chỉnh" mà bao gồm thay đổi bất kỳ drawables, hình ảnh động, các menu, vv)
  • bất cứ điều gì khác gắn liền với nguồn lực của bạn (ví dụ, danh sách mảng trong PreferenceFragment)

vấn đề của bạn là bạn sẽ quên cái gì đó. Ví dụ: bạn sẽ bỏ lỡ việc thay đổi một chuỗi được liên kết với một mục của thanh tác vụ, vì vậy hiện tại hầu hết giao diện người dùng của bạn bằng tiếng Tây Ban Nha và mục tác vụ đó là bằng tiếng Anh. Những thứ bạn sắp quên sẽ ít rõ ràng hơn (bạn có thường xuyên kiểm tra bản dịch tiếng Tây Ban Nha của bạn không?).

+0

Bên cạnh đó có nhiều "lỗi dễ bị" là có bất kỳ mối quan tâm hiệu suất? – neteinstein

+0

@NeTeInStEiN: Không thường xuyên. – CommonsWare

3

Hoạt động của bạn bị hủy để cho bạn cơ hội định cấu hình lại chính mình theo hướng mới.

Từ developer.android.com:

Khi màn hình thay đổi định hướng, hệ thống phá hủy và tái tạo hoạt động foreground vì cấu hình màn hình đã thay đổi và hoạt động của bạn có thể cần phải tải các tài nguyên thay thế (chẳng hạn như bố cục).

Ví dụ: ở chế độ ngang, bạn có thể yêu cầu bố cục hoàn toàn khác hoặc có thể tải trong đồ họa không xuất hiện kéo dài. Cách tốt nhất để làm điều này là cho phép hoạt động được tạo lại, điều này sẽ cho phép liên kết đến tệp bố cục để thay đổi thành bố cục thân thiện với định hướng hơn.

Xem http://developer.android.com/training/basics/activity-lifecycle/recreating.html để biết thêm và làm thế nào để đối phó với sự thay đổi định hướng

Nếu bạn muốn vô hiệu hóa giải trí bạn có thể thêm

android:configChanges="orientation" 

đến yếu tố hoạt động của bạn trong AndroidManifest.xml. Bằng cách này hoạt động của bạn sẽ không được tải lại.

onSaveInstanceonRestoreInstace chỉ nên được sử dụng để chuyển qua thông tin phiên, ví dụ: văn bản hiện tại trong TextField và không có gì chung chung có thể được tải lại sau khi tạo.

+0

Vâng. Nhưng nếu bạn sử dụng android: configChanges =" orientation ", bạn cũng có thể setContentView và bố cục cho định hướng cụ thể đó – neteinstein

+0

Không phải là một lợi thế nếu bạn có một hoạt động có thể, nhưng đối với một hoạt động quy mô lớn hơn, bạn sẽ phải chắc chắn rằng các nguồn lực chính xác được nạp vào và bạn có thể viết một biển mã Để làm điều này, hoạt động giải trí sẽ loại bỏ sự cần thiết cho điều đó, và bạn không phải lo lắng về việc giải quyết việc làm mới –

+0

Không thực sự nếu bạn đối phó với nó ngay từ đầu. k câu hỏi được cập nhật. – neteinstein

0

Một số lần hữu ích khi bạn đang sử dụng bố cục khác nhau cho (Landscape/Portrait). và sử dụng các loại chế độ xem khác nhau, ví dụ: ListView theo chiều dọc và GridView ở chế độ ngang.

+0

Có. Nhưng nếu bạn sử dụng android: configChanges = "orientation", bạn cũng có thể setContentView và bố cục cho hướng cụ thể đó sẽ được tải chính xác. Vậy ... vẫn không có lợi thế? – neteinstein

+0

Nhưng như tôi đã nói nếu bạn đang sử dụng các thành phần khác nhau thì trước tiên bạn phải kiểm tra nguồn gốc và sau đó điền vào khung nhìn thích hợp giống như ListView và GridView. –

+0

Nop. Mã này giống như khi hoạt động bị hủy. Kiểm tra câu hỏi được cập nhật. – neteinstein

2

Nếu bạn, khởi động lại hoạt động, đòi hỏi phục hồi bộ lớn dữ liệu, tái thiết lập kết nối mạng, hoặc thực hiện các hoạt động chuyên sâu khác sau đó sử dụng onSaveInstanceState() khả năng có thể gây ra các triệu chứng ghi nhận của bạn:

  1. Một người sử dụng kém kinh nghiệm (tức là "hiển thị một số nhấp nháy")
  2. Yêu cầu tiêu thụ rất nhiều bộ nhớ

onSaveInstanceState() callbacks không de đã ký để mang các vật lớn.

Để giữ một đối tượng trong một sự thay đổi cấu hình thời gian chạy:

Ghi đè onRetainNonConfigurationInstance() phương pháp để trả lại đối tượng mà bạn muốn giữ lại. Khi hoạt động của bạn được tạo lại, hãy gọi getLastNonConfigurationInstance() để khôi phục đối tượng của bạn.

Tuy nhiên:

Trong khi bạn có thể trả lại bất kỳ đối tượng, bạn không bao giờ phải vượt qua một đối tượng mà được gắn với các hoạt động, chẳng hạn như một Drawable, một Adapter, một View hoặc bất kỳ đối tượng khác được liên kết với một số Context. Nếu bạn làm như vậy, nó sẽ làm rò rỉ tất cả các khung nhìn và tài nguyên của cá thể hoạt động ban đầu. (Rò rỉ nguồn lực có nghĩa là ứng dụng của bạn duy trì một tổ chức về họ và họ không thể thu gom rác, vì vậy rất nhiều bộ nhớ có thể bị mất.)

Source


Trừ khi bạn có thể vượt qua Object (s) suôn sẻ Cá nhân tôi nghĩ rằng nó là thuận lợi hơn để xử lý thay đổi cấu hình chính mình, có nghĩa là không để tiêu diệt.

Nếu bạn có API mục tiêu 13 trở lên: Bạn phải bao gồm screenSize trong số configChanges của mình.Bắt đầu với API 13, kích thước màn hình cũng thay đổi theo hướng thay đổi và bạn sẽ cần tính đến điều này. Trước 13 Activity của bạn sẽ tự xử lý nó.

android:configChanges="orientation|screenSize" 
0

Tôi đoán bạn không cân nhắc cách tạo tiêu chuẩn bố cục android. Nêu tôi sai vui long chân chỉnh tôi. Bạn đang sử dụng hai thư mục res với -port, -land riêng để thông báo cho hệ thống Android chọn trong thời gian chạy để tải các nội dung và bố cục khác nhau trên cơ sở định hướng.

example này có thể cung cấp cho bạn manh mối để quản lý bố cục theo các hướng khác nhau.

Đây là android stanard document. Vui lòng kiểm tra với "land" và "port".

Hy vọng điều này sẽ giúp bạn.

+0

Để xử lý thay đổi bố cục rất năng động, tôi thường đẩy/bật bố cục bằng cách sử dụng các đoạn. Tôi chỉ cần lưu trạng thái của ui (đầu vào của người dùng nếu có) và điền vào nó sau khi thay đổi hướng với đoạn được yêu cầu thay vì cho phép nó phá hủy. Bằng cách này, nó trở nên dễ quản lý. –

+0

"Bạn đang sử dụng hai thư mục res có -port, -land riêng để thông báo cho hệ thống Android chọn trong thời gian chạy để tải các nội dung và bố cục khác nhau trên cơ sở định hướng." - Có – neteinstein

+0

Bạn đã trải qua ví dụ mà tôi đã đề xuất. –

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