Android, làm thế nào để không phá hủy hoạt động khi tôi xoay thiết bị?


81

Tôi có một ứng dụng chỉ hoạt động ở chế độ dọc và tôi đã thực hiện các thay đổi trong tệp kê khai của mình cho mọi hoạt động theo hướng dọc. Nhưng khi tôi xoay thiết bị, hoạt động sẽ tái tạo lại. Làm thế nào để không phá hủy hoạt động?


1
Điều này thường không được khuyến khích, bạn có thể thử thiết lập định hướng ứng dụng của mình theo chương trình với những thứ như: setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
stealthcopter

7
Tại sao nó sẽ chống lại? Giả sử chúng ta có một dịch vụ mất 2 giây để chạy. Nếu hoạt động bị hủy mỗi lần, dịch vụ đó vẫn tiếp tục chạy trong khi tôi chỉ cần nó chạy một lần.
Mohamed Mansour

Câu trả lời:


131

Đối với API 12 trở xuống : thêm

android:configChanges="orientation"

Thêm "screenSize" nếu bạn đang nhắm mục tiêu API 13 trở lên vì bất cứ khi nào hướng của bạn thay đổi, kích thước màn hình của bạn thay đổi, nếu không các thiết bị mới sẽ tiếp tục phá hủy hoạt động của bạn. Xem câu trả lời của Egg bên dưới để biết thêm thông tin về cách sử dụng "screenSize"

android:configChanges="orientation|screenSize"

vào 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ự động khởi động lại. Xem tài liệu để biết thêm thông tin


Hoạt động được khởi động lại một lần nữa. Tôi không biết mục đích của việc thực hiện tất cả những thứ phải làm khi hoạt động xoay vòng, ngay cả khi nó không quay ảo. Có cách nào để vô hiệu hóa các thông báo mà cảm biến gửi đến Hệ điều hành về quá trình xoay hoặc tương tự như vậy để khắc phục sự cố này từ gốc của nó không?
Vasil

6
bạn đang lập trình trên thiết bị nào? nhớ, mà ví dụ trượt ra bàn phím cũng có thể khởi động lại hoạt động của bạn ... (nếu đó là lý do confChanges thiết lập để "bàn phím | keyboardHidden | hướng")

2
Điều này vô hiệu hóa sự thay đổi bố cục. Làm cách nào để khắc phục điều đó?
Remian8985

1
Giải pháp này giải quyết hoạt động phá hủy và tạo nhưng, cách xử lý các thay đổi bố cục. Ý tôi là khi thay đổi hướng, tải bố cục tương ứng.
sandeepmaaram

Có cách nào để đặt tham số android: configChanges theo lập trình, trái ngược với trong tệp kê khai không?
CodyF

108

Từ tài liệu chính thức, flurin cho biết,

Lưu ý: Nếu ứng dụng của bạn nhắm mục tiêu API cấp 13 trở lên (như được khai báo bởi thuộc tính minSdkVersion và targetSdkVersion), thì bạn cũng nên khai báo cấu hình "screenSize", vì nó cũng thay đổi khi thiết bị chuyển đổi giữa hướng dọc và ngang.

Vì vậy, nếu ứng dụng của bạn nhắm mục tiêu API cấp 13 trở lên, bạn nên đặt cấu hình này để thay thế:

android:configChanges="orientation|screenSize"


4
Cảm ơn bạn rất nhiều! Tất cả các câu trả lời khác đều bỏ lỡ phần này khi API cấp 13 giới thiệu điều này screenSize. Bạn vừa cứu mạng tôi! :)
Tamás Barta,

1
@egg Cảm ơn youuuuuuu! :) Điều này đã giúp!
KarenAnne

1
Mẹo tuyệt vời là rất khó để cập nhật tài liệu khi bạn làm việc đó bán thời gian.
wallerjake

1
+1 Người đàn ông cảm ứng tốt. Cảm ơn bạn đã chia sẻ giải pháp này cho chúng tôi. Bạn đã cứu ngày của tôi. Cảm ơn;)
Simon Dorociak

9

Giải pháp đúng là

android:configChanges="orientation|screenSize"

Tài liệu Android:

Kích thước màn hình khả dụng hiện tại đã thay đổi. Điều này thể hiện sự thay đổi về kích thước hiện có, so với tỷ lệ khung hình hiện tại, do đó sẽ thay đổi khi người dùng chuyển đổi giữa ngang và dọc. Tuy nhiên, nếu ứng dụng của bạn nhắm mục tiêu API cấp 12 trở xuống, thì hoạt động của bạn luôn tự xử lý thay đổi cấu hình này (thay đổi cấu hình này không khởi động lại hoạt động của bạn, ngay cả khi chạy trên thiết bị Android 3.2 trở lên). *


5

Tôi đã làm rối tung điều này một chút và sau đó tin rằng bên trong tệp kê khai, tôi đang đặt configChanges ở cấp Ứng dụng chứ không phải ở Cấp hoạt động. Đây là mã trông như thế nào khi nó hoạt động chính xác đối với tôi.

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
        <activity android:name=".MainActivity"
                  android:configChanges="orientation|screenSize|keyboardHidden">
        <intent-filter>
            <action android:name="android.intent.action.MAIN"/>
            <category android:name="android.intent.category.LAUNCHER"/>
        </intent-filter>
    </activity> 
</application> 

2
Bạn nên chia sẻ mã trong bài đăng của mình thay vì một hình ảnh.
Jules Dupont

Vui lòng chỉnh sửa bài đăng của bạn và hiển thị mã kê khai thực tế dưới dạng văn bản thay vì ảnh chụp màn hình. Những người khác không thể sao chép và dán từ hình ảnh của bạn. Xem chi tiết tại đây . Cảm ơn bạn.
Pang

1

Giờ đây, Android đã hỗ trợ chia đôi màn hình ("đa cửa sổ" theo cách nói của Android), có thể bạn sẽ muốn thêm định hướng screenSize | smallScreenSize | screenLayout |. Vì vậy, để xử lý xoay và chia đôi màn hình, bạn sẽ muốn một cái gì đó như thế này trong android: configChanges

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
        <activity android:name=".MainActivity"
                  android:configChanges="orientation|screenSize|keyboardHidden|smallestScreenSize|screenLayout">
        <intent-filter>
            <action android:name="android.intent.action.MAIN"/>
            <category android:name="android.intent.category.LAUNCHER"/>
        </intent-filter>
    </activity> 
</application>


-1

viết trong tệp kê khai:

android:configChanges="orientation|screenSize|keyboardHidden"

và ghi đè điều này trong hoạt động đã giải quyết vấn đề của bạn:

 @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
}

5
Tại sao việc ghi đè phương thức onConfigurationChanged và gọi việc triển khai ban đầu lại làm bất cứ điều gì hữu ích?
ricosrealm
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.