Điều gì thực sự xảy ra khi bạn vuốt một ứng dụng ra khỏi danh sách ứng dụng gần đây?


147

Danh sách ứng dụng gần đây trong Ice Cream Sandwich đã thêm khả năng vuốt các ứng dụng ra khỏi danh sách, do đó loại bỏ chúng vĩnh viễn (và theo như tôi biết đây là chức năng vanilla, không phải là CM / ROM tùy chỉnh). Các tài liệu và điểm nổi bật về nền tảng dường như không đề cập đến hoạt động của chức năng này, nhưng tôi tò mò muốn biết hệ thống đang thực sự làm gì.

Thêm vào sự tò mò của tôi, tôi quyết định thực hiện một bài kiểm tra nhanh: Tôi đã khởi động Music trên bản cài đặt CM9, sau đó sao lưu nó. Sau đó tôi đã kiểm tra danh sách ứng dụng gần đây và thấy nó thực sự ở đó (và ở trạng thái thích hợp, dựa trên hình thu nhỏ). Sau đó tôi đã đi vào Settings->Applicationsvà buộc dừng ứng dụng Âm nhạc, nhưng nó vẫn được liệt kê trong danh sách gần đây, khiến tôi tin rằng nó không được kết nối với các quá trình kéo dài trong nền.

Nhận ra rằng Âm nhạc có thể là một lựa chọn tồi, tôi cũng đã thử nghiệm với ứng dụng USA Today. Điều này về cơ bản thể hiện hành vi tương tự, và có vẻ như nó đã bị buộc phải "khởi chạy lại" sau khi dừng lực lượng (điều này có ý nghĩa) mặc dù hình thu nhỏ trong danh sách ứng dụng gần đây không phản ánh điều này (lưu vào bộ nhớ, tôi đoán vậy?).

Vậy, điều gì thực sự xảy ra ở cấp độ HĐH khi bạn vuốt một ứng dụng ra khỏi danh sách gần đây? Có phải nó chỉ đơn giản là xóa dữ liệu của ứng dụng ra khỏi RAM và rác thu thập nó, phá hủy trạng thái đã lưu của nó?

Câu trả lời:


68

Các ứng dụng vuốt ra khỏi danh sách ứng dụng gần đây là vanilla, và vâng, không được ghi chép rõ ràng. Đây là chủ đề của một số lượng lớn các cuộc thảo luận trên các diễn đàn Android khác nhau ... sự đồng thuận dường như được mô tả tốt nhất ở đây trong một số ý kiến : rằng hành vi tương tự nhưng không hoàn toàn giống như đóng ứng dụng - nói chung ( đối với các ứng dụng không xác định xử lý nút quay lại rõ ràng), điều tương tự như việc quay lại đủ số lần từ bên trong một ứng dụng mà bạn thoát khỏi ứng dụng đó.

Liên kết có thêm một số chi tiết về các chi tiết cụ thể, nhưng nhìn chung bạn có thể nghĩ về nó như thoát khỏi ứng dụng.

Cụ thể với ứng dụng Âm nhạc, tôi tin rằng nó khởi động một dịch vụ, vì vậy trong khi nhiệm vụ (ứng dụng / Giao diện âm nhạc) có thể bị đóng, dịch vụ tiếp tục chạy trong nền để nhạc của bạn không đột ngột dừng lại chỉ vì tác vụ đã bị xóa vì lý do quản lý bộ nhớ. Điều đó có thể đã ảnh hưởng đến những gì bạn nhìn thấy.


1
Cảm ơn, liên kết đó có rất nhiều cuộc thảo luận tốt. Bạn cũng có thể đúng: Âm nhạc, đó có thể là một bài kiểm tra kém. Tôi sẽ thử một ứng dụng khác, chỉ để đá.
eldarerathis

2
Đi trước và chấp nhận điều này vì cuộc thảo luận reddit đã giúp tôi tìm thấy một số thuật ngữ tìm kiếm tốt hơn và dường như được chứng thực bởi một số bài đăng của Dianne Hackborn mà tôi đã lưu ý trong câu trả lời của mình . Cảm ơn!
eldarerathis


1
Hoàn hảo cảm ơn bạn! Đối với tôi, bài đăng này đã giúp tôi: reddit.com/r/Android/comments/mpevh/
Khăn

Trình phát nhạc của bên thứ ba như Rocket Player dừng nhạc khi bạn vuốt ứng dụng từ danh sách Gần đây ngay cả khi dịch vụ chạy trong nền và bạn cần mở ứng dụng hoặc phát lại trong widget để khởi động nhạc.
May mắn

78

Tôi dường như đã tìm thấy các thuật ngữ tìm kiếm kỳ diệu dẫn đến một số giải thích từ nhân viên của Google. Cụ thể, tôi tìm thấy một vài nơi khác nhau, nơi Dianne Hackborn giải thích những gì xảy ra khi bạn vuốt thứ gì đó ra khỏi danh sách gần đây. Đầu tiên là một nhận xét về một trong những bài đăng trên Google+ của cô ấy :

Mũ [W] đặc biệt xảy ra khi bạn thực hiện một tác vụ gần đây: (1) giết bất kỳ nền hoặc quy trình trống nào của ứng dụng (xem http://developer.android.com/guide/topics/fundamentals/ Processes-and- chủ đề.html # Vòng đời cho ý nghĩa của điều này) và (2) sử dụng API http://developer.android.com/reference/android/app/Service.html#onTaskRemond(android.content.Intent) mới để nói với bất kỳ các dịch vụ của ứng dụng về tác vụ bị xóa để nó có thể làm bất cứ điều gì nó cho là phù hợp.

Cô cũng ghi chú trong một bình luận blog :

Trên thực tế, loại bỏ một mục trong các tác vụ gần đây sẽ giết bất kỳ quy trình nền nào tồn tại cho quy trình. Nó sẽ không trực tiếp khiến các dịch vụ dừng lại, tuy nhiên có một API để họ tìm ra nhiệm vụ đã bị xóa để quyết định xem họ có muốn điều này có nghĩa là họ nên dừng lại hay không. Điều này là để loại bỏ nhiệm vụ gần đây của một ứng dụng e-mail sẽ không khiến nó ngừng kiểm tra e-mail.

Nếu bạn thực sự muốn dừng hoàn toàn một ứng dụng, bạn có thể nhấn và giữ các tác vụ gần đây để truy cập thông tin ứng dụng và nhấn dừng lại ở đó. Đối với dừng là tiêu diệt hoàn toàn ứng dụng - tất cả các quy trình đều bị hủy, tất cả các dịch vụ bị dừng, tất cả các thông báo đã bị xóa, tất cả các báo thức đã bị xóa, v.v. Ứng dụng không được phép khởi chạy lại cho đến khi được yêu cầu rõ ràng.

Vì vậy, có vẻ như tóm tắt là việc vuốt một ứng dụng ra khỏi danh sách trước tiên sẽ giết tất cả các quy trình nền cho ứng dụng, sau đó sử dụng onTaskRemovedđể thông báo cho ứng dụng rằng tác vụ nền đã bị xóa. Vào thời điểm đó, có vẻ như tùy thuộc vào ứng dụng để quyết định điều gì sẽ xảy ra, vì vậy tôi đoán rằng về mặt kỹ thuật không phải là một quy tắc khó và nhanh về những gì xảy ra với ứng dụng ngoài thời điểm đó.


Đó chắc chắn là hành vi không rõ ràng, rất thú vị!
Matthew Đọc

"giết bất kỳ quy trình nền nào tồn tại cho quy trình. Nó sẽ không trực tiếp khiến các dịch vụ dừng lại". Điều này có còn đúng không? Tôi đã chạy thử nghiệm ngày hôm qua. Hôm qua, tôi đã xóa một ứng dụng với dịch vụ nền trong quy trình chính. Các ứng dụng => UI đang chạy hiển thị 0 quy trình và 0 dịch vụ. Sau đó, tôi đã xóa đi cùng một ứng dụng với một quy trình đang chạy trong một quy trình cụ thể của ứng dụng. Các ứng dụng => UI đang chạy cho biết tôi có 0 quy trình và 1 dịch vụ. Đó là trên Moto X (2014) với Android 4.4.4.
Steven Wexler

@StevenWexler: Có thể là dịch vụ đã tự kết thúc trong trường hợp đầu tiên nhưng không phải là lần thứ hai hoặc có thể là trong kịch bản thứ hai, quy trình chính đã xác định (vì một số lý do) rằng nó không muốn dừng dịch vụ. Khó biết chắc chắn.
eldarerathis

dịch vụ đã bắt đầu tự động bắt đầu lại sau khi vuốt ra khỏi danh sách gần đây, onCreate được gọi lại. nhưng trong một số ứng dụng, onCreate được gọi trước onTaskRemond và trong một số ứng dụng được gọi sau onTaskRemond. Tại sao hành vi này là sau đó?
umesh

21

Có một số thông tin trong mã nguồn trong các lớp com.android.iternal.policy.impl.RecentAppluggestBackgroundcom.android.i INTERNal.policy.impl.RecentAppluggestDialog .

Nếu tôi đọc chính xác, sẽ có các trình xử lý cụ thể để chọn ứng dụng nhưng không có gì đặc biệt để vuốt chúng ngoại trừ onDetachedFromWindow(), các cuộc gọi com.android.View.onDetachedFromWindow()về cơ bản che giấu phần tử và xóa dữ liệu của nó. Điều này sẽ gợi ý cho thực tế rằng không có gì đặc biệt xảy ra khi vuốt ứng dụng, tương ứng với câu trả lời của Austin Mills, vì danh sách không hiển thị ứng dụng đang hoạt động, onPause()và các cuộc gọi hệ thống khác được thực hiện khi "thoát" ứng dụng vừa mới xảy ra.


10

Tôi nghĩ rằng nó sẽ làm tương tự như nút quay lại làm. Ngoại trừ một chút thay đổi. Nó sẽ finish()tất cả các hoạt động / mảnh trong ứng dụng.

Chỉ cần làm một thử nghiệm nhỏ với một ứng dụng selfbuild nhỏ. Bạn có thể kiểm tra, quá. Đây là ứng dụng thử nghiệm của tôi: https://bitbucket.org/Leandros99/lifecycletest (tải xuống cũng có sẵn. Dành cho những người không thể xây dựng.)
Trong mọi phương pháp vòng đời Activity ( http://developer.android.com/reference/android/app /Activity.html#ActivityLifecycle ) in nhật ký ứng dụng. Bạn có thể xem nó bằng logb adb (cài đặt Android SDK, cd cho các công cụ nền tảng theo cmd / shell và gõ adb logcat. Bây giờ bạn sẽ thấy, mỗi khi bạn làm gì đó như nhấn trở lại hoặc nút home, ứng dụng sẽ in phương thức vòng đời, được đề cập ở trên. )

Câu hỏi của bạn: Nếu tôi vuốt một ứng dụng từ ngăn kéo ứng dụng gần đây, onDestroyphương thức sẽ được gọi. Nó gần giống như nút quay lại.
Hy vọng tôi đã giúp một chút. Nếu có câu hỏi, chỉ cần hỏi.


3

Nó đóng ứng dụng và dữ liệu của nó được lưu trữ trong RAM. Do đó, cung cấp cho bạn nhiều không gian RAM hơn để bạn có thể chạy các ứng dụng khác. Tuy nhiên, các dịch vụ nền KHÔNG được tự động buộc đóng do kết quả của việc đóng ứng dụng.


1
Mặc dù được viết bằng ngôn ngữ hàng ngày, đây thực sự là một câu trả lời khá chính xác - nó nắm bắt được thực tế rằng quá trình này đã bị loại bỏ, rất nhiều câu trả lời khác (những người so sánh nhầm với nút quay lại) bị thiếu. Tuy nhiên, điều còn thiếu ở đây là nhận ra rằng Android sẽ loại bỏ các tiến trình khi cần để lấy bộ nhớ, vì vậy trong khi nó hoàn thành một số dọn dẹp bộ nhớ, điều đó sẽ tự động xảy ra nếu / khi cần.
Chris Stratton
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.