2010-03-14 28 views
35

Có thể định cấu hình ứng dụng android để nếu người dùng đã mở ứng dụng của bạn, khởi chạy nhiều hoạt động, sau đó quay lại màn hình chính và khởi chạy lại ứng dụng của bạn, thay vì chuyển sang hoạt động chính, họ sẽ được đưa đến hoạt động cao nhất trên stack (hoạt động gần đây nhất trong ứng dụng của bạn)?Làm thế nào để làm cho một ứng dụng Android trở lại hoạt động mở cuối cùng khi khởi động lại?

+0

giải pháp tốt hơn và sạch hơn: http://stackoverflow.com/ a) 10598619/5494342 – Mo12

+0

Để lưu nội dung, nhận xét trước đó có thể gây tranh cãi. Bạn cũng có thể nói câu trả lời trong liên kết đó là không phù hợp mặc dù có thể chấp nhận được, và đi kèm với đánh bắt rằng nó sẽ không hoạt động 100% thời gian. Xem nhận xét trong câu trả lời được chấp nhận của câu hỏi này trước khi bạn quyết định giải pháp nào phù hợp với tình huống của bạn. – Donamite

Trả lời

46

Khi được khởi chạy qua biểu tượng trên màn hình chính, Android sẽ luôn khởi động hoạt động với bộ lọc android.intent.action.MAIN trong AndroidManifest.xml, trừ khi ứng dụng đang chạy (trong trường hợp này rõ ràng sẽ khôi phục hoạt động ở trên cùng của ngăn xếp).

Để đạt được những gì bạn mô tả, bạn có thể lưu trữ hoạt động hiển thị cuối cùng trong SharedPreferences và có hoạt động Dispatcher bắt đầu hoạt động cuối cùng theo tùy chọn.

Vì vậy, trong mọi hoạt động bạn muốn tái khởi động:

@Override 
protected void onPause() { 
    super.onPause(); 

    SharedPreferences prefs = getSharedPreferences("X", MODE_PRIVATE); 
    Editor editor = prefs.edit(); 
    editor.putString("lastActivity", getClass().getName()); 
    editor.commit(); 
} 

Và một Dispatcher hoạt động tương tự như sau:

public class Dispatcher extends Activity { 

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

     Class<?> activityClass; 

     try { 
      SharedPreferences prefs = getSharedPreferences("X", MODE_PRIVATE); 
      activityClass = Class.forName(
       prefs.getString("lastActivity", Activity1.class.getName())); 
     } catch(ClassNotFoundException ex) { 
      activityClass = Activity1.class; 
     } 

     startActivity(new Intent(this, activityClass)); 
    } 
} 

chú

  • Bạn có thể tạo lớp cơ sở cho ghi đè
  • Các Dispatcher hoạt động rõ ràng là cần phải hành động android.intent.action.MAIN
+0

Cảm ơn bạn vì điều này. Tôi đã thấy câu trả lời khác mà bây giờ nói với tôi rằng những gì tôi đang tìm kiếm thực sự là hành vi mặc định và nó chỉ là một thực tế rằng tôi đã sử dụng eclipse (và chưa được cập nhật để 0.9.6 của plugin) đã gây ra vấn đề của tôi. Vì vậy, tôi sẽ nghĩ rằng tôi không phải kết hợp giải pháp của bạn. Đúng không? Hay có lý do nào khác mà tôi cần phải theo đuổi ý tưởng của bạn theo chương trình? – JohnRock

+2

@johnrock: Android tạo ngăn xếp được sử dụng để tìm hoạt động hiển thị cuối cùng * trong khi ứng dụng của bạn đang chạy *. Thật không may bạn không bao giờ biết khi nào ứng dụng của bạn bị giết vì vậy nếu bạn * luôn luôn * muốn khôi phục hoạt động cuối cùng (ngay cả dưới áp lực bộ nhớ, sau khi khởi động lại, v.v.) thì bạn cần một cái gì đó tương tự như những gì tôi đề xuất. Nếu bạn ổn với * phần lớn thời gian *, bạn không làm vậy. –

+0

Xin chào, chỉ muốn thêm rằng hành vi dự định không hoạt động vì nó được cho là không phải "hầu hết thời gian". Tôi đã mô tả vấn đề ở đây http://stackoverflow.com/questions/6903761/after-home-button-press-re-launching-app-shows-intial-activity-not-current/6903958#6903958 –

3

này hành vi mặc định và câu hỏi này đã được hỏi nhiều lần trước đây: Android: keep task's activity stack after restart from HOME
Android Run application from last Activity

Note rằng nếu bạn đang khởi chạy ứng dụng của bạn từ Eclipse, đó là những gì phá vỡ chức năng mặc định này. Thay đổi cấu hình khởi chạy của bạn để khởi chạy không có hoạt động nào cần khắc phục mọi thứ.

Tuy nhiên, khi hành vi này đã được cố định trong 0.9.6 release của các plugin ADT cho Eclipse trong vài tuần qua, bạn không còn cần điều đó workaround:

Applications phóng từ ADT tại cư xử như thể họ đã nhấp từ Màn hình chính.

+0

Đó chỉ là trường hợp * khi ứng dụng đang chạy *. Vì bạn không bao giờ có thể thực sự biết, tôi sẽ tự mình xử lý nó. Tôi đã chỉnh sửa câu trả lời của mình để làm rõ. –

4

Nó không phức tạp. Bạn chỉ cần thao tác tệp kê khai.

AndroidManifest.xm

<activity 
    android:name=".MainActivity" 
    android:alwaysRetainTaskState="true" 
    android:exported="true" 
    . 
    . 
    . 

đọc về 'android: xuất khẩu' & 'android: alwaysRetainTaskState' ở đây:

android:exported

android:alwaysRetainTaskState

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