2012-01-18 39 views
17

Tôi có một menu chung trên ứng dụng của tôi với các biểu tượng. Nhấp vào biểu tượng sẽ bắt đầu Hoạt động. Có cách nào để biết liệu một hoạt động đã chạy và ngăn không cho nó bắt đầu nhiều lần (hoặc từ nhiều mục)? Tôi cũng có thể mang một hoạt động ở trạng thái onPause lên phía trước không?Ngăn chặn mở Hoạt động nhiều lần

+0

Tôi đã không làm phát triển Android trong một thời gian, nhưng tôi khá chắc chắn rằng Android sẽ đưa ra một ví dụ hiện tại của 'Hoạt động' của bạn thay vì bắt đầu một hoạt động mới. –

Trả lời

30

Sử dụng này:

intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); 

khi bắt đầu Activity.

từ documentation:

Nếu đặt trong Intent truyền cho Context.startActivity(), lá cờ này sẽ gây ra hoạt động đưa ra để được đưa đến trước mặt lịch sử đống nhiệm vụ của mình nếu nó đã được đang chạy.

14

Trong tuyên bố hoạt động của bạn trong tập tin Manifest, thêm thẻ android:launchMode="singleInstance"

+0

Từ tài liệu của startActivityForResult, nếu hoạt động bạn đang khởi chạy sử dụng chế độ khởi chạy singleTask, nó sẽ không chạy trong tác vụ của bạn và do đó bạn sẽ ngay lập tức nhận được kết quả hủy. –

+0

Tôi đã nhân các điểm vào và điều này rất phù hợp với tôi –

+0

trên thực tế, tôi không phải là fan lớn của "singleInstance" vì nó làm cho hoạt động chạy trong một cửa sổ riêng biệt như thể nó là một ứng dụng riêng biệt. trải nghiệm người dùng khi người dùng mở chế độ xem ứng dụng. –

0

tạo một thể hiện của hoạt động của bạn mà bạn không muốn bắt đầu nhiều lần như

Class ExampleA extends Activity { 
public static Activity classAinstance = null; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    classAinstance = this; 
} 

} 

Bây giờ có bao giờ u muốn crosscheck i có nghĩa là ngăn không cho nó bắt đầu nhiều lần, hãy kiểm tra như thế này

if(ExampleA.classAinstance == null) { 
     "Then only start your activity" 
} 
+1

Hãy coi chừng điều này sẽ ngăn không cho Hoạt động thu gom rác thải. Ngoài ra, điều này sẽ không giúp ích nếu Hoạt động được bắt đầu từ một số thành phần khác (ví dụ: một ứng dụng khác) không thể truy cập (hoặc thậm chí biết) tham chiếu Hoạt động tĩnh. – lxgr

0

Thêm này để định nghĩa Activity của bạn trong Androidmanifest.xml ...

android:launchMode = "singleInstance" 
0

Chỉ cần sử dụng

Intent i = new Intent(ActivityA.this, ActivityB.class); 
i.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); 
startActivity(i); 
-1

thêm

@Override 
protected void onDestroy() { 
    super.onDestroy(); 
    finish(); 
} 

hoặc

launchmode này đến singleTask/singlemode

hoặc

luôn mở hoạt động mới bằng cách xóa stack

+2

Vui lòng thêm một số giải thích cho câu trả lời của bạn. – ItamarG3

+0

** Từ hàng đợi đánh giá: ** Tôi có thể yêu cầu bạn thêm một số ngữ cảnh xung quanh câu trả lời của bạn hay không. Các câu trả lời chỉ có mã khó hiểu. Nó sẽ giúp người hỏi và người đọc trong tương lai cả khi bạn có thể thêm nhiều thông tin hơn trong bài đăng của mình. –

2

tôi đã nhận nó một cách hoàn hảo làm việc bằng cách làm như sau. Trong hoạt động gọi hoặc dịch vụ (thậm chí từ một ứng dụng khác)

Intent launchIntent = getPackageManager().getLaunchIntentForPackage(APP_PACKAGE_NAME); 

//the previous line can be replaced by the normal Intent that has the activity name Intent launchIntent = new Intent(ActivityA.this, ActivityB.class); 

     launchIntent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT|Intent.FLAG_ACTIVITY_NEW_TASK); 

startActivity(launchIntent); 

và trong biểu hiện của hoạt động nhận (tôi muốn ngăn chặn việc mở hai lần)

<activity android:name=".MainActivity" 
      android:launchMode="singleTask" 
      > 
Các vấn đề liên quan