2012-10-22 30 views
6

Tôi đã tìm kiếm giải pháp về vấn đề của mình trong nhiều thời gian, nhưng tài liệu Android không rõ ràng và các giải pháp web không hoạt động hoàn toàn.Android: tiếp tục Hoạt động với singleTop hoặc SingleTask

Tôi đang phát triển trò chơi trong đó Hoạt động chính (nơi diễn ra trò chơi) có thể gọi một Hoạt động đơn giản khác và quay lại. Nó sẽ làm việc như thế này:

  1. Nếu người dùng nhấp vào nút Home và sau đó quay trở lại các trò chơi, hoạt động này phải được dừng lại và sau đó lại tiếp tục không vượt qua onDestroy (nếu không nó sẽ mất trạng thái của game)
  2. Chức năng tương tự khi Hoạt động chính gọi các Hoạt động khác và sau đó quay trở lại trò chơi.
  3. Khi người dùng nhấn nút thoát game phải thoát ra ở tất cả các

Đối với hai điểm đầu tiên tôi đã cố gắng này để chắc chắn rằng một và chỉ một Hoạt động chính được tạo ra và được gọi là: android:launchMode="singleTask" hay android:launchMode="singleTop" nhưng thật không may mắn các công trình đầu tiên cho vấn đề đầu tiên và thứ hai cho vấn đề thứ hai, không phải cho cả hai!

Tôi nghĩ vấn đề là: với singleTop hoạt động chính không thực sự ở trên cùng của ngăn xếp khi hoạt động thứ hai gọi nó (rõ ràng, tôi không hiểu tình huống mà tôi gọi là gì một hoạt động đã ở trên cùng của ngăn xếp!). Ngược lại, singleTask đảm bảo rằng Hoạt động là duy nhất trong ngăn xếp của nó, nhưng sau khi người dùng nhấp vào nút Trang chủ và quay lại Ứng dụng, Tác vụ khác được gọi, tôi có đúng không?

Dù sao, đây có phải là giải pháp thông minh hay tôi nên lưu trạng thái trò chơi của mình trong onStop/onPause và sau đó tiếp tục lại trong onResume? Đối với điểm thứ ba, tôi đã cố thêm android:noHistory="true" vào mọi Hoạt động, khi người dùng nhấp vào nút thoát Tôi gọi một Hoạt động mới không làm gì ngoài phương pháp finish() trên onCreate, Hoạt động này được gọi với intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_NEW_TASK); và launchMode là singleInstance, nhưng nó không hoạt động, nó chỉ trả về luôn trong Activity chính.

Trả lời

3

Bạn chắc chắn không muốn gây rối với launchMode. Đó không phải là cách để giải quyết vấn đề này và sẽ chỉ khiến bạn gặp nhiều vấn đề hơn.

Android có thể (và sẽ) giết quá trình của bạn bất cứ khi nào nó muốn (nhưng đặc biệt nếu ứng dụng của bạn ở chế độ nền). Do đó, bạn cần lưu trạng thái trò chơi của mình theo số onPause(), vì đó là cơ hội duy nhất bạn được bảo đảm .

Dù sao, nếu bạn lưu trò chơi trong onPause(), hành vi tiêu chuẩn sẽ bao gồm 2 điểm đầu tiên của bạn.

Đối với điểm thứ 3 của bạn, có một vài lựa chọn:

  1. Bạn có thể bắt đầu mọi hoạt động với startActivityForResult() xem câu trả lời của tôi here
  2. Khi bạn muốn "thoát", bạn có thể chỉ cần đi trở về của bạn hoạt động gốc (hoạt động bắt đầu ứng dụng của bạn) và cho biết rằng bạn muốn thoát.

Như thế này:

Intent intent = new Intent(this, MyRootActivity.class); // this is the starting activity for your application 
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); // tells Android to finish all other activities in the stack 
intent.addExtra("exit", "true"); // this tells your root activity that you want to exit 
startActivity(intent); 

Lúc này, trong MyRootActivity bạn muốn thêm mã này vào onCreate():

Intent intent = getIntent(); 
if (intent.hasExtra("exit")) { 
    // User wants to exit 
    finish(); 
} 
+0

Thank cho câu trả lời. Đối với hai điểm đầu tiên tôi đã giải quyết bằng cách sử dụng android: launchMode = "singleTask" và xóa android: noHistory = "true" (tôi nghĩ rằng đây là vấn đề thực sự). Việc lưu trạng thái trên onPause() có thể là một tùy chọn, nhưng làm cách nào tôi có thể lưu giao diện người dùng của Hoạt động? Về điểm thứ ba ... đây chính xác là giải pháp tôi đã sử dụng nhưng không hoạt động vì có Hoạt động chính trên Nhiệm vụ khác. Tôi giải quyết gọi kết thúc() trên hoạt động gốc, và sau đó kiểm tra trong onResume() của hoạt động chính nếu một lá cờ "thoát" được giải quyết, trong trường hợp này tôi gọi ngay lập tức kết thúc(). – mordicchio

+0

Bạn không cần sử dụng 'launchMode =" singleTask "'. Chế độ khởi chạy tiêu chuẩn sẽ làm những gì bạn muốn. Nếu không, thì bạn đang làm điều gì khác sai. Toàn bộ ứng dụng của bạn nên chạy trong một tác vụ, không phải trong nhiều tác vụ. Không có lý do gì cho điều đó. –

+1

Tôi đồng ý, nhưng nó không phải là lỗi của tôi, vấn đề là sự lựa chọn điên rồ của Google! Tôi muốn rằng Hoạt động chính luôn là một và chỉ một (và không được hủy diệt trừ khi các trường hợp hiếm có của bộ nhớ thấp) và hoạt động này không thể ở trên cùng của ngăn xếp. Vì vậy, launchMode cổ điển tạo ra nhiều trường hợp hoạt động của tôi, singleTop tiếp tục hoạt động chỉ khi nó ở trên đầu, nhưng tôi không hiểu làm thế nào nó có thể ở trên đầu nếu tôi gọi nó từ một hoạt động khác! – mordicchio

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