2013-06-27 23 views
10

Tôi đã trải qua tài liệu cho một cá thể và đang thử một vài mẫu. Trong một mẫu của tôi, tôi có ba hoạt động: A-> B-> C, trong đó B có android: launchMode = "singleInstance" trong tệp kê khai. Hoạt động A và C có chế độ khởi chạy mặc định.Android: Chế độ khởi chạy 'một cá thể'

Kịch bản:

Sau khi điều hướng đến C qua A và B (tức là A-> B-> C), trở lại nút bấm từ Hoạt động C cần thiết để Hoạt động A (C-> A), nhưng lại nhấn nút từ Hoạt động A không thoát khỏi ứng dụng, thay vì đưa Hoạt động B sang trước, sau đó nhấn nút quay lại từ Hoạt động B thoát ứng dụng.

Câu hỏi

Tại sao Hoạt động B đến foreground khi nút quay lại được nhấn từ Hoạt động A?

kịch bản khác:

Similarliy, từ Hoạt động C nếu người dùng nhấn nút thiết bị Home, và trở lại các ứng dụng bằng cách bấm nhà dài, C nằm trong foreground. Nhưng nút bấm nút quay lại mất C-> A -> thoát ứng dụng. Lần này Activity B không đến trước.

Trả lời

20

Sau khi điều hướng từ A-> B bạn có 2 nhiệm vụ: Người đầu tiên chứa Một, điều thứ hai chứa B . B ở trên cùng và A thấp hơn.

Bây giờ khi điều hướng từ B-> C Android ra mắt hoạt động C vào nhiệm vụ chứa A (nó không thể khởi động nó vào nhiệm vụ chứa B vì B được định nghĩa là "singleInstance", vì vậy nó sẽ khởi động nó vào một nhiệm vụ có cùng một "taskAffinity", trong trường hợp này tác vụ chứa A). Để làm điều đó, Android mang đến nhiệm vụ chứa A ở phía trước. Bây giờ bạn có 2 nhiệm vụ: Nhiệm vụ có chứa A và C ở phía trước, và nhiệm vụ thứ hai chứa B bên dưới.

Bây giờ bạn nhấn phím BACK, kết thúc hoạt động C và quay trở lại hoạt động bên dưới trong nhiệm vụ, cụ thể là C. Bạn vẫn có 2 nhiệm vụ: Một chứa C ở phía trước và một chứa B bên dưới .

Bây giờ bạn nhấn phím BACK một lần nữa. Thao tác này kết thúc hoạt động A (và do đó hoàn thành nhiệm vụ được giữ A) và đưa nhiệm vụ trước đó vào ngăn tác vụ lên phía trước, cụ thể là nhiệm vụ chứa B.Bây giờ bạn có 1 nhiệm vụ: nhiệm vụ chứa B.

Trong của bạn kịch bản khác, sau khi điều hướng từ A-> B-> C, bạn bắt đầu với 2 nhiệm vụ: Nhiệm vụ chứa A và C ở phía trước và cái thứ hai chứa B bên dưới.

Bây giờ bạn nhấn nút HOME. Bây giờ bạn nói rằng bạn "quay lại ứng dụng bằng cách nhấn và giữ". Điều này không chính xác. Bạn không thể "quay lại ứng dụng". Bạn chỉ có thể "quay trở lại công việc". Nhưng bạn đã có 2 nhiệm vụ khác nhau: Nếu bạn làm một báo dài, bạn sẽ thấy 2 nhiệm vụ. Họ có thể có cùng biểu tượng (trừ khi bạn đã cung cấp một biểu tượng khác cho hoạt động B) để bạn có thể không thể phân biệt chúng. Nếu bạn chọn nhiệm vụ có chứa A và C, thì nhiệm vụ đó sẽ được đưa lên phía trước với hoạt động C ở trên cùng. Nếu bây giờ bạn nhấn phím BACK, hoạt động C sẽ kết thúc và hoạt động bên dưới, hoạt động A sẽ được hiển thị. Nếu bây giờ bạn nhấn phím BACK một lần nữa, hoạt động A sẽ được hoàn thành và bạn sẽ được đưa trở lại màn hình HOME. Tác vụ chứa B vẫn nằm trong danh sách các tác vụ gần đây, nhưng nó không còn trong ngăn tác vụ trong tác vụ khác của bạn bởi vì khi bạn nhấn nút HOME HOME, nó giống như quay lại số không. Bạn bắt đầu lại từ đầu. Bạn không có tác vụ đang hoạt động, vì vậy mọi tác vụ đều liên tiếp, chúng không nằm trong ngăn xếp và không có phân cấp.

Ngoài ra, trong câu hỏi của bạn, bạn sử dụng cụm từ "thoát ứng dụng". Điều này cũng không hoàn toàn chính xác. Điều duy nhất mà một nút BACK nhấn làm là kết thúc hoạt động hiện tại. Nếu hoạt động hiện tại là hoạt động duy nhất trong một nhiệm vụ, nó cũng hoàn thành nhiệm vụ đó. Tuy nhiên, nó không "thoát khỏi ứng dụng". Đặc biệt trong trường hợp của bạn, vì "ứng dụng" của bạn thực sự tồn tại trong 2 nhiệm vụ riêng biệt.

Hy vọng điều này rõ ràng.

+1

Cảm ơn bạn rất nhiều David .. Câu trả lời của bạn giải thích khái niệm rất rõ ràng, thực sự hữu ích :) Chỉ cần thêm chi tiết hơn, tôi đã có tất cả ba hoạt động A, B và C trong cùng một ứng dụng. Trên báo chí nhà dài, tôi không thể nhìn thấy hai nhiệm vụ riêng biệt, nhưng chỉ có một nhiệm vụ. Cũng liên quan đến CÁC CẢM ỨNG KHÁC, "Nếu bây giờ bạn nhấn phím BACK một lần nữa, hoạt động A sẽ được hoàn thành và bạn sẽ được trả về màn hình HOME." ** Q: ** tại sao nó không đưa chúng ta công việc có chứa B, bởi vì nhiệm vụ chứa B phải ở bên dưới Tác vụ chứa A và C phải không? Hãy sửa tôi nếu tôi sai. – Pravy

+0

Vui lòng đăng bản kê khai của bạn, sau đó tôi có thể giúp bạn nhiều hơn. Chỉ cần thêm nó vào câu hỏi của bạn dưới dạng chỉnh sửa. –

+0

Xin chào, Cuối cùng, sự nhầm lẫn của bạn đã được giải quyết chưa? tại sao nó không đưa chúng ta nhiệm vụ chứa B? Tôi có cùng một sự nhầm lẫn. Nếu bạn biết, xin vui lòng cho tôi biết. Cảm ơn bạn. – CodeAlien

1

Từ các hoạt động doc

  1. "singleInstance" chỉ có thể bắt đầu một nhiệm vụ. Chúng luôn ở gốc của ngăn xếp hoạt động. Hơn nữa, thiết bị chỉ có thể giữ một phiên bản hoạt động tại một thời điểm - chỉ một nhiệm vụ như vậy.

  2. Hoạt động "singleInstance", mặt khác, không cho phép các hoạt động khác tham gia vào nhiệm vụ của mình. Đó là hoạt động duy nhất trong nhiệm vụ. Nếu nó bắt đầu hoạt động khác, hoạt động được gán cho một nhiệm vụ khác nhau

+0

: Cảm ơn bạn đã trả lời, điểm đầu tiên của bạn làm cho nó rõ ràng lý do tại sao nó lại xuất hiện trở lại. Tôi cần làm rõ thêm về cách hoạt động của chồng, các nhiệm vụ khác nhau và các hoạt động cá nhân có liên quan. Theo sự hiểu biết của tôi từ câu trả lời của bạn, hệ điều hành duy trì một ngăn xếp được gọi là 'hoạt động ngăn xếp' có chứa chồng nhiệm vụ, mà inturn (tức là nhiệm vụ cá nhân) sẽ chứa các hoạt động.Nếu bất kỳ hoạt động được tạo ra như trường hợp duy nhất, sau đó nó sẽ được tạo thành nhiệm vụ riêng biệt và nhiệm vụ đó sẽ được đặt ở cuối ngăn xếp. vui lòng cho tôi biết nếu sự hiểu biết của tôi là chính xác. – Pravy

+0

@Pravy .. sự hiểu biết của bạn phù hợp với tôi :) .. .. nếu một hoạt động bắt đầu bình thường (không phải singleinstance hoặc singletask) thì nó chỉ được đẩy vào ngăn xếp – stinepike

+0

Vâng cảm ơn .. nhưng cùng một hành vi khác nhau khi người dùng đã nhấn thiết bị nút home từ hoạt động C. Tôi đã cập nhật nó trong kịch bản khác. Tôi có thể biết điều gì có thể là lý do? – Pravy

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