Tại sao không sử dụng luôn android: configChanges = Bàn phímHH | định hướng | định hướng?


178

Tôi đã tự hỏi tại sao không sử dụng android:configChanges="keyboardHidden|orientation"trong mọi hoạt động (gần như mọi;))?

Các mặt hàng:

  • không cần phải lo lắng về hoạt động của bạn đã được luân chuyển
  • Nó nhanh hơn

Không tốt lắm:

  • cần thay đổi bố cục của bạn nếu chúng phụ thuộc vào kích thước màn hình (ví dụ: bố cục có hai cột hoặc hơn)

Xấu:

  • không có cách linh hoạt để có bố cục khác nhau trên các định hướng khác nhau
  • không tốt lắm khi sử dụng các mảnh vỡ

Nhưng nếu chúng ta không sử dụng các bố cục khác nhau, tại sao không?


6
Bạn cũng nên giải thích những gì bạn nghĩ bàn phímHidden | định hướng đang làm
Blundell

Điều đó ngăn cản việc sử dụng xử lý riêng của các thay đổi cấu hình đã chỉ định và cho phép ứng dụng xử lý nó, phải không?
Mikooos

2
Đó là lý do tại sao tùy chọn này ở đó, nếu bạn biết bạn đang làm gì (không thay đổi tài nguyên), hãy sử dụng nó.
Con trỏ Null

Tại sao nó nhanh hơn việc sử dụng ScreenSize?
batmaci

Câu trả lời:


334

Nền nhanh

Theo mặc định, khi một số thay đổi cấu hình khóa nhất định xảy ra trên Android (một ví dụ phổ biến là thay đổi hướng), Android sẽ khởi động lại hoàn toàn Hoạt động đang chạy để giúp nó điều chỉnh theo các thay đổi đó.

Khi bạn xác định android:configChanges="keyboardHidden|orientation"trong AndroidManifest, bạn đang nói với Android: "Vui lòng không thực hiện thiết lập lại mặc định khi bàn phím bị kéo ra hoặc điện thoại bị xoay; Tôi muốn tự xử lý việc này. Vâng, tôi biết tôi đang làm gì "

Đây có phải là một điều tốt? Chúng ta sẽ sớm thấy ...

Đừng lo lắng?

Một trong những ưu điểm bạn bắt đầu là có:

không cần phải lo lắng về hoạt động của bạn đã được luân chuyển

Trong nhiều trường hợp, mọi người lầm tưởng rằng khi họ có lỗi được tạo ra bởi sự thay đổi định hướng ("xoay"), họ có thể chỉ cần sửa nó bằng cách đưa vào android:configChanges="keyboardHidden|orientation".

Tuy nhiên, android: configChanges = "keyboardHidden | direction" không có gì khác hơn là một chiếc băng đô. Trong thực tế, có nhiều cách thay đổi cấu hình có thể được kích hoạt. Ví dụ: nếu người dùng chọn ngôn ngữ mới (tức là ngôn ngữ đã thay đổi), hoạt động của bạn sẽ được khởi động lại giống như cách thay đổi định hướng. Nếu bạn muốn, bạn có thể xem danh sách tất cả các loại thay đổi cấu hình khác nhau .

Chỉnh sửa : Quan trọng hơn, mặc dù, khi hackbod chỉ ra trong các bình luận, hoạt động của bạn cũng sẽ được khởi động lại khi ứng dụng của bạn ở chế độ nền và Android quyết định giải phóng bộ nhớ bằng cách giết chết nó. Khi người dùng quay lại ứng dụng của bạn, Android sẽ cố gắng khởi động lại hoạt động theo cách tương tự nếu có một số thay đổi cấu hình khác. Nếu bạn không thể xử lý điều đó - người dùng sẽ không vui ...

Nói cách khác, sử dụng android:configChanges="keyboardHidden|orientation"không phải là một giải pháp cho "những lo lắng" của bạn. Cách đúng đắn là mã hóa các hoạt động của bạn để chúng hài lòng với bất kỳ lần khởi động lại nào mà Android ném vào chúng. Đây là một thực hành tốt sẽ giúp bạn xuống đường, vì vậy hãy làm quen với nó.

Vậy khi nào tôi nên sử dụng nó?

Như bạn đã đề cập có một lợi thế khác biệt. Ghi đè thay đổi cấu hình mặc định cho một vòng quay bằng cách tự xử lý nó sẽ tăng tốc mọi thứ. Tuy nhiên, tốc độ này không đi kèm với giá cả thuận tiện.

Nói một cách đơn giản, nếu bạn sử dụng cùng một bố cục cho cả dọc và ngang thì bạn đang ở trạng thái tốt bằng cách ghi đè. Thay vì tải lại toàn bộ hoạt động, các chế độ xem sẽ chỉ thay đổi xung quanh để lấp đầy không gian còn lại.

Tuy nhiên , nếu vì lý do nào đó bạn sử dụng bố cục khác khi thiết bị ở chế độ nằm ngang, thì thực tế là Android tải lại Activity của bạn là tốt vì sau đó nó sẽ tải lên bố cục chính xác. [Nếu bạn sử dụng ghi đè trên một Hoạt động như vậy và muốn thực hiện một số bố cục lại kỳ diệu trong thời gian chạy ... tốt, chúc may mắn - thật đơn giản]

Tóm tắt nhanh

Bằng mọi cách, nếu android:configChanges="keyboardHidden|orientation"phù hợp với bạn, thì hãy sử dụng nó. Nhưng XIN hãy chắc chắn để kiểm tra những gì sẽ xảy ra khi một cái gì đó thay đổi, bởi vì một sự thay đổi định hướng không phải là con đường duy nhất một Hoạt động khởi động lại đầy đủ có thể được kích hoạt.


50
Điều đáng nói thêm là việc không xử lý hoạt động của bạn được khởi động lại có nghĩa là bạn gặp vấn đề lớn hơn là không xử lý các thay đổi cấu hình ít phổ biến hơn. Khởi động lại hoạt động được sử dụng ở đây là cơ chế chính xác giống như cách Android khôi phục hoạt động của bạn về trạng thái trước đó khi ứng dụng của bạn bị giết trong nền. Vì vậy, nếu bạn không làm điều này một cách chính xác, người dùng của bạn sẽ trải nghiệm ứng dụng của bạn một cách ngẫu nhiên không quay lại chính xác khi họ quay lại từ nền, tùy thuộc vào quá trình xảy ra có bị giết hay không. Vì vậy, một lợi ích rất lớn: nó đảm bảo ứng dụng của bạn khởi động lại chính xác.
hackbod

14
Từ Android 3.x, đừng bỏ lỡ để thêm "screenSize" ---------- android: configChanges = ["mcc", "mnc", "locale", "màn hình cảm ứng", "bàn phím", "keyboardHidden", "navigation", "screenLayout", "fontScale", "uiMode", "direction", "screenSize", "tinyScreenSize"]
Michael Biermann

1
Tôi đã nhận thấy rằng khi bạn sử dụng thuộc tính configChanges, ứng dụng của bạn cũng bỏ qua tính năng khóa định hướng. Làm thế nào bạn có thể giải quyết điều này? Nếu bạn biết câu trả lời, xin vui lòng viết nó ở đây: stackoverflow.com/questions/24000361/ Kẻ
nhà phát triển Android

4
Please don't do the default reset when the keyboard is pulled outtôi chưa bao giờ thấy một hoạt động khởi động lại cho bàn phím kéo ra !
Muhammad Babar

Theo ý kiến ​​của tôi, khởi động lại thỉnh thoảng cũng ổn ... configChanges xử lý hầu hết các trường hợp đối với tôi ... cũng có thể trong một số loại ứng dụng khác, điều này có thể là vấn đề nhưng nó thực sự phụ thuộc ....
Renetik

2

Theo quan điểm của tôi: Nếu bố cục giống nhau ở cả chế độ ngang và dọc - bạn cũng có thể vô hiệu hóa một trong hai trong ứng dụng của mình.

Lý do tại sao tôi nói điều này là vì tôi là người dùng mong muốn ứng dụng cung cấp cho tôi một số lợi ích khi tôi thay đổi định hướng. Nếu tôi giữ điện thoại không quan trọng, thì tôi không cần lựa chọn.

Ví dụ như một ứng dụng mà bạn có ListView và khi nhấp vào ListItem, bạn muốn được hiển thị chế độ xem chi tiết cho mục đó. Trong phong cảnh, bạn sẽ đánh thức điều này bằng cách chia đôi màn hình, có ListView ở bên trái và chế độ xem chi tiết ở bên phải. Trong Portrait, bạn sẽ có danh sách trong một màn hình và sau đó thay đổi màn hình thành chế độ xem chi tiết khi ListItem được chọn. Trong trường hợp đó, sự thay đổi định hướng có ý nghĩa cũng như các bố cục khác nhau.


4
Vâng, chúng tôi đã sử dụng phiên bản 1.0 của ứng dụng để phù hợp với phiên bản Apple của chúng tôi. Nó chỉ được trình bày trong chân dung. Nhìn tuyệt vời trên Droid X của tôi, chúng tôi đã khớp chính xác hành vi bàn phím bật lên của phiên bản IOS. Sau đó, CFO đã cài đặt ứng dụng trên Droid của mình, xoay nó sang một bên và mở bàn phím. Giáo sư. Vấn đề của Android là nó là một nền tảng mở và bạn thực sự không thể dự đoán được cấu hình phần cứng hoặc người dùng sẽ muốn làm gì với nó, vì vậy bạn có thể nên hỗ trợ cả hai (tất cả) định hướng trong trường hợp.
Tevo D

1
Điều này tình cờ lấn át cài đặt chỉ chân dung của chúng tôi vì về cơ bản là trong phần cứng mà phong cảnh lúc đó là định hướng bình thường, không thay thế. Điều này thực sự làm rối tung bố cục của chúng tôi :( và khá lúng túng, có một lỗ hổng lớn trong vài giây sau khi anh ta cài đặt ứng dụng
Tevo D

1
Tại sao bạn lại cố gắng làm cho nó hoạt động chính xác như iOS? :(
FunkTheMonk

7
@FunkTheMonk Thật không may, chúng ta sống trong một thế giới nơi các doanh nhân đưa ra quyết định kỹ thuật. Ngay cả khi bạn tranh luận chống lại điều đó, một nửa thời gian họ nghĩ rằng họ vẫn đúng. Và họ kiểm soát tiền lương của bạn.
StackOverflow

2
Chỉ sử dụng một bố cục không có nghĩa là màn hình sẽ trông giống nhau khi xoay. Bố cục XML có cấu trúc tốt sẽ khiến mọi thứ tự động thay đổi để hoạt động tốt với kích thước hợp lý và người dùng sẽ đánh giá cao điều đó.
Melinda Green

-1

Tôi không hiểu tại sao .... theo ý kiến ​​của tôi, khởi động lại thỉnh thoảng vẫn ổn ... configChanges xử lý hầu hết các trường hợp cho tôi ... cũng có thể trong một số loại ứng dụng có thể có vấn đề nhưng nó thực sự phụ thuộc vào loại ứng dụng và cách bạn khôi phục trạng thái khi ứng dụng khởi động lại ... Khi một trong những ứng dụng của tôi khởi động lại, người dùng đã đăng nhập lại và hoạt động cuối cùng được mở bởi mã của tôi và người dùng sẽ mất một số bước để quay lại vị trí của mình nhưng không phải là vấn đề lớn .. Trong một số trạng thái khác luôn tồn tại và một số trạng thái luôn được khôi phục khi khởi động lại. Khi hoạt động được khởi động lại, ứng dụng đó chưa được sử dụng hoặc một cái gì đó ... vì vậy không có vấn đề gì cả ... Ví dụ trong trò chơi, đây có thể là vấn đề có thể hoặc trong một số loại ứng dụng khác mà tôi không biết ...

Tôi nói rằng khi bạn làm theo cách này, các ứng dụng chỉ hoạt động tốt trong các trường hợp bình thường. Và mã dễ đọc hơn nhiều mà không cần logic để lưu và khôi phục nơi bạn chỉ có thể tạo ra các lỗi mới và phải duy trì nó mọi lúc ... chắc chắn nếu android mất điện và giết chết cửa sổ ứng dụng của bạn thì nó sẽ mất bối cảnh và bắt đầu lại, nhưng điều này xảy ra chỉ trong những tình huống đặc biệt và trên các thiết bị mới hơn tôi tin rằng điều này ngày càng hiếm hơn ...

Vì vậy, giết tôi, nhưng tôi sử dụng ứng dụng này trên các ứng dụng khá thành công ... android: configChanges = "locale | keyboard | keyboardHidden | direction | screenLayout | uiMode | screenSize | tinyScreenSize" Nhưng tôi hiểu rằng đối với một số loại ứng dụng đặc biệt thì có thể không cách tốt nhưng hầu hết các ứng dụng có thể sống với điều này chỉ cần OK.


Xin chào, ai đó có thể am hiểu về chủ đề này, xin hãy xem chủ đề của tôi: stackoverflow.com/questions/35941585/. Tuyệt vọng cần sự giúp đỡ.
Luke Allison

Bạn nên hỗ trợ đầy đủ cho việc lưu / tiếp tục các hoạt động ... xử lý nó để xoay vòng không khác nhau ... Bạn nói rằng bạn mất một vài bước ... nếu bạn thực hiện đúng cách, bạn sẽ không mất bước nào và bạn khôi phục chính xác nơi người dùng rời đi ... Ngay cả sau khi khởi động lại thiết bị.
HaMMeReD

Tôi không biết bạn đang nói về cái gì nhưng tôi nói rằng khi bạn làm theo cách này, các ứng dụng chỉ hoạt động tốt trong các trường hợp bình thường. Và mã dễ đọc hơn nhiều mà không cần logic để lưu và khôi phục nơi bạn chỉ có thể tạo ra các lỗi mới và phải duy trì nó mọi lúc ... chắc chắn nếu android mất điện và giết chết cửa sổ ứng dụng của bạn thì nó sẽ mất bối cảnh và bắt đầu lại, nhưng điều này xảy ra chỉ trong những tình huống đặc biệt và trên các thiết bị mới hơn tôi tin rằng điều này ngày càng hiếm hơn ...
Renetik

Bỏ qua để tuân thủ hợp đồng Hoạt động (trạng thái lưu / khôi phục) là một thực tiễn tồi và đây là lời khuyên tồi tệ tổng thể. Hãy thử kiểm tra chống lại quá trình chết và xem ứng dụng của bạn đưa bạn đến đâu và hành vi này hoàn toàn là "hoàn cảnh bình thường" nếu người dùng của bạn sử dụng ít nhất 2-3 ứng dụng trên điện thoại của họ và chuyển đổi giữa chúng.
EpicPandaForce

-3

Vâng tôi nghĩ rằng tạm dừng sẽ làm cho nó nhanh hơn việc phát hành trình phát. Vẫn có sự tạm dừng mặc dù.

Bây giờ đã tìm thấy một giải pháp sẽ không tạm dừng bài hát.

Trạng thái trong tệp kê khai rằng bạn sẽ xử lý thay đổi cấu hình cho hướng màn hình và sau đó sử dụng phương thức onConfigurationChanged để tải tệp bố cục. Bằng cách thực hiện điều này trong logCat, tôi có thể thấy onPause, onCreate & onResume không được gọi và do đó bài hát không bị tạm dừng.

  1. cập nhật bảng kê khai để xử lý định hướng.

    android:configChanges="orientation|screenSize"
  2. thêm mã này

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        // TODO Auto-generated method stub      
        super.onConfigurationChanged(newConfig);        
        setContentView(R.layout.activity_main);
    }

Bạn nên sử dụng một dịch vụ để phát nhạc. Nghiêm túc mà nói, bạn đang bảo mọi người thêm mã vẫn còn "// TODO Phương thức tự động tạo" trong đó. Giải pháp cẩu thả. Nó cũng sẽ không hoạt động tốt, bạn sẽ cần phải cung cấp lại tất cả các tài liệu tham khảo của bạn, và nếu bạn không dự đoán được điều đó sẽ không thể đoán trước được.
HaMMeReD
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.