2013-07-25 68 views
9

我希望我的Android應用程序的用戶在他們按下某個活動時離開我的應用程序。這可以做到嗎?使用後退按鈕離開Android應用程序

+0

將共享的pref中的活動狀態保存爲 – KOTIOS

+0

如果你描述你的活動流程,它會更好 – stinepike

+0

你的意思是你想徹底退出應用程序,而不是回到寶貴的活動? –

回答

6

你可以嘗試這樣的事情(顯示一個對話框,確認退出):

 @Override 
     public void onBackPressed() { 
        new AlertDialog.Builder(this).setIcon(android.R.drawable.ic_dialog_alert).setTitle("Exit") 
          .setMessage("Are you sure you want to exit?") 
          .setPositiveButton("Yes", new DialogInterface.OnClickListener() { 
           @Override 
           public void onClick(DialogInterface dialog, int which) { 
            finish(); 
            System.exit(0); 
           } 
          }).setNegativeButton("No", null).show(); 
       } 

必須注意,因爲它是在評論低於退出應用程序與提到的是System.exit不建議。如果您的應用程序的活動收到意圖完成,則更正確的方式可能是廣播意圖。

+0

這不會簡單地將他返回到前一個活動,如後退按鈕嗎? http://developer.android.com/reference/android/app/Activity.html#finish() –

+0

剛剛編輯我的回答 –

+4

使用System.exit(0);除非你知道你爲什麼必須...... –

0

您可以通過覆蓋後退按鈕來實現任何功能。

@Override 
public boolean onKeyDown(int keyCode, KeyEvent event) { 
    if (keyCode == KeyEvent.KEYCODE_BACK) { 
     // Do whatever you want with your activity 
     // And for closing the whole app, you can use System.exit() which is absolutely not recomended 
     return true; 
    } 
    return super.onKeyDown(keyCode, event); 
} 
+1

我不認爲它回答OP的關於如何離開應用程序的問題。 – alex

+0

爲什麼不使用onBackPressed()? –

7

的一個好方法是等待第二回

private boolean    _doubleBackToExitPressedOnce = false; 

@Override 
public void onBackPressed() { 

    Log.i(TAG, "onBackPressed--"); 
    if (_doubleBackToExitPressedOnce) { 
     super.onBackPressed(); 
     return; 
    } 
    this._doubleBackToExitPressedOnce = true; 
    Toast.makeText(this, "Press again to quit", Toast.LENGTH_SHORT).show(); 
    new Handler().postDelayed(new Runnable() { 
     @Override 
     public void run() { 

      _doubleBackToExitPressedOnce = false; 
     } 
    }, 2000); 
} 
+1

這是一種可怕的方式,因爲它完全打破了用戶體驗。雖然它比按下Back鍵彈出對話框稍微可怕。 – ge0rg

+2

它被用於衆所周知的應用程序和喜歡它的人,它比彈出(yes/no)的綁定少很多,並給用戶一個簡單的選擇 –

+1

是的,不幸的是。 Android上的很多應用程序都破壞了用戶體驗,但沒有理由鼓勵人們繼續這樣做。關於選擇 - 用戶在推回時已經選擇離開當前活動。沒有必要混淆它們。 – ge0rg

2

您可以覆蓋在活動onBackPressed(),做任何你想讓它。下面是退出時被壓回的應用程序的代碼:

@Override 
public void onBackPressed(){ 
    Intent intent = new Intent(Intent.ACTION_MAIN); 
    intent.addCategory(Intent.CATEGORY_HOME); 
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    startActivity(intent); 
} 
+0

使用System.exit(0);在onbackpressed – ashokk

6

你可以試試這個

public void onBackPressed() { 
    moveTaskToBack(true); 
} 
2

看來你要問會打破後退按鈕和預期的目的是什麼應用程序的流程。用戶期望按下後退按鈕將其返回到前一個活動屏幕。

如果您想用後退按鈕終止整個應用程序,則每次使用startActivity()時都要調用finish()。這會在您離開時關閉當前活動,如果用戶按下後退按鈕,他們將離開您的應用程序。

+0

有時您不想返回到上一個活動屏幕,如從主屏幕返回到登錄屏幕或返回到啓動屏幕。 –

5

把它放在你的清單中每一項活動:

<activity android:name=".MyActivity" 
      android:noHistory="true"> 
</activity> 

開返回按從Activity

@Override 
protected void onBackPressed() { 
    if (this.isFinishing()){ 
     finish(); 
     super.onBackPressed(); 
    } 
} 
2

而不是覆蓋的後退按鈕行爲考慮使用FLAG_ACTIVITY_CLEAR_TOP意圖標誌來控制你的應用程序的活動堆棧。

如果已設置,並且正在啓動的活動已在當前任務中運行,則不是啓動該活動的新實例,而是關閉其上的所有其他活動,此Intent將爲作爲新的Intent提供給(現在處於頂端的)舊活動。

例如,考慮由以下活動組成的任務:A,B,C,D。如果D調用startActivity()並解析爲活動B的組件,則C和D將完成,B接收給定的Intent,導致堆棧現在爲:A,B。

使用上面的示例。這將實現這樣的事情: 從活動d:

Intent intent = new Intent(context, B.class); 
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
startActivity(intent); 
1

我用這個方法來離開返回按一個應用程序:

@Override 
public void onBackPressed() { 
enter code here 
    finish(); 
} 
+0

這不關閉應用程序。只是目前的活動 –

2

首先,它是完全不可思議,你想關閉你的應用程序,因爲通常情況下,如果用戶離開你的應用程序,android會處理剩下的應用程序,並根據設備的內存狀態決定是關閉還是保持暫停狀態,並且它完成了一項完美的工作,這意味着你不應該擔心關於它。

但是,如果你想關閉你的應用程序,萬一只有一個活動正在運行(在你的情況下按下按鈕時),關閉該活動將關閉整個應用程序。我的意思是,如果您使用意圖傳輸到當前活動並且沒有關閉之前的活動,那麼使用this.finish()只會關閉當前活動並讓您回到上一次暫停的活動,否則它會關閉整個應用程序。 考慮一個事實,即活動可能使用碎片,碎片可能沒有佈局。那麼它似乎應用程序在它仍在運行時關閉。

但是如何使用硬件返回鍵來完成你的工作?你需要這樣做

@Override 
public void onBackPressed() 
{ 
    if(/* check a condition to make sure you are in that certain activity */) 
    { 
     Process.killProcess(Process.myPid()); 
    } 
    else 
    { 
     super.onBackPressed(); 
    } 
} 

好運

2

我知道這是一個老帖子。但是,這對於那些想要在其應用程序中實現相同功能的人可能會有所幫助。

可以通過計算兩次後壓之間的時間來完成識別雙擊的解決方案。如果差值小於2秒(即2000毫秒),那麼你可以接受雙擊返回並退出應用程序。否則,顯示Toast消息。

簡單實現,這將是:

private static long back_pressed; 

@Override 
public void onBackPressed() 
{ 
     if (back_pressed + 2000 > System.currentTimeMillis()) 
      super.onBackPressed(); 
     else 
      Toast.makeText(getBaseContext(), "Press once again to exit!",Toast.LENGTH_SHORT).show(); 

     back_pressed = System.currentTimeMillis(); 
} 

的代碼可以在此link

0
@Override 
    public void onBackPressed(){ 
     new AlertDialog.Builder(this).setIcon(android.R.drawable.ic_dialog_alert).setTitle("Exit") 
     .setMessage("Are you sure you want to exit?") 
     .setPositiveButton("Yes", new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialog, int which) { 
       Intent intent = new Intent(Intent.ACTION_MAIN); 
        intent.addCategory(Intent.CATEGORY_HOME); 
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
        startActivity(intent); 
      } 
     }).setNegativeButton("No", null).show(); 

    } 
0

在這裏找到是管理backPressed()準備方法一次按兩次何時調用確認對話框:

/** 
* Overrides Back Pressed Button handler. 
* Single continuous press custom clear in your activity. 
* Double continuous press - confirmation dialog to close all activities and exit to Android. 
*/ 
@Override 
public void onBackPressed() { 

if (isBackPressedTwice) { 

    new AlertDialog.Builder(this) 
    .setCancelable(false) 
    .setIcon(
     R.drawable.exit) 
    .setTitle(
     getString(
     R.string.exit)) 
    .setMessage(
     getString(
     R.string.close_application)) 
    .setNegativeButton(
     getString(
     R.string.no), 
     null) 
    .setPositiveButton(
     getString(
     R.string.yes), 
     new DialogInterface.OnClickListener() { 
     @Override 
     public void onClick(
      DialogInterface dialog, 
      int which) { 

      finishAffinity(); 

      return; 
     } 
     }) 
    .show(); 
} else { 
    // Custom activity clearing operations. 
} 

this.isBackPressedTwice = true; 

new Handler().postDelayed(
    new Runnable() { 
    @Override 
    public void run() { 

     isBackPressedTwice = false; 
    } 
    }, 
    1000); 
} 
相關問題