2012-01-06 27 views
7

Tôi đang viết một ứng dụng có hai "chế độ"; một chế độ xem và một chế độ chỉnh sửa. Ứng dụng này cho thấy hai chính/launcher hoạt động (nói, MộtD) mà lần lượt có chuỗi hoạt động của mình (B, CE, F tương ứng). Các hoạt động điểm hai entry MộtD sẽ phơi bày hai biểu tượng với các nhãn riêng biệt trong màn hình chính và hai chuỗi không bao giờ được vượt qua, tức là khi bạn khởi động ứng dụng trong một chế độ xem với hoạt động Một, con đường duy nhất bạn có thể đi bộ qua lại là Một, B, C và nếu bạn khởi động ứng dụng trong chế độ chỉnh sửa với các hoạt động D, chỉ có chuỗi hoạt động có sẵn là D, E, F .Làm cách nào để xóa ngăn xếp lịch sử hoạt động khi nhấn nút home?

Bây giờ, vấn đề của tôi là nếu bắt đầu ứng dụng, ví dụ: Chế độ xem (chuỗi hoạt động A, B, C) và nhấn nút Trang chủ từ bất kỳ hoạt động nào trong chuỗi đó Tôi quay lại màn hình chính (dĩ nhiên) nhưng nếu tôi khởi động lại ứng dụng trong chỉnh sửa mode (chuỗi hoạt động D, E, F) Tôi thực hiện hoạt động khi nhấn nút Home (nghĩa là hoạt động trong chuỗi sai) - không phải điểm vào dự kiến ​​cho chế độ chỉnh sửa; hoạt động D.

Làm cách nào để giải quyết vấn đề này?

Tôi đã thử các kết hợp khác nhau của android:noHistory, android:clearTaskOnLaunch và các thuộc tính khác trong AndroidManifest.xml cho các hoạt động liên quan. Nhưng chúng dường như chỉ ảnh hưởng đến hoạt động rất, chứ không phải toàn bộ chuỗi.

Tôi muốn loại bỏ toàn bộ chuỗi hoạt động (Một, B, C hoặc D, E, F) từ lịch sử stack khi nút Home được nhấn nhưng vẫn giữ nguyên ngăn xếp trong khi tôi vẫn còn trong chuỗi (Tôi muốn có thể nhấn nút quay lại từ, hoạt động B và đến hoạt động A).

+1

Bạn nên chú ý đến http://stackoverflow.com/questions/3473168/clear-the-entire-history-stack-and-start-a-new-activity-on-android – himanshu

+1

@dbm: ru tìm kiếm fr http://nisha113a5.blogspot.com/ ?? quay lại –

+0

Xin chào @himanshu! Vâng, câu hỏi đó có lẽ cũng đã dẫn tôi đến một kết luận làm việc. Cảm ơn vì tiền hỗ trợ! – dbm

Trả lời

4

Có vẻ như bạn cần sử dụng cờ Intent.FLAG_ACTIVITY_CLEAR_TOP cho hoạt động tại nhà của mình, nhưng tất nhiên bạn không thể thêm những cờ này trong tệp AndroidManifest.xml. Có lẽ bạn nên có một điểm vào mà sau đó khởi chạy chính xác Activity - bạn có thể sử dụng một activity-alias để làm cho nó trông giống như hai điểm nhập cảnh cho người dùng.

Ví dụ - bạn xác định các hoạt động trong file manifest của bạn:

<activity-alias 
     android:label="@string/edit_app_name" 
     android:name="launch_edit" 
     android:targetActivity=".activities.LaunchActivity"> 
     <meta-data android:name="launch_type" android:resource="@string/launch_edit" /> 
    </activity-alias> 
    <activity-alias 
     android:label="@string/view_app_name" 
     android:name="launch_view" 
     android:targetActivity=".activities.LaunchActivity"> 
     <meta-data android:name="launch_type" android:resource="@string/launch_view" /> 
    </activity-alias> 

Sau đó, trong LaunchActivity của bạn, bạn có:

ActivityInfo activityInfo = getPackageManager().getPackageInfo(this.getComponentName(), PackageManager.GET_ACTIVITIES|PackageManager.GET_META_DATA); 
int launchTypeResource = activityInfo.metaData.getInt("launch_type"); 
String launchType = context.getString(launchTypeResource); 
if(launchType == null) { 
    // handle error 
    throw new Exception(); 
} 
Intent newIntent; 
if(launchType.equals(context.getString(R.string.launch_view)) { 
    newIntent = createIntent(ViewActivity.class); 
} else if(launchType.equals(context.getString(R.string.launch_edit)) { 
    newIntent = createIntent(EditActivity.class); 
} 
newIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
startActivity(newIntent); 
+0

Hi @Martin! Tôi đã cho tôi quyền tự do sửa đổi một chút đoạn mã của bạn về cách thực sự tìm nạp siêu dữ liệu được liên kết với 'activity-alias'. Hóa ra nó không được gửi thông qua lời gọi 'Intent' mà được đọc từ cấu trúc dữ liệu' ActivityInfo'. – dbm

+1

Câu trả lời hay! Lấy số tiền của nỗ lực bạn đưa vào nó và thực tế là câu trả lời của bạn là lần đầu tiên (đúng và làm việc-ish, chỉ cần cấp cho bạn một dấu kiểm màu xanh lá cây :-) – dbm

+0

@Martyn bạn có thể chỉnh sửa câu trả lời của bạn để có đọc đúng dữ liệu? –

3

Vui lòng sử dụng phương pháp sau đây trên báo chí của nút home:

Intent intent=new Intent(this, HomeClass.class); 
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
startActivity(intent); 
+0

Tôi cho rằng đây thực sự là cách dễ nhất để khắc phục sự cố của tôi. Tuy nhiên, tôi sẽ sử dụng một triển khai khác làm cho giải pháp này không phù hợp với ứng dụng của tôi lần này. Tôi đã làm, tuy nhiên, tìm hiểu một cái gì đó bằng câu trả lời của bạn và cho rằng tôi cảm ơn bạn. – dbm

1

Bạn có thể xem xét chỉ sử dụng một Activity cho mỗi chuỗi (sẽ chỉ là AD).

Sau đó, thực hiện các nội dung của Một, BCD, EF như mảnh vỡ và chỉ cần thay đổi Fragment hiển thị trên Activity khi điều hướng qua lại.

Kết hợp điều này với android:noHistory và bạn sẽ nhận được hiệu ứng mong muốn - mặc dù nó sẽ yêu cầu viết lại và bạn bao gồm gói tương thích vào dự án của mình nếu bạn định nhắm mục tiêu phiên bản bên dưới Honeycomb.

+0

Điều này thực sự là một cách sử dụng rất tinh tế của các mảnh vỡ và vì ứng dụng của tôi đã được tạo nên bởi các mảnh vỡ, nó thậm chí sẽ không được viết lại lớn như vậy. Mặc dù tôi nghĩ rằng đó là điều công bằng để làm để chấp nhận câu trả lời của @Martyn, tôi nghĩ rằng đây là sự lựa chọn kiến ​​trúc mà tôi sẽ đi với cuối cùng. Cảm ơn ý tưởng tuyệt vời! – dbm

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