2011-08-23 15 views
5

Theo như tôi đã hiểu, hoạt động trên Android của bạn sẽ được tạo lại theo hướng mới trên bất kỳ thay đổi định hướng nào.Lưu một số dữ liệu về thay đổi hướng trong Android

Có cách nào để lưu trữ/lưu một số dữ liệu từ hướng ban đầu khi thay đổi hướng không?

Tôi muốn lưu trữ một số Bitmap, vì vậy tôi không phải tải lại lần nữa trên thay đổi hướng.

Trả lời

12

Sử dụng các biến/lớp tĩnh là một cách tiếp cận xấu về khả năng bảo trì và gỡ lỗi.


Tôi đã sử dụng Activity.onRetainNonConfigurationInstance nhưng tôi phát hiện ra rằng hiện tượng này không còn được dùng nữa (có thể là do tổ ong hoặc sau này). Activity.onRetainNonConfigurationInstance

Sử dụng phương pháp này, chỉ cần gọi Activity.getLastNonConfigurationInstance để truy xuất cùng một đối tượng mà bạn đã trả lại trong onRetainNonConfigurationInstance. Hãy chắc chắn kiểm tra null và cast sang lớp bên phải (bạn có thể trả về/nhận bất kỳ lớp nào).Activity.getLastNonConfigurationInstance

Cách sử dụng mẫu trong pseudo-code sẽ là:

onRetainNonConfigurationInstance: 
    return "I need to remember this next time"; 

onCreate: 
    ... 
    String messageToShow = null; 
    Object data = getLastNonConfigurationInstance(); 
    if(data != null) 
     messageToShow = (String)data; 
    else 
     messageToShow = "Nothing to show"; 

Vì vậy, nếu bạn đang nhắm mục tiêu đến 2.x.x bạn có thể sử dụng phương pháp đó. Nếu không, google khuyên bạn nên sử dụng Fragment.setRetainInstance. Đây là tương thích ngược thông qua gói tính tương thích.

Fragment.setRetainInstance

+0

Phải, 1 điểm của tôi với bạn :) – darma

+0

@Pedro Loureiro Nhưng điều này không có tác dụng cho một Hoạt động, chỉ là một Fragement, đúng không? –

0

Quy trình chạy hoạt động của bạn sẽ không được khởi động lại. Android framework sẽ chỉ tạo một phiên bản mới cho hoạt động của bạn. Vì vậy, như giải pháp đơn giản nhất bạn có thể lưu trữ dữ liệu của bạn trong các biến tĩnh.

+0

Vì vậy, tôi về cơ bản có thể tạo ra các biến như tĩnh và khởi tạo chúng như null. Sau đó, làm một kiểm tra null và nếu họ không null, tôi sẽ tái sử dụng chúng và nếu họ là null, tôi sẽ tải chúng. Chính xác? –

+1

Hãy cẩn thận về việc lưu trữ biến tĩnh; bạn có thể đọc bài viết rất thú vị này của Romain Guy: http://www.curious-creature.org/2008/12/18/avoid-memory-leaks-on-android/ – darma

+0

Vâng, bạn nói đúng. –

5

Lưu các mục trong hoạt động gốc hoặc lớp tiện ích tĩnh.

Nếu không, bạn có thể sử dụng tệp kê khai để yêu cầu ứng dụng không hủy kích hoạt hoạt động trên màn hình thay đổi kích thước. Hãy xem bài viết này: http://developer.android.com/guide/topics/resources/runtime-changes.html

+0

Cảm ơn rất nhiều, điều này đã giúp tôi rất nhiều và tôi nghĩ rằng tôi có thể giải quyết vấn đề của tôi ngay bây giờ :-) Tôi sẽ đánh dấu điều này là đã trả lời khi tôi có thể trong vài phút. –

+0

cũng cảm ơn bạn, vui vì điều đó đã giúp ích cho bạn. – Noah

1

Thực tế có một bài viết rất hay trên trang web dành cho nhà phát triển Android bao gồm chủ đề này.

Một số thiết bị, như T-Mobile G1, có thể thay đổi cấu hình phần cứng khi chạy. Ví dụ: khi bạn mở bàn phím, thay đổi màn hình từ hướng dọc sang hướng ngang hướng.

Để làm cho phát triển ứng dụng Android dễ dàng hơn, hệ thống Android sẽ tự động xử lý các sự kiện thay đổi cấu hình và khởi động lại hoạt động hiện tại với cấu hình mới .

[...]

Trong khi hành vi này là thật sự mạnh mẽ, kể từ khi ứng dụng của bạn thích nghi tự động cấu hình của thiết bị trong thời gian chạy, nó là đôi khi gây nhầm lẫn cho các nhà phát triển Android mới, người tự hỏi tại sao hoạt động của họ là bị phá hủy và tái tạo.

Đối mặt này "vấn đề", số nhà phát triển chọn để xử lý cấu hình thay đổi bản thân mình đó là, nói chung, một giải pháp ngắn hạn mà sẽ chỉ làm phức tạp cuộc sống của họ sau này.

[...]

The full article.

0

bạn có thể thử sử dụng sharedpreferences:

editor edit = preferences.edit(); edit.putString("username", "new_value_for_user"); edit.commit();

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