Tôi muốn biết liệu người dùng có quay lại màn hình chính nếu anh ta thoát khỏi hoạt động hiện tại.
Tôi muốn biết liệu người dùng có quay lại màn hình chính nếu anh ta thoát khỏi hoạt động hiện tại.
Câu trả lời:
CẬP NHẬT (tháng 7 năm 2015):
Kể từ getRunningTasks () được phản đối, từ API 21 nó tốt hơn để làm theo raukodraug câu trả lời hay Ed Burnette một (Tôi muốn một giây).
Có khả năng kiểm tra các tác vụ hiện tại và ngăn xếp của chúng bằng ActivityManager .
Vì vậy, để xác định xem một hoạt động có phải là hoạt động cuối cùng hay không:
Sử dụng mã sau:
ActivityManager mngr = (ActivityManager) getSystemService( ACTIVITY_SERVICE );
List<ActivityManager.RunningTaskInfo> taskList = mngr.getRunningTasks(10);
if(taskList.get(0).numActivities == 1 &&
taskList.get(0).topActivity.getClassName().equals(this.getClass().getName())) {
Log.i(TAG, "This is last activity in the stack");
}
Xin lưu ý rằng mã trên sẽ chỉ có hiệu lực nếu Bạn có một nhiệm vụ. Nếu có khả năng số lượng tác vụ sẽ tồn tại cho ứng dụng của Bạn - Bạn sẽ cần kiểm tra các phần tử taskList khác. Đọc thêm về nhiệm vụ Nhiệm vụ và Ngăn xếp lùi
isTaskRoot()
phương pháp.
Tôi sẽ đăng nhận xét của @ H9kDroid như là câu trả lời tốt nhất ở đây cho những người có câu hỏi tương tự.
Bạn có thể sử dụng isTaskRoot () để biết hoạt động có phải là gốc của một tác vụ hay không.
Tôi hi vọng cái này giúp được
if (isTaskRoot()) { // do something }
Hy vọng điều này sẽ giúp ích cho người mới bắt đầu, Dựa trên các câu trả lời ở trên phù hợp với tôi, tôi cũng đang chia sẻ đoạn mã nên nó sẽ dễ dàng thực hiện.
giải pháp: tôi đã sử dụng câu isTaskRoot()
trả về true nếu hoạt động hiện tại chỉ là hoạt động trong ngăn xếp của bạn và khác với tôi cũng xử lý trường hợp nếu tôi có một số hoạt động trong ngăn xếp, hãy chuyển đến hoạt động cuối cùng trong ngăn xếp thay vì mở hoạt động tùy chỉnh mới .
Trong hoạt động của bạn
@Override
public void onBackPressed() {
if(isTaskRoot()){
startActivity(new Intent(currentActivityName.this,ActivityNameYouWantToOpen.class));
// using finish() is optional, use it if you do not want to keep currentActivity in stack
finish();
}else{
super.onBackPressed();
}
}
có một giải pháp dễ dàng nhất cho vấn đề này, bạn có thể sử dụng isTaskRoot () trong hoạt động của mình
Mặc dù có thể có một cách để đạt được điều này (xem các câu trả lời khác), tôi khuyên bạn không nên làm điều đó. Các ứng dụng Android thông thường không cần biết Màn hình chính có hiển thị hay không.
Nếu bạn đang cố gắng lưu dữ liệu, hãy đặt mã lưu dữ liệu vào phương thức onPause () của bạn. Nếu bạn đang cố gắng cung cấp cho người dùng cách thay đổi ý định của họ về ứng dụng hiện có, bạn có thể chặn phím lên / xuống cho phím Quay lại và phương thức onBackPressed () và trình bày cho họ câu "Bạn có chắc không?" lời nhắc.
Một cách để theo dõi điều này là bao gồm một điểm đánh dấu khi bạn bắt đầu một hoạt động mới và kiểm tra xem điểm đánh dấu có tồn tại hay không.
Bất cứ khi nào bạn bắt đầu một hoạt động mới, hãy chèn điểm đánh dấu:
newIntent=new Intent(this, NextOne.class);
newIntent.putExtra(this.getPackageName()+"myself", 0);
startActivity(newIntent);
Và sau đó bạn có thể kiểm tra nó như sau:
boolean islast=!getIntent().hasExtra(this.getPackageName()+"myself")
Vấn đề với giải pháp của sandrstar khi sử dụng ActivityManager
là: bạn cần có quyền để thực hiện các nhiệm vụ theo cách này. Tôi đã tìm thấy một cách tốt hơn:
getIntent().hasCategory(Intent.CATEGORY_LAUNCHER)
Ở Activity
phía dưới cùng của Ngăn xếp sẽ luôn nhận được danh mục này theo mặc định trong khi các Hoạt động khác sẽ không nhận được danh mục này.
Nhưng ngay cả khi điều này không thành công trên một số thiết bị, bạn có thể đặt nó trong khi khởi động Activity
:
Intent intent = new Intent(startingActivity, SomeActivityClass.class);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
activity.startActivity(intent);
Tôi đã tạo một lớp cơ sở cho tất cả các hoạt động của mình, mở rộng AppCompatActivity và có một bộ đếm tĩnh:
public abstract class BasicActivity extends AppCompatActivity {
private static int activityCounter = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
++activityCounter;
...
}
@Override
public void onDestroy() {
super.onDestroy();
--activityCounter;
if(activityCounter==0) {
// Last instance code...
}
}
public boolean isLastInstance() { return (activityCounter==1); }
}
Điều này đã hoạt động đủ tốt, cho đến nay; và bất kể phiên bản API nào. Tất nhiên, nó yêu cầu tất cả các hoạt động mở rộng lớp cơ sở này - điều mà chúng làm, trong trường hợp của tôi.
Chỉnh sửa: Tôi đã nhận thấy một trường hợp khi bộ đếm giảm xuống 0 trước khi ứng dụng hoàn toàn thoát, đó là khi hướng được thay đổi và chỉ một hoạt động được mở. Khi hướng thay đổi, hoạt động được đóng lại và một hoạt động khác được tạo ra, như vậy onDestroyed
được gọi cho hoạt động cuối cùng và sau đó onCreate
được gọi khi hoạt động tương tự được tạo với hướng đã thay đổi. Hành vi này phải được tính đến; Có thể sử dụng OrientationEventListener .
Android triển khai ngăn xếp Hoạt động, tôi khuyên bạn nên đọc về nó ở đây . Dường như tất cả các bạn muốn làm dù là lấy hoạt động gọi điện thoại: getCallingActivity()
. Nếu hoạt động hiện tại là hoạt động đầu tiên trong ứng dụng của bạn và ứng dụng được khởi chạy từ màn hình chính thì (tôi cho là) sẽ quay trở lại null
.
Một điều bị bỏ lỡ ở đây, đó là lần nhấp "Phím Trang chủ", khi được kích hoạt, bạn không thể phát hiện điều này từ hoạt động của mình, vì vậy tốt hơn nên kiểm soát ngăn xếp hoạt động theo chương trình bằng cách xử lý nhấn "Phím Quay lại" và di chuyển đến hoạt động cần thiết hoặc chỉ làm các bước cần thiết.
Ngoài ra, bạn không thể chắc chắn rằng việc bắt đầu hoạt động của bạn từ danh sách "Hoạt động gần đây" có thể được phát hiện bằng cách đặt trước một số dữ liệu bổ sung cho mục đích mở hoạt động, vì nó được sử dụng lại trong trường hợp đó.