2010-09-10 27 views
7

Tôi đã học Android và gặp phải vấn đề với launchMode = "singleTask". Tài liệu cho biết rằng khi thuộc tính này được sử dụng, Activity luôn được đưa vào một nhiệm vụ mới như là Activity gốc. Thứ hai, tài liệu nói rằng nếu Intent được nhắm vào một Activity như vậy khi có các hoạt động ở trên nó trong ngăn xếp nhiệm vụ của nó, các Intents đó bị loại bỏ (mặc dù nhiệm vụ vẫn được đưa vào nền trước).Android: Hành vi của launchMode = "singleTask" không như mô tả?

Tôi đã chơi xung quanh với điều này và hành vi tôi quan sát hoàn toàn khác. Cụ thể: - Các hoạt động với launchMode = "singleTask" không phải lúc nào cũng là Hoạt động gốc trong ngăn tác vụ. Chúng chỉ là một phần của chồng hiện tại với cùng một ái lực. - Khi Mục đích được nhắm mục tiêu tại Hoạt động như vậy và có các Hoạt động khác ở trên nó trong ngăn xếp, Mục đích không bị loại bỏ. Thay vào đó các hoạt động trên nó trong ngăn xếp sẽ bị loại bỏ. Intent sau đó được chuyển qua onNewIntent đến Activity như bình thường.

Ai đó có thể xác nhận rằng đây là hành vi thực tế? Nếu vậy, tại sao các tài liệu không chính xác? Nếu không thì tôi đã làm gì sai. . .

EDIT:

Một ví dụ chứng minh hành vi này có thể được tìm thấy ở đây: http://groups.google.co.uk/group/android-developers/browse_thread/thread/fd8f249803b4688a# Xin lỗi vì sự-cross bưu điện, tuy nhiên tôi đã không thể có được ví dụ trong một định dạng khá để trả lời ở đây ...

+0

tôi có thể xác nhận hành vi này, nhưng tôi cũng không hiểu nó. các hoạt động của trẻ bị phá hủy. –

Trả lời

0

Tôi có thể thêm một số trải nghiệm về hành vi kỳ lạ vào chế độ này. Có lẽ câu trả lời của câu hỏi này cũng giúp tôi.

Tôi muốn cung cấp cho màn hình đầu tiên của mình một tìm kiếm vị trí. Tôi muốn chuyển truy vấn trở lại Hoạt động đầu tiên của mình. Hoạt động đó là lời gọi tìm kiếm và truy vấn nhận được. Tuy nhiên, "singleTask" đã hủy các kế hoạch của tôi; (

Mục đích tìm kiếm với truy vấn không bao giờ đạt đến hoạt động đầu tiên của tôi. Thay vào đó, "android.intent.action.MAIN" đã đạt được hoạt động đầu tiên của tôi. ý định được thông qua. Nhưng sau đó tôi tạo ra một số trường hợp của màn hình chính của tôi.

<activity 
    android:label="@string/app_name" 
    android:name="ActivityStart" 
    android:screenOrientation="portrait" 
    android:launchMode="singleTask"> 
    <intent-filter> 
    <action 
     android:name="android.intent.action.SEARCH" /> 
    <action 
     android:name="android.intent.action.MAIN" /> 
    <category 
     android:name="android.intent.category.LAUNCHER" /> 

    </intent-filter> 
    <meta-data 
    android:name="android.app.searchable" 
    android:resource="@xml/searchable" /> 

</activity> 

Bây giờ tôi sử dụng một TextView thay vì ...

4

Đây là một vấn đề của taskAffinity. Khi bạn bắt đầu một hoạt động, Android kiểm tra taskAffinity hoạt động mà bạn muốn bắt đầu. Nếu nó giống với taskAffinity của t hoạt động gốc trong nhiệm vụ của bạn, sau đó nó sẽ bỏ qua launchMode="singleInstance" hoặc launchMode="singleTask" (vì các chế độ khởi chạy này sẽ yêu cầu Android tạo nhiệm vụ mới để khởi chạy hoạt động) và bắt đầu hoạt động trong tác vụ hiện tại.

Thật không may, điều này không được ghi lại đầy đủ, nhưng taskAffinity được ưu tiên hơn launchMode.

Nếu bạn thực sự muốn một hoạt động singleTask hoặc singleInstance (thường không phải là điều đúng để làm bởi vì nó mang đến một mớ hỗn độn những thứ khó chịu khác mà bạn có thể gặp sai), thì bạn cần đảm bảo rằng singleInstance hoặc singleTask của bạn hoạt động có điều sau đây trong manifest trong định nghĩa <activity> của nó:

android:taskAffinity="" 
2

Documentation nói:

FLAG_ACTIVITY_NEW_TASK ... tạo ra hành vi tương tự như "singleTask" launchMode ...

Làm thế nào hoạt động được bắt đầu với Intent (FLAG_ACTIVITY_NEW_TASK) depends on activity affinity

Nếu có đã là một nhiệm vụ hiện tại với các mối quan hệ cùng là hoạt động mới , hoạt động được khởi chạy vào nhiệm vụ đó. Nếu không, nó sẽ bắt đầu một nhiệm vụ mới .

Vì vậy, phải có kiểm tra mối quan hệ bình đẳng cho singleTask launchMode.

+0

Tôi không nghĩ rằng cả hai đều tạo ra hành vi "giống nhau". Giả sử các affinities là alright, singleTask cũng sẽ cố gắng xóa các hoạt động nhiệm vụ ngoại trừ một hoạt động gốc. – zgulser

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