2010-02-17 27 views
44

Tôi đang phải đối mặt với vấn đề chính xác đề cập trong những liên kết này:App luôn bắt đầu tươi từ hoạt động gốc thay vì khôi phục trạng thái nền (Known Bug)

http://code.google.com/p/android/issues/detail?id=2373

http://groups.google.com/group/android-developers/browse_thread/thread/77aedf6c7daea2ae/da073056831fd8f3?#da073056831fd8f3

http://groups.google.com/group/android-developers/browse_thread/thread/2d88391190be3303?tvc=2

tôi có hoạt động gốc đơn giản với ý định LAUNCHER và MAIN và không có gì khác. Tôi bắt đầu một hoạt động khác có không có cờ hoặc bất kỳ thứ gì thêm trong tệp kê khai nào.

Tôi khởi chạy ứng dụng (hoạt động gốc) và từ đó bắt đầu hoạt động thứ 2. Khi nhấn nút Home, tác vụ sẽ chuyển sang nền. Khi khởi chạy lại ứng dụng (từ Trình khởi chạy hoặc từ giữ nút Màn hình chính cho các ứng dụng gần đây), nó sẽ bắt đầu một phiên bản mới của hoạt động gốc trên đầu trang của chồng hiện có.

Nếu tôi nhấn nút quay lại, hoạt động "gốc" mới đóng và hoạt động thứ 2 cũ có thể nhìn thấy, nghĩa là khởi chạy hoạt động gốc trong cùng tác vụ thay vì đưa tác vụ lên nền trước.

Để chống lại điều này, tôi đã khởi chạy hoạt động gốc Chế độ singleTask. Bây giờ khi tôi nhấn và khởi động lại ứng dụng, nó sẽ xóa các hoạt động phía trên tác vụ gốc cũ và đưa tác vụ gốc cũ lên nền trước thay vì chỉ mang toàn bộ tác vụ cũ với hoạt động thứ 2 lên trên mặt trước. Lưu ý rằng nhiệm vụ gốc cũ vẫn giữ trạng thái ứng dụng của nó, có nghĩa nó không phải là một cá thể mới, nhưng các hoạt động cao hơn đã bị giết.

Nó thậm chí còn xảy ra trên các ứng dụng khác được tải xuống từ thị trường. Phương pháp cài đặt thủ công không có hiệu lực đối với tôi, nó vẫn khởi chạy theo cùng một cách.

+0

Kurian, tôi đã phải đối mặt với cùng một vấn đề. Có bất kỳ workaroun nào không? Cảm ơn trước. –

+1

Chỉ cần tiếp tục nhấn và thoát hoàn toàn ứng dụng sau khi triển khai nó từ Eclipse. Khởi động lại từ điện thoại. – Monstieur

+0

Có thể trùng lặp với [Vấn đề đặt hàng chồng hoạt động khi khởi chạy ứng dụng từ trình cài đặt ứng dụng Android và từ Màn hình chính] (http: // stackoverflow.com/questions/6356467/activity-stack-order-problem-khi-launch-application-from-android-app-inst) – blahdiblah

Trả lời

24

Điều này là do các ý định được sử dụng để khởi động ứng dụng khác. Eclipse bắt đầu một ứng dụng bằng cách sử dụng một mục đích không có hành động và không có danh mục nào. Trình khởi chạy khởi chạy ứng dụng bằng cách sử dụng mục đích với hành động android.intent.action.MAIN và danh mục android.intent.category.LAUNCHER. Trình cài đặt bắt đầu một ứng dụng với hành động android.intent.action.MAIN và không có danh mục nào.

Bất kỳ ai gửi lỗi nên có thể đã gọi nó là yêu cầu nâng cấp plugin Eclipse vì họ dường như muốn Eclipse có khả năng giả vờ làm trình khởi chạy và khởi động ứng dụng bằng cách sử dụng cùng ý định như trình khởi chạy.

+2

Tuy nhiên, sự cố vẫn tiếp diễn ngay cả khi khởi chạy ứng dụng từ điện thoại trực tiếp ... – Monstieur

+1

Có, Kurian là đúng - đây không chỉ là vấn đề về plugin của Eclipse. Điều tương tự cũng xảy ra trên thiết bị nâng cấp OTA. Đây là vấn đề Android lạ nhất mà tôi đã gặp phải. Không thể tin rằng nó vẫn là một vấn đề mới được tạo ra 1 năm trước !!! –

+1

Có vẻ như điều này đã được giải quyết cho đến nay. Hmmm ... tự hỏi những gì các folks ở đó thực sự làm gì? –

57
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    if ((getIntent().getFlags() & Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT) != 0) { 
     // Activity was brought to front and not created, 
     // Thus finishing this will get us to the last viewed activity 
     finish(); 
     return; 
    } 

    // Regular activity creation code... 
} 
+5

Điều này rất chậm chạp, không phải là giải pháp của bạn, mà là vấn đề bắt đầu. – JohnyTex

+0

Đây có phải là lỗi hoặc mục đích này không? - cách thiết lập Android này lên – Micro

+3

không hoạt động đối với tôi, vì vậy tôi đã thay đổi 'android: launchMode =" singleInstance "' thành 'android: launchMode =" singleTask "' và nó hoạt động :) –

5

Dưới đây là giải pháp:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    if ((getIntent().getFlags() & Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT) != 0 & getIntent().getExtras() == null) { 
     finish(); 
     return; 
    } 

Your code.... 
} 

EDIT: Tôi đã có vấn đề với ý đồ mới và thông báo. Các giải pháp trước đây không làm việc với các thông báo và ý định ...

0

giải pháp tương tự cho Xamarin.Android:

if (!IsTaskRoot) 
      { 
       string action = this.Intent.Action; 
       if (this.Intent.HasCategory(Intent.CategoryLauncher) && !string.IsNullOrEmpty(this.Intent.Action) && action == Intent.ActionMain) 
       { 
        Finish(); 
        return; 
       } 
      } 
+0

nơi để viết mã này? –

+0

@HimanshuDwivedi đây là một lỗi rất cũ, bạn không cần nữa – CDrosos

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