2012-06-19 22 views
32

Tôi có hai ứng dụng App-B khởi chạy Ứng dụng A. Nếu người dùng khởi động ứng dụng B từ bên trong ứng dụng A tôi gọi kết thúc trên App-A vì vậy tôi không có vấn đề gì.Phương án thay thế cho Intent.FLAG_ACTIVITY_CLEAR_TASK

Nếu người dùng đi thẳng đến ứng dụng B từ ngăn kéo Ứng dụng hoặc nhấn nút Home dài thì tôi thực hiện bên dưới sẽ xóa nhiệm vụ trong Ứng dụng A trước khi áp dụng tất cả các tính năng bổ sung. Điều này có ảnh hưởng mong muốn nhưng chỉ hoạt động trên API 11. Trên các API thấp hơn, nhiệm vụ mới trong APP-A sẽ không thay đổi và phần bổ sung putExtra sẽ không có hiệu lực. Mọi phương án thay thế cho FLAG_ACTIVITY_CLEAR_TASK? cho API < = 10?

 Intent i = new Intent("com.App-A"); 
    i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); 

Cảm ơn

Jason

+2

FLAG_ACTIVITY_CLEAR_TOP – pawelzieba

+0

Không xóa ngăn xếp nếu nó đã tồn tại ..... –

+0

Bạn có thực sự có nghĩa là 2 ứng dụng khác nhau không? hoặc bạn đang nói về 2 Hoạt động trong cùng một ứng dụng? Đăng các phần có liên quan của tệp kê khai của bạn và chúng tôi có thể giúp bạn nhiều hơn. –

Trả lời

0

tôi vẫn đang gặp rất nhiều rắc rối tìm hiểu vấn đề nhưng muốn giúp bạn sửa chữa nó. Vì nhận xét chỉ cho phép 600 ký tự và không định dạng tốt, tôi sẽ tạo câu trả lời thay vì vì tôi chắc chắn rằng chúng ta có thể giải quyết vấn đề này.

Tôi muốn có thể tái tạo sự cố của bạn. Để làm điều đó tôi đã tạo 2 ứng dụng: AppAAppB. AppA có một hoạt động được gọi là ActivityA và AppB có một hoạt động được gọi là ActivityB. Cả hai số ActivityAActivityB sử dụng android:launchMode="singleTask".

ActivityA có một nút trên đó mà ra mắt AppB và kết thúc, như thế này:

Intent intent = new Intent("de.sharpmind.example.AppB"); 
    intent.putExtra("extra", "launched from AppA"); 
    startActivity(intent); 
    finish(); 

ActivityB có một nút trên đó mà ra mắt AppA như thế này:

Intent intent = new Intent("de.sharpmind.example.AppA"); 
    intent.putExtra("extra", "launched from AppB"); 
    startActivity(intent); 

này tất cả các công trình như tôi mong đợi nó. AppA và AppB chạy trong các tác vụ khác nhau. Các "phụ" được nhìn thấy đúng trong các phương pháp onCreate() của mỗi ứng dụng.

Vì vậy, bạn có thể vui lòng cho tôi biết thêm về sự cố của bạn không. Làm thế nào tôi có thể tái tạo chính xác vấn đề của bạn? Bạn đã viết:

Trên API thấp hơn nhiệm vụ mới trong APP-A sẽ không thay đổi và phần bổ sung putExtra sẽ không có hiệu lực.

Ý bạn là gì? Bạn đang đặt các phần bổ sung ở đâu và bạn nhận được chúng ở đâu và bạn mong đợi điều gì sẽ xảy ra?

Ngoài ra, launchMode trong số AppB của bạn là gì?

Ngoài ra, khi bạn gặp sự cố này, có các hoạt động khác trong ngăn tác vụ cho AppA không?

Vui lòng cung cấp thêm thông tin, trong câu hỏi ban đầu của bạn hoặc tại đây dưới dạng nhận xét.

0

Sử dụng FLAG_ACTIVITY_CLEAR_TASK xóa ngăn xếp lại. Nếu tôi hiểu chính xác, đây là hành vi bạn muốn.

Sử dụng singleInstance thay vì singleTask trong tệp kê khai của bạn sẽ thực hiện việc này.

Trong các nhận xét bạn đã nói rằng nó phải là singleTask. Tôi giả định điều này là bởi vì bạn cần ngăn xếp trở lại trong một số trường hợp nhất định.

Vì không thể thay đổi chương trình launchMode lập trình và FLAG_ACTIVITY_CLEAR_TASK không khả dụng cho API < = 10, bạn có thể phải tạo hai hoạt động giống nhau.

Một với launchMode=singleTask và một với launchMode=singleInstance.

Thêm phần này vào một sử dụng singleInstance để có được một chồng rõ ràng khi phóng từ ngăn kéo ứng dụng:

<category android:name="android.intent.category.LAUNCHER" /> 
1

Tôi có thể sai trong việc tìm hiểu những gì bạn đang yêu cầu, nhưng nó rằng khi bạn khởi động B, bạn muốn A bị giết?

Trong A, thêm video này vào thẻ hoạt động trong biểu hiện:

android:noHistory=true 

Điều này sẽ khiến hoạt động này phải được loại bỏ khỏi bộ nhớ ngay sau khi nó mất tập trung.

2

này sẽ làm việc một cách chính xác

i.addFlag(Intent.FLAG_ACTIVITY_NO_HISTORY | 
       Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); 
+0

Điều này không hoạt động trên API 10. – Mahm00d

13

mới IntentCompat nên đã giúp trên đó, nhưng dường như cờ bị bỏ qua cho API thấp hơn 11.

Để sử dụng IntentCompat làm như sau:

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | 
IntentCompat.FLAG_ACTIVITY_CLEAR_TASK); 
+0

Mong muốn điều đó là đúng, nhưng: "Cờ này sẽ chỉ được tuân thủ trên các thiết bị hỗ trợ API 11 trở lên". [Từ tài liệu] (http://developer.android.com/reference/android/support/v4/content/IntentCompat.html#FLAG_ACTIVITY_CLEAR_TASK) – kabuko

+1

@kabuko Tôi đã hoàn toàn bỏ qua điều đó. Nhưng sau đó GÌ ĐIỂM! Tôi đoán chúng ta sẽ tự do làm nếu (api> x) nhưng vẫn không hữu ích lắm. – Warpzit

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