2010-06-30 21 views
23

Khi bắt đầu Hoạt động được đưa ra bởi một ý định và một cái gì đó được thực hiện với mục đích này.Làm cách nào để xóa Intent đã bắt đầu Hoạt động?

Khi tôi thay đổi hướng hoạt động của mình, nó được tải lại và Intent được chuyển đến Hoạt động.

Làm cách nào tôi có thể xóa ý định đó để ngăn Hoạt động sử dụng lại?

Tôi đã thử setIntent(null), nhưng không có kết quả.

+0

pixel sẽ không chấp nhận câu trả lời sai rõ ràng và chấp nhận @ dcg thay thế. Điều đó đã cứu tôi khoảng một giờ làm việc đi xuống con đường sai lầm. Xem bài viết của Dianne Hackborn về cách setIntent là một lời nói dối: https://groups.google.com/forum/#!msg/android-developers/vrLdM5mKeoY/ThkOonAbtloJ – JohnnyLambada

+0

Xem việc này có hữu ích không - stackoverflow.com/a/19820057/313042 – rajath

Trả lời

17

Tôi gặp sự cố tương tự. Điều này đã giúp tôi. Có thể bạn cũng phải sử dụng onSaveInstanceState (Bundle outState) và thêm dữ liệu bổ sung vào gói để inState không phải là null, không chắc chắn.

Intent activityIntent = null; // Subsequent times it's null 

@Override 
protected void onCreate(Bundle inState) { 
    super.onCreate(inState); 
    . 
    . 
    if (inState!=null) { 
     /*Recreating activity with a saved state*/ 
    } else { 
     /*Creating activity*/ 
     activityIntent = getIntent(); // First time through intent is used 
     /*Get your Extra Intent data here. You will be capturing data on 1st creation. */ 
} 
+0

Tôi có một cách tiếp cận tương tự bên dưới cũng cho phép bạn giữ lại các đối số chọn lọc từ mục đích ban đầu. – dell116

+1

Tính năng này không hoạt động đối với tôi khi mở từ danh sách ứng dụng gần đây sau khi thoát khỏi ứng dụng bằng cách sao lưu. Ứng dụng mở ra với một gói rỗng nhưng ý định trước đó. – CACuzcatlan

0

Đề xuất của tôi sẽ là chuyển đổi điều này bằng biến boolean để kiểm tra thời tiết hoạt động của bạn được tạo lần đầu tiên hay không.

Nếu không, bạn có thể xem phương pháp onCreate của mình, việc này chỉ được thực hiện khi hoạt động được tạo lần đầu tiên.

+1

Đã đồng ý. Sử dụng 'onRetainNonConfigurationInstance()' để chuyển trạng thái từ hoạt động cũ sang hoạt động mới. – CommonsWare

+3

Trên thực tế, onCreate() cũng sẽ được gọi bất kỳ lúc nào định hướng màn hình của bạn thay đổi (ứng dụng về cơ bản bị phá hủy và được tạo lại trong thời gian này). –

1

Nếu ý định của bạn sẽ được gửi đến hoạt động của bạn với một hành động (với setAction), chỉ cần thực hiện như sau khi bạn nhận được ý định, để tránh nhiều xử lý về ý định này khi màn hình xoay:

Intent i = getIntent(); 
i.setAction(null); 
setIntent(i); 
+0

Không hoạt động - được kiểm tra bằng api 25. –

8

Đừng sử dụng setIntent(null). Dường như đôi khi nó có thể hoạt động đôi khi, trong một số điều kiện, mục đích ban đầu có thể quay trở lại.

Thay vào đó, hãy gọi setIntent() với mục đích đơn giản không có hành động, dữ liệu hoặc tính năng bổ sung, chẳng hạn như new Intent(Context, Class).

Thật vậy, việc sử dụng setIntent() thực sự không phải là một quyết định thiết kế API tốt ngay từ đầu. Thay vào đó, như dcg đã lưu ý, hãy chắc chắn bạn chỉ kiểm tra ý định của mình lần đầu tiên, khi số savedInstanceState của bạn vẫn là giá trị rỗng.

+2

setIntent chỉ ở đó để gây nhầm lẫn cho bạn - không sử dụng nó. Xem câu trả lời của @ dcg để thay thế. Khi một Activity bị hủy, mục đích ban đầu khởi động Activity luôn được sử dụng lại bất kể bạn làm gì với setIntent. Mục đích ban đầu được giữ bên ngoài ứng dụng hoàn toàn, trong ActivityManager và setIntent không ảnh hưởng đến nó. Xem bài đăng của Dianne Hackborn: https://groups.google.com/forum/#!msg/android-developers/vrLdM5mKeoY/ThkOonAbtloJ – JohnnyLambada

+0

Cảm ơn bạn đã tham khảo bài đăng đó, @JohnnyLambada! Đã cập nhật câu trả lời để tránh những người gây hiểu nhầm. –

+0

Kiểm tra 'savedInstanceState == null' là BRILLIANT !!! Điều này đã giúp tôi phân biệt liệu tôi có đang khởi động MainActivity của tôi từ trình khởi chạy hay từ mục đích nhận được bằng cách mở tệp đính kèm email. +1 –

0

Trong trường hợp của tôi, tôi cần thiết để thiết lập dữ liệu để null:

getIntent().setData(null); 
2

Cũ bưu điện, nhưng một số người ta có thể sử dụng này.

Đừng lãng phí thời gian, nếu ứng dụng của bạn được tiếp tục, mục đích sẽ lại xuất hiện.

Sử dụng mục đích bắt đầu vào "Hoạt động Tiếp tục", và chỉ cần thêm một giá trị thêm

putExtra("DONE", 0) 

Và mỗi lần ứng dụng của bạn sơ yếu lý lịch, kiểm tra xem đã có giá trị này:

hasExtra("DONE") 

dễ dàng

+0

Nó không hoạt động. Tôi nghĩ rằng Android sẽ lưu 'Intent' theo một cách khác, không phải trong bộ nhớ. Bạn chỉ đang thêm giá trị này khi chạy. Khi hoạt động bị giết, hệ thống sẽ lấy lại 'Intent' ban đầu. –

0

intent.putExtra(YourKey,""); //reset the value to knknown setIntent(intent);

0

Ngay cả sau khi xóa thủ công Int ent và Intent extras sau khi chúng được phân tích cú pháp, có vẻ như Activity.getIntent() sẽ luôn trả về Intent ban đầu đã bắt đầu Activity.

Để làm được việc này, tôi khuyên bạn nên một cái gì đó như thế này:

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    // The Intent provided by getIntent() (and its extras) will persist through a restore 
    // via savedInstance. Because of this, restoring this activity from a 
    // an instance that was originally started with extras (deep-link or 
    // pre-defined destination) may cause un-desired behavior 
    // (ie...infinite loop of sending the user directly to somewhere else because of a 
    // pre-defined alternate destination in the Intent's extras). 
    // 
    // To get around this, if restoring from savedInstanceState, we explicitly 
    // set a new Intent *** to override the original Intent that started the activity.*** 
    // Note...it is still possible to re-use the original Intent values...simply 
    // set them in the savedInstanceState Bundle in onSavedInstanceState. 
    if (savedInstanceState != null) { 
     // Place savedInstanceState Bundle as the Intent "extras" 
     setIntent(new Intent().putExtras(savedInstanceState)); 
    } 

    processIntent(getIntent()) 
} 

private void processIntent(Intent intent) { 
    if (getIntent().getExtras() == null) { 
     // Protection condition 
     return; 
    } 

    doSomething(intent.getExtras.getString("SOMETHING_I_REALLY_NEED_TO_PERSIST")); 

    final String somethingIDontWantToPersist = 
     intent.getExtras.getString("SOMETHING_I_DONT_WANT_TO_PERSIST"); 

    if(somethingIDontWantToPersist != null) { 
     doSomething(somethingIDontWantToPersist); 
    } 
} 

@Override 
public void onSaveInstanceState(Bundle savedInstanceState) { 
    // Save selective extras from original Intent... 
    savedInstanceState.putString("SOMETHING_I_REALLY_NEED_TO_PERSIST", "persistedValued"); 
    super.onSaveInstanceState(savedInstanceState); 
} 

Bằng cách này, có một cơ chế để đổ tiếp cận mục đích ban đầu trong khi vẫn duy trì khả năng giữ lại một cách rõ ràng một số phần của tiếp cận mục đích ban đầu/Ý định tính năng bổ sung.

Lưu ý rằng tôi chưa thử nghiệm tất cả chế độ Khởi chạy hoạt động.

0

Nếu bạn đặt các hành động ý định, bạn có thể xóa nó với getIntent().setAction("");

Ví dụ trong onCreate(...):

... 
String action = getIntent().getAction(); 
if (action != null) { 
    if (action.equals(YOUR_ACTION_WHATEVER)) { 
    doSomethingHere(); // do something here 
    getIntent().setAction(""); // clear the action 
    } 
} 
... 

này sẽ xóa các hành động, nếu không nó sẽ được gọi mỗi khi bạn xoay điện thoại .

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