Ứng dụng khởi động lại thay vì tiếp tục


194

Hy vọng ai đó có thể giúp tôi tìm ra, nếu không phải là một giải pháp, ít nhất là một lời giải thích cho một hành vi.

Vấn đề:

Trên một số thiết bị, nhấn biểu tượng trình khởi chạy sẽ dẫn đến tác vụ hiện tại được tiếp tục, trên các thiết bị khác, kết quả là mục đích khởi chạy ban đầu sẽ bị hủy (khởi động lại ứng dụng một cách hiệu quả). Lý do tại sao điều này xảy ra?

Chi tiết:

Khi bạn nhấn "Biểu tượng trình khởi chạy", ứng dụng sẽ khởi động bình thường - Nghĩa là, tôi cho rằng, một Ý định được khởi chạy với tên đầu tiên của bạn Activityvới hành động android.intent.action.MAINvà danh mục android.intent.category.LAUNCHER. Điều này không phải luôn luôn là trường hợp tuy nhiên:

Trên phần lớn thiết bị, nếu bạn nhấn biểu tượng trình khởi chạy sau khi ứng dụng đã chạy, Hoạt động hiện đang chạy trong quy trình đó sẽ được tiếp tục ( KHÔNG phải là ban đầu Activity). Nó tiếp tục theo cùng một cách như thể bạn đã chọn nó từ "Nhiệm vụ gần đây" trong menu Hệ điều hành. Đây là hành vi tôi muốn trên tất cả các thiết bị.

Tuy nhiên, trên các thiết bị khác được chọn hành vi khác nhau xảy ra:

  • Trên Motorola Xoom, khi bạn nhấn biểu tượng trình khởi chạy, Ứng dụng sẽ luôn bắt đầu khởi chạy ban đầu Activitybất kể những gì hiện đang chạy. Tôi giả định rằng các biểu tượng trình khởi chạy luôn bắt đầu ý định "LAUNCHER".

  • Trên Samsung Tab 2, khi bạn nhấn biểu tượng trình khởi chạy, nếu bạn vừa cài đặt ứng dụng, nó sẽ luôn khởi chạy ban đầu Activity(Giống như Xoom) - tuy nhiên, sau khi bạn khởi động lại thiết bị sau khi cài đặt, biểu tượng trình khởi chạy sẽ thay thế tiếp tục ứng dụng. Tôi giả sử rằng các thiết bị này thêm "ứng dụng đã cài đặt" vào bảng tra cứu khi khởi động thiết bị cho phép các biểu tượng trình khởi chạy tiếp tục chính xác các tác vụ đang chạy?

Tôi đã đọc nhiều câu trả lời nghe có vẻ giống với vấn đề của tôi nhưng chỉ cần thêm android:alwaysRetainTaskState="true"hoặc sử dụng launchMode="singleTop"vào Activitycâu trả lời không phải là câu trả lời.

Biên tập:

Sau lần ra mắt gần đây nhất của ứng dụng này, chúng tôi thấy rằng hành vi này đã bắt đầu xảy ra trên tất cả các thiết bị sau lần khởi động lại đầu tiên. Điều này có vẻ điên rồ với tôi nhưng nhìn qua quá trình khởi động lại, tôi thực sự không thể tìm thấy điều gì sai.


1
Điều này có vẻ như là một câu hỏi nhỏ để hỏi, nhưng bạn đã đặt "Đừng giữ hoạt động" thành đúng trong các tùy chọn phát triển của mình cho Xoom chưa?
Andrew Schuster

Không (tôi muốn! :)) - Tôi đã đăng nhập vòng đời của từng Hoạt động và Hoạt động trong nền như vẫn có sẵn (Chúng đã dừng - không bị hủy). HĐH dường như kêu gọi finish()họ trong những trường hợp bắt đầu Activitylại từ đầu thay vì nối lại chúng.
Graeme

1
Nếu bạn đã nhấn nút home và sau đó nhấp vào biểu tượng trình khởi chạy, hành vi tiếp tục là mặc định cho Android như bạn có thể biết. Tuy nhiên, nếu bạn nhấn nút quay lại để trở về màn hình chính, hầu hết các điện thoại sẽ kết thúc () ứng dụng. Có thể bất cứ phương pháp nào bạn đang sử dụng để thoát ứng dụng là khác nhau trên các thiết bị khác nhau không? Bạn có thể đăng xuất onKeyUpEvent để kiểm tra xem một số không xử lý các phím cứng / mềm một cách kỳ lạ không?
Nick Cardoso

2
Không - Tôi chắc chắn về vấn đề như đã nêu ở trên. Sử dụng trang chủ để đặt ứng dụng ở chế độ nền (không quay lại, điều mà bạn đúng sẽ kết thúc () Hoạt động). Trên Xoom có ​​thể tiếp tục ứng dụng từ Danh sách tác vụ (không phải từ Trình khởi chạy) nên backstack chắc chắn không bị giết.
Graeme

1
Trả lời với tiền thưởng là cách khắc phục vấn đề được mô tả trong câu hỏi. Đánh dấu câu trả lời của riêng tôi là "chính xác" bởi vì mặc dù đôi khi sự cố là do lỗi ứng dụng trong trình khởi chạy (như đã lưu ý trong câu trả lời của anh ấy), vấn đề cụ thể của tôi là do chuyển đổi tác vụ. Giải pháp cho cả hai vấn đề được khắc phục bằng giải pháp của mình.
Graeme

Câu trả lời:


238

Hành vi bạn đang gặp phải là do sự cố tồn tại trong một số trình khởi chạy Android kể từ API 1. Bạn có thể tìm thấy chi tiết về lỗi cũng như các giải pháp có thể có tại đây: https://code.google.com.vn/p/android/issues/ chi tiết? id = 2373 .

Đây là một vấn đề tương đối phổ biến trên các thiết bị Samsung cũng như các nhà sản xuất khác sử dụng trình khởi chạy / skin tùy chỉnh. Tôi chưa thấy vấn đề xảy ra trên một trình khởi chạy Android chứng khoán.

Về cơ bản, ứng dụng không thực sự khởi động lại hoàn toàn, nhưng Hoạt động khởi chạy của bạn đang được khởi động và thêm vào đầu ngăn xếp Hoạt động khi ứng dụng đang được khởi chạy lại bởi trình khởi chạy. Bạn có thể xác nhận đây là trường hợp bằng cách nhấp vào nút quay lại khi bạn tiếp tục ứng dụng và được hiển thị Hoạt động khởi chạy. Sau đó, bạn sẽ được đưa đến Hoạt động mà bạn dự kiến ​​sẽ được hiển thị khi bạn tiếp tục ứng dụng.

Cách giải quyết mà tôi đã chọn để thực hiện để giải quyết vấn đề này là kiểm tra danh mục Intent.CATEGORY_LAUNCHER và hành động Intent.ACTION_MAIN trong ý định bắt đầu Hoạt động ban đầu. Nếu hai cờ đó có mặt và Hoạt động không nằm ở gốc của tác vụ (có nghĩa là ứng dụng đã chạy), thì tôi gọi kết thúc () trên Hoạt động ban đầu. Giải pháp chính xác đó có thể không hiệu quả với bạn, nhưng một cái gì đó tương tự nên làm.

Đây là những gì tôi làm trong onCreate () của Hoạt động ban đầu / khởi chạy:

    if (!isTaskRoot()
            && getIntent().hasCategory(Intent.CATEGORY_LAUNCHER)
            && getIntent().getAction() != null
            && getIntent().getAction().equals(Intent.ACTION_MAIN)) {

        finish();
        return;
    }

4
Cho đến nay điều này làm việc cho tôi không có tác dụng phụ bất lợi cho đến nay. Dựa trên các giả định logic, tôi thấy không có lý do tại sao nó không hợp lệ.
javahead76

3
Tôi nghĩ rằng đây là cách thích hợp để đối phó với lỗi này. Làm việc cho tôi.
Sokolov

3
đã làm công việc cho tôi, xác minh trên khoảng 8 thiết bị khác nhau. cảm ơn rất nhiều!
shaya ajzner

3
WOOOOOW đã khắc phục sự cố của tôi, tôi đã tìm cách khắc phục trong 2 giờ qua
Jean Raymond Daher

2
Cảm ơn @ starkej2. Làm việc như người ở.
Rajeev Sahu

54

Câu hỏi này vẫn còn có liên quan trong năm 2016. Hôm nay, một người thử nghiệm QA đã báo cáo một ứng dụng của tôi khởi động lại thay vì tiếp tục từ trình khởi chạy chứng khoán trong Android M.

Trong thực tế, hệ thống đã thêm hoạt động đã khởi chạy vào ngăn tác vụ hiện tại , nhưng nó xuất hiện cho người dùng như thể một sự khởi động lại đã xảy ra và họ đã mất công việc. Trình tự là:

  1. Tải xuống từ cửa hàng play (hoặc apk sideload)
  2. Khởi chạy ứng dụng từ hộp thoại cửa hàng play: hoạt động A xuất hiện [ngăn xếp tác vụ: A]
  3. Điều hướng đến hoạt động B [ngăn xếp nhiệm vụ: A -> B]
  4. Nhấn nút 'Trang chủ'
  5. Khởi chạy ứng dụng từ ngăn kéo ứng dụng: hoạt động A xuất hiện! [ngăn xếp tác vụ: A -> B -> A] (người dùng có thể nhấn nút 'Quay lại' để đến hoạt động 'B' từ đây)

Lưu ý: sự cố này không biểu hiện cho việc gỡ lỗi APK được triển khai qua ADB, chỉ trong các APK được tải xuống từ Cửa hàng Play hoặc được tải bên. Trong các trường hợp sau, ý định khởi chạy từ bước 5 có chứa cờ Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT, nhưng không có trong các trường hợp gỡ lỗi. Vấn đề sẽ biến mất khi ứng dụng đã được khởi động nguội từ trình khởi chạy. Sự nghi ngờ của tôi là Nhiệm vụ được gieo mầm với một Ý định không chính xác (chính xác hơn, không chuẩn) để ngăn chặn hành vi khởi chạy chính xác cho đến khi hoàn thành nhiệm vụ.

Tôi đã thử các chế độ khởi chạy hoạt động khác nhau , nhưng các cài đặt đó sai lệch quá nhiều so với hành vi tiêu chuẩn mà người dùng mong đợi: tiếp tục tác vụ tại hoạt động B. Xem định nghĩa sau về hành vi dự kiến ​​trong hướng dẫn về Nhiệm vụ và Ngăn xếp phía sau , ở cuối trang trong phần 'Bắt ​​đầu một nhiệm vụ':

Bộ lọc mục đích loại này làm cho biểu tượng và nhãn cho hoạt động được hiển thị trong trình khởi chạy ứng dụng, cung cấp cho người dùng cách khởi chạy hoạt động và quay lại tác vụ mà nó tạo ra bất cứ lúc nào sau khi nó được khởi chạy.

Tôi thấy câu trả lời này có liên quan và chèn đoạn sau vào phương thức 'onCreate' của hoạt động gốc của tôi (A) để nó tiếp tục phù hợp khi người dùng mở ứng dụng.

                    /**
     * Ensure the application resumes whatever task the user was performing the last time
     * they opened the app from the launcher. It would be preferable to configure this
     * behavior in  AndroidMananifest.xml activity settings, but those settings cause drastic
     * undesirable changes to the way the app opens: singleTask closes ALL other activities
     * in the task every time and alwaysRetainTaskState doesn't cover this case, incredibly.
     *
     * The problem happens when the user first installs and opens the app from
     * the play store or sideloaded apk (not via ADB). On this first run, if the user opens
     * activity B from activity A, presses 'home' and then navigates back to the app via the
     * launcher, they'd expect to see activity B. Instead they're shown activity A.
     *
     * The best solution is to close this activity if it isn't the task root.
     *
     */

    if (!isTaskRoot()) {
        finish();
        return;
    }

CẬP NHẬT: chuyển giải pháp này khỏi việc phân tích cờ mục đích sang truy vấn nếu hoạt động nằm ở gốc của tác vụ. Cờ ý định rất khó dự đoán và thử nghiệm với tất cả các cách khác nhau để mở một hoạt động CHÍNH (Khởi chạy từ nhà, khởi chạy từ nút 'lên', khởi chạy từ Cửa hàng Play, v.v.)


4
"Vấn đề sẽ biến mất một khi ứng dụng đã được khởi động lạnh từ trình khởi chạy." Đây là phần kỳ lạ nhất và tôi cũng đã quan sát nó - giết ứng dụng sau lần ra mắt đầu tiên, nó bắt đầu hoạt động bình thường trở lại. Như một lỗi kỳ lạ. Cảm ơn đã phân tích nó một cách xuyên suốt và cho giải pháp.
Oded

11
Lưu ý: bạn có thể tái tạo sự cố sau khi xóa nó lần đầu (bằng cách "khởi động nguội" như bạn đã mô tả) bằng cách sử dụng "Mở" từ trang Google Play của ứng dụng, ngay cả khi bạn đã cài đặt APK qua Android Studio . Tôi thấy điều này rất hữu ích để xác minh sửa chữa làm việc.
Oded

Giải thích tốt đẹp!
karanatwal.github.io

Cảm ơn lời giải thích này :)
AndroidEnthusiast

2
Điều này xảy ra với rất nhiều ứng dụng. Google Photos là một ứng dụng chính mà tôi đã thử nghiệm.
Raghubansh Mani

19

Aha! (tldr; Xem các tuyên bố in đậm ở phía dưới)

Tôi đã tìm thấy vấn đề ... tôi nghĩ.

Vì vậy, tôi sẽ bắt đầu với một giả định. Khi bạn nhấn trình khởi chạy, nó sẽ khởi động mặc định Activityhoặc, nếu Taskkhởi động bởi lần khởi chạy trước được mở, nó sẽ đưa nó ra phía trước. Đặt một cách khác - Nếu ở bất kỳ giai đoạn nào trong điều hướng của bạn, bạn tạo một cái mới Taskfinishcái cũ, thì trình khởi chạy sẽ không còn tiếp tục ứng dụng của bạn nữa.

Nếu giả sử đó là đúng, tôi khá chắc chắn rằng đó có phải là một lỗi không, cho rằng mỗi lỗi Tasktrong cùng một quy trình và có hợp lệ như một ứng cử viên tiếp tục như người đầu tiên được tạo không?

Vấn đề của tôi sau đó, đã được khắc phục bằng cách xóa những cờ này khỏi một vài Intents:

i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK );

Mặc dù nó khá rõ ràng FLAG_ACTIVITY_NEW_TASKtạo ra một cái mới Task, tôi không đánh giá cao rằng giả định trên có hiệu lực. Tôi đã coi đây là một thủ phạm và loại bỏ nó để kiểm tra và tôi vẫn đang gặp vấn đề nên tôi đã loại bỏ nó. Tuy nhiên, tôi vẫn có các điều kiện dưới đây:

i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)

Màn hình giật gân của tôi đã bắt đầu "chính" Activitytrong ứng dụng của tôi bằng cách sử dụng cờ ở trên. Dù sao đi nữa, nếu tôi đã "khởi động lại" ứng dụng của mình và ứng dụng Activityvẫn đang chạy, tôi sẽ giữ gìn thông tin trạng thái của nó.

Bạn sẽ chú ý trong tài liệu mà nó không đề cập đến việc bắt đầu một cái mới Task:

Nếu được đặt và hoạt động được khởi chạy đã chạy trong tác vụ hiện tại, thì thay vì khởi chạy một phiên bản mới của hoạt động đó, tất cả các hoạt động khác ở trên cùng sẽ bị đóng và Ý định này sẽ được gửi đến (ngay bây giờ đầu trang) hoạt động cũ như một ý định mới.

Ví dụ, hãy xem xét một nhiệm vụ bao gồm các hoạt động: A, B, C, D. Nếu D gọi startActivity () với một Ý định giải quyết thành phần của hoạt động B, thì C và D sẽ kết thúc và B nhận được Ý định đã cho , dẫn đến ngăn xếp bây giờ là: A, B.

Ví dụ hiện đang chạy của hoạt động B trong ví dụ trên sẽ nhận được ý định mới mà bạn đang bắt đầu ở đây trong phương thức onNewIntent () của nó hoặc tự kết thúc và khởi động lại với mục đích mới. Nếu nó đã tuyên bố chế độ khởi chạy của nó là "nhiều" (mặc định) và bạn chưa đặt FLAG_ACTIVITY_SINGLE_TOP trong cùng một mục đích, thì nó sẽ được hoàn thành và tạo lại; đối với tất cả các chế độ khởi chạy khác hoặc nếu FLAG_ACTIVITY_SINGLE_TOP được đặt thì Ý định này sẽ được gửi đến phiên bản hiện tại onNewIntent ().

Chế độ khởi chạy này cũng có thể được sử dụng để có hiệu quả tốt khi kết hợp với FLAG_ACTIVITY_NEW_TASK: nếu được sử dụng để bắt đầu hoạt động gốc của một tác vụ, nó sẽ đưa bất kỳ trường hợp nào đang chạy của tác vụ đó lên nền trước, sau đó xóa nó về trạng thái gốc. Điều này đặc biệt hữu ích, ví dụ, khi khởi chạy một hoạt động từ trình quản lý thông báo.

Vì vậy, tôi đã có tình huống như được mô tả dưới đây:

  • Ara mắt Bvới FLAG_ACTIVITY_CLEAR_TOP, Akết thúc.
  • Bmuốn khởi động lại một dịch vụ để gửi người dùng đến Ađó có logic và giao diện người dùng khởi động lại dịch vụ (Không có cờ).
  • Akhởi chạy Bvới FLAG_ACTIVITY_CLEAR_TOP, Akết thúc.

Ở giai đoạn này, FLAG_ACTIVITY_CLEAR_TOPcờ thứ hai đang khởi động lại Btrong ngăn tác vụ. Tôi cho rằng điều này phải phá hủy Taskvà bắt đầu một cái mới, gây ra vấn đề của tôi, đây là một tình huống rất khó phát hiện nếu bạn hỏi tôi!

Vì vậy, nếu tất cả các giả định của tôi là chính xác:

  • Các Launcherchỉ sơ yếu lý lịch công tác ban đầu tạo
  • FLAG_ACTIVITY_CLEAR_TOPnếu nó khởi động lại chỉ còn lại Activity, cũng sẽ tạo lại một cái mớiTask

FLAG_ACTIVITY_CLEAR_TOP không tạo tác vụ mới hoặc khởi động lại Hoạt động bạn đang cố bắt đầu nếu đó là Hoạt động duy nhất còn lại. "Nếu được đặt và hoạt động được khởi chạy đã chạy trong tác vụ hiện tại, thì thay vì khởi chạy một phiên bản mới của hoạt động đó, tất cả các hoạt động khác trên đầu trang sẽ bị đóng và Ý định này sẽ được gửi đến (ngay bây giờ trên cùng) hoạt động cũ như một ý định mới. "
starkej2

2
Tôi nhận ra điều đó không có nghĩa - nhưng thông qua thử nghiệm và lỗi, đây là trường hợp của tôi. Loại bỏ các cờ này khắc phục vấn đề.
Graeme

Điều này không tạo ra một sơ yếu lý lịch hoàn hảo trên tất cả các thiết bị trong mọi điều kiện.
danny117

Xóa cờ đã khắc phục sự cố cho tôi. Cảm ơn
Sealer_05

Tôi có kịch bản màn hình giật gân / màn hình chính nhưng tôi không sử dụng bất kỳ cờ nào để chuyển từ giật gân sang chính, vấn đề vẫn có thể lặp lại với tôi - giải pháp này không hiệu quả với tôi.
ROR

12

Tôi đã có vấn đề tương tự trên các thiết bị Samsung. Sau khi tìm kiếm rất nhiều, không có câu trả lời nào trong số này làm việc cho tôi. Tôi thấy rằng trong tệp AndroidManifest.xml , launchModeđược đặt thành singleInstance( android:launchMode="singleInstance"). Loại bỏ launchModethuộc tính đã khắc phục vấn đề của tôi.


Thật vậy, điều này cũng đã lừa tôi. Tôi tìm thấy câu trả lời này từ một câu hỏi SO khác có ích: stackoverflow.com/a/21622266/293280 . Và điều này viết lên các loại launchModegiá trị khác nhau : inthecheesefactory.com/blog/ Kẻ
Joshua Pinter

Sửa chữa này làm việc cho tôi! Đã thêm điều này không phải trong tệp kê khai mà trong thuộc tính hoạt động trên lớp hoạt động chính.
Calin Vlasin

@CalinVlasin bạn có thể chỉ cho tôi chính xác cách bạn sử dụng launchMode không? bạn đã đặt nó ở đâu Hiện tại tôi có nó như thế này nhưng nó gây ra vấn đề: <Activity android: name = ". UI.landing.MyActivity" android: configChanges = "locale | layoutDirection" android: launchMode = "singleTop" android: windowSoftInputMode = "stateAlwaysHidden | ">
j2emanue

Đây cũng là vấn đề của tôi. Tôi nghĩ rằng điều này nên được sử dụng cùng với câu trả lời được chấp nhận (! IsTaskRoot ...
tuân theo

1

Trên Cat s60 của tôi, tôi đã bật "Không giữ hoạt động" trong tùy chọn Nhà phát triển, việc vô hiệu hóa lại cho phép tôi chuyển đổi ứng dụng mà không mất trạng thái của ứng dụng ...


Không biết làm thế nào, nhưng điều này đã BẬT trên thiết bị của tôi.
realPro

0

Giải pháp này hiệu quả với tôi:

    @Override
    public boolean onKeyUp(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK) {
            Intent startMain = new Intent(Intent.ACTION_MAIN);
            startMain.addCategory(Intent.CATEGORY_HOME);
            startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            startActivity(startMain);
            return false;
        }
        else
            return super.onKeyUp(keyCode, event);
    }

tín dụng: Tôi cần giảm thiểu ứng dụng Android khi nhấp vào nút quay lại

có thể không hoạt động trên tất cả các thiết bị, nhưng tạo thành công hành vi nút home khi nhấn nút quay lại, do đó dừng hoạt động thay vì kết thúc nó.


Thủ thuật thú vị nhưng không giải quyết được vấn đề như đã nêu. Rất hữu ích cho các vấn đề / câu hỏi khác mặc dù.
Graeme

Nút quay lại có một mục đích cụ thể và người dùng mong đợi nút quay lại để thực hiện những gì nó phải làm. Ghi đè nó theo bất kỳ cách nào là sai và theo tôi, rất không chuyên nghiệp.
Lỗi xảy ra

-1

Tôi đã có cùng một vấn đề, nguyên nhân là:

(Mã Kotlin, trong MainActivity)

override fun onBackPressed() {
    finish()
}

Vì vậy, khi điều hướng đến MainActivity của tôi từ Đăng nhậpActivity của tôi, tôi sử dụng điều này:

    val intent = Intent(this, MainActivity::class.java)
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK)
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
    startActivity(intent)

Khi sử dụng các cờ này, tôi không cần phải có onBackPression () trong MainActivity của mình, nó sẽ thoát ứng dụng một cách tự nhiên khi nhấp lại. Và khi nhấn nút Home và quay lại ứng dụng, nó không khởi động lại.


-2

Giải pháp cho những người không có ý tưởng về lập trình và gặp vấn đề này trong điện thoại Android của họ. Điều này xảy ra chủ yếu là do nâng cấp phiên bản Android (chỉ giả định của tôi). Sau khi nâng cấp, tất cả các ứng dụng của bạn sẽ được tối ưu hóa để sử dụng ít pin hơn. Nhưng, điều này lần lượt làm chậm thiết bị của bạn.

Giải quyết thế nào

Chuyển đến cài đặt >> Ứng dụng >> cài đặt ứng dụng (tìm ký hiệu cài đặt ở bất kỳ đâu trên màn hình - nó khác với các thiết bị khác nhau) >> tối ưu hóa pin (hoặc opti tương tự [nhập mô tả hình ảnh tại đây] [1] bật) >> di chuyển tất cả các ứng dụng ở trạng thái 'không được tối ưu hóa' (phải thực hiện từng bước một theo cách thủ công - có thể được phép / không cho phép trong một số điện thoại). Ứng dụng trình khởi chạy của bạn cần phải được 'không tối ưu hóa' (Trình khởi chạy Zen UI trong trường hợp của tôi - đây là thủ phạm tôi đoán - bạn có thể thử tối ưu hóa / Không tối ưu hóa và khởi động lại ứng dụng khác nếu bạn có thời gian). Bây giờ khởi động lại điện thoại của bạn. (không cần thiết lập lại dữ liệu / chế độ an toàn hoặc bất kỳ rắc rối nào)

Hãy thử đa nhiệm ngay bây giờ. :) Nhấn biểu tượng trình khởi chạy sẽ dẫn đến tác vụ hiện tại được tiếp tục. :) Thiết bị của bạn sẽ trở nên Đừng lo lắng về pin, dù sao thì nó cũng sẽ hết.


-8

Vô giá cho người dùng của bạn. Sơ yếu lý lịch hoàn hảo ngay cả sau khi ngồi hàng tuần trong danh sách ứng dụng được sử dụng gần đây.

Nó trông giống như một sơ yếu lý lịch cho người dùng nhưng thực sự là một khởi đầu đầy đủ.

Bối cảnh: Bộ nhớ được sử dụng bởi các ứng dụng nằm trong hoạt động chính chưa bắt đầu tác vụ rất dễ lấy lại. Hệ điều hành có thể chỉ cần khởi động lại ứng dụng với gói ban đầu được truyền cho onCreate. Tuy nhiên, bạn có thể thêm vào gói ban đầu onSaveInstanceStateđể khi ứng dụng của bạn được khởi động lại bởi HĐH, bạn có thể khôi phục trạng thái cá thể và không ai khôn ngoan hơn về việc ứng dụng được khởi động lại hay tiếp tục. Lấy ví dụ chương trình bản đồ cổ điển. Người dùng di chuyển đến một vị trí trên bản đồ và sau đó nhấn phím home. Hai tuần sau, ứng dụng bản đồ này vẫn nằm trong danh sách các ứng dụng gần đây cùng với facebook, pandora và candy crush. HĐH không chỉ lưu tên ứng dụng cho các ứng dụng được sử dụng gần đây, nó cũng lưu gói gốc được sử dụng để khởi động ứng dụng. Tuy nhiên, lập trình viên đã mã hóaonSaveInstanceState phương pháp để gói gốc hiện chứa tất cả các tài liệu và thông tin cần thiết để xây dựng ứng dụng để có vẻ như nó được nối lại.

Ví dụ: Lưu vị trí camera hiện tại trong onSaveInstanceState chỉ cần tải ứng dụng xuống và phải được khởi động lại vài tuần sau đó từ danh sách các ứng dụng gần đây.

@Override
    public void onSaveInstanceState(Bundle savedInstanceState) {
        super.onSaveInstanceState(savedInstanceState);
        // save the current camera position;
        if (mMap != null) {
            savedInstanceState.putParcelable(CAMERA_POSITION,
                    mMap.getCameraPosition());
        }
    }



@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // get the exact camera position if the app was unloaded.
        if (savedInstanceState != null) {
            // get the current camera position;
            currentCameraPosition = savedInstanceState
                    .getParcelable(CAMERA_POSITION);
        }

Lưu ý: bạn cũng có thể sử dụng onRestoreInstanceStatephương thức nhưng tôi thấy việc khôi phục thể hiện trong dễ dàng hơn onCreate.

Đây là nhiều khả năng những gì đang xảy ra trong ứng dụng của bạn. Trên một số thiết bị, ứng dụng của bạn được tải vào bộ nhớ trống. Vâng, có một số cờ giúp nhưng cờ sẽ không thu được mọi sắc thái của ứng dụng của bạn và cờ sẽ không giúp bạn sống trong nhiều tuần như onSaveInstanceStateý muốn . Bạn phải mã hoàn hảo hai tuần sau đó tiếp tục. Nó sẽ không phải là một nhiệm vụ dễ dàng cho ứng dụng phức tạp nhưng chúng tôi đứng sau bạn và sẵn sàng giúp đỡ bạn.

Chúc may mắn


Điều này không phải do mối quan tâm bộ nhớ chung hoặc điều kiện "trạng thái tạm dừng" mặc định. Tôi đã thử ứng dụng của mình trên nhiều thiết bị (một số có bộ nhớ lớn, một số có bộ nhớ thấp hơn).
Graeme

Đây là lý do tại sao bạn lưu dữ liệu liên tục trong onPause. Tôi đã thử ứng dụng của tôi để tiếp tục sau hai tuần trên điện thoại tôi sử dụng hàng ngày và để tôi nói với bạn sau hai tuần, phương thức onCreate được gọi và os đã lưu trong gói tôi đã lưu trong onSaveSessionState và tôi sử dụng dữ liệu trong gói để làm cho hoạt động của tôi xuất hiện chính xác khi tôi rời khỏi nó. Vì vậy, chỉ còn ba ngày kể từ câu trả lời của tôi nên không có cách nào bạn có thể hoàn thành bài kiểm tra hai tuần. Tóm tắt: Ứng dụng có thể được tắt bất cứ khi nào nó ở trong nền.
danny117

@ danny117 Tôi không nghĩ bạn có hiểu chính xác về vấn đề mà Graeme đang gặp phải
starkej2

Tôi hiểu vấn đề của Graeme. Trên một số thiết bị nối lại ứng dụng gọi onCreate. Âm thanh chính xác như HTC EVO (Gingerbread) của tôi sẽ giết ứng dụng chỉ để xoay màn hình. Nhìn vào các tài liệu mà nó nói để ứng dụng có thể được khôi phục trong onCreate developer.android.com/reference/android/app/
Kẻ

@ danny117 đúng, nhưng vấn đề anh ta gặp phải không liên quan đến một hoạt động được tạo lại khi ứng dụng được nối lại (dự kiến), nhưng hoạt động sai đang được bắt đầu
starkej2
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.