Tôi có một ứng dụng, bắt đầu bằng SplashScreenActivity
. Sau đó, LoginActivity
được hiển thị hoặc nếu người dùng đã đăng nhập, một MainActivity
sẽ được hiển thị. Nếu ứng dụng đang chạy, SplashScreenActivity
được bác bỏ với những điều sau đâyAndroid: BackStack hành vi sai trái, nếu ứng dụng được bắt đầu từ một ứng dụng khác
//SplashScreenActivity
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//Adding this check for following cases
if (!isTaskRoot())
{
String intentAction = getIntent().getAction();
if (getIntent().hasCategory(Intent.CATEGORY_LAUNCHER) && intentAction != null && intentAction.equals(Intent.ACTION_MAIN)) {
finish();
return;
}
if(getIntent().getCategories().contains(GCMIntentService.INTENT_CATEGORY_GH_NOTIFICATION)){
finish();
return;
}
}
Vấn đề xảy ra
Nếu tôi khởi động ứng dụng từ một hoạt động như PlayStore, nó lại ở hoạt động đúng nếu đang chạy. Đây là Intent
Tôi đang sử dụng để tái tạo trong một ứng dụng thứ hai
//AnotherApplication.apk
Intent launchIntent = getPackageManager().getLaunchIntentForPackage("my.package.name");
startActivity(launchIntent);
Tuy nhiên, hành động này là bằng cách nào đó phá vỡ Backstack. Thay vì đóng ứng dụng trên backpress trong MainActivity
, nó khởi động lại ứng dụng.
//MainActivity.class
@Override
public void onBackPressed() {
if (getNavDrawerMain().isDrawerOpen()) {
getNavDrawerMain().closeDrawer();
} else {
closeApp();
}
}
protected void closeApp() {
if (doubleBackToExitPressedOnce) {
//super.onBackPressed(); //i tried both, but behaviour is the same
finish();
return;
}
this.doubleBackToExitPressedOnce = true;
new Handler().postDelayed(new Runnable() {
@Override
public void run()
doubleBackToExitPressedOnce = false;
}
}, 500);
}
tôi đã sử dụng breakpoint và phát hiện ra rằng MainActivity: onDestroy() được gọi, nhưng thay vì nối lại ứng dụng vào màn hình chính, nó luôn luôn khởi động lại và tôi không biết tại sao.
Tôi đã thử các cách sau: - Đã sử dụng các bản khởi chạy khác nhau như singleTask
và singleInstance
, nhưng nó không tạo ra bất kỳ sự khác biệt nào. onNewIntent
được gọi, nhưng nếu tôi gọi finish
, HomeActivity
khởi động lại - như commeted dưới đây, tôi đã cố gắng moveTaskToBack(true)
, nhưng Hoạt động được restaring quá (và chúng tôi thực sự muốn đóng ứng dụng thay vì di chuyển nó vào BackStack)
Theo kinh nghiệm của tôi, 'getLaunchIntentForPackage (...)' * không * trả về ý định của trình khởi chạy. Một ý định phóng sẽ nâng cao nhiệm vụ hiện có, nhưng các intent được trả về bởi 'getLaunchIntentForPackage (...)' sẽ thực sự bắt đầu một nhiệm vụ mới. Ứng dụng của bạn có thể không khởi động lại khi bạn thoát khỏi ứng dụng; bạn có thể chỉ cần nhìn thấy một bản sao của nó. –
@KevinKrumwiede: Intent có loại sau 'android.intent.action.MAIN', tôi vừa thêm một số mã bổ sung, cách tôi xử lý mục đích – longilong
Tôi không thể tìm thấy bất kỳ điều gì rõ ràng nói như vậy, nhưng tôi nghi ngờ rằng chỉ có hệ thống là được phép nhận 'ACTION_MAIN'. –