2012-06-18 47 views
1

我有一個應用程序,其中有不同的活動。在1個活動,我想,當用戶按下後退按鈕,我希望應用程序被關閉,並顯示退出Android應用程序返回按鈕

碼主屏幕

public boolean onKeyDown(int keyCode, KeyEvent event) 
     { 
      //Handle the back button 
      if(keyCode == KeyEvent.KEYCODE_BACK) 
       { 
        //Ask the user if they want to quit 
        new AlertDialog.Builder(this) 
        .setIcon(android.R.drawable.ic_dialog_alert) 
        .setTitle("Exit") 
        .setMessage("Really Exit ?") 
        .setPositiveButton("Yes", new DialogInterface.OnClickListener() 
         { 
          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(); 
        return true; 
       } 
      else 
       { 
       return super.onKeyDown(keyCode, event); 
       } 
     } 

當我運行這一點,按後退按鈕時,主屏幕顯示,但當我第二次運行它,我得到一個控制檯輸出作爲

ActivityManager:警告:活動未啓動,它的當前任務已被帶到前面。

並顯示後退按鈕被按下的活動。 我認爲應用程序不會被殺死並在後臺運行。只要提一下,這不是我的應用程序的開始活動。

有人可以幫助我,我是初學者。

+0

你的問題給出不明確親愛的。 – Androiduser

+0

在onPause()中寫'finish();'... – GAMA

+0

信息點:從Android 2.0開始,後退按鈕的默認頂層處理程序一直處於onKeyUp()的默認(Activity類)實現中,而不是onKeyDown ()。因此,如果您要嘗試修改此行爲(例如,通過提示進行確認),則可能需要重寫onKeyUp()。 這個默認的Activity.onKeyUp()本身調用onBackPressed(),它的默認實現是調用finish(),它會結束當前的(主要)活動。 – Carl

回答

2

對於每個意圖已用於進入其他活動 u必須遵循這樣的傳球意圖只是通過標誌每個意圖下方開始使用startActivity 活動後給出() u必須添加完成()該演示代碼後下方

Intent i=new Intent(firstActivity.this,secondActivity.class); 
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
startActivity(i); 
finish(); 
+0

沒錯,那是我通過這種方式執行 –

+0

的方式 – Khan

+0

是的,它給出了我想要的結果 –

2

你不能隨意殺死你的應用程序。當它希望釋放分配給它的資源時,android操作系統會這樣做。您實際上無法在android中實現退出應用程序概念。用戶可以簡單地離開您的Activity並返回。如果它必須從第一個Activity重新啓動,或者在它離開的地方重新開始,則取決於android操作系統,而不是您。

閱讀此篇瞭解如何Android應用程序應該設計理念,爲什麼你不希望你的意志退出: Is quitting an application frowned upon?

+0

因此,當我從我的應用程序導航到主屏幕,然後重新運行我的應用程序。最後一次運行的活動將被顯示,而不是開始的活動。無論如何,我都無法實現這些預期的輸出。 –

+0

你可以在該Activity上調用'finish()'來告訴操作系統你已經完成了這個'Activity',操作系統可以自由地銷燬和釋放分配給它的資源。 –

+2

至於你絕望的嘗試退出你的應用程序,那麼你必須在你離開它的每一個'Activity'時調用'finish()'。 –

1

添加finish();該行startActivity(intent)後,完成您的活動。

謝謝

+1

添加完成只會退出當前的活動,而不是應用程序,如果我沒有錯的話? –

0

你的問題不清楚親愛的。

根據我的知識,您應該使用broadCast Reciever完成應用程序並將意圖傳遞給主屏幕。

而且警告是什麼,運行應用程序只需按Enter鍵在你的代碼,或給SM空間和書房保存並重新運行你appication.It將正常工作....

+0

我不想重新安裝我的應用程序。你可以解釋如何使用廣播接收器嗎? –

0

之前,如果你想退出你的應用程序後,然後你必須完成所有以前的活動,當你按下該屏幕上的後退按鈕爲此,你應該使用廣播接收器的概念 ......意味着你已經廣播了一個意圖,後退將完成所有以前的活動。

+0

你可以正確解釋使用廣播接收器的概念嗎? –

4

試試這個代碼:

@Override 
public void onBackPressed() 
{ 
     moveTaskToBack(true); 
} 

還要檢查這個Link

+0

它不會退出應用程序。它會將應用程序放在後臺進程中。 – Praveenkumar

+0

好的..我會嘗試 –

+0

我編輯了我的答案。請檢查, –

1

你需要在你的代碼,這個類作爲這樣的.........

public abstract class AppBaseActivity extends Activity { 
public static final String FINISH_ALL_ACTIVITIES_ACTIVITY_ACTION = "com.hrupin.FINISH_ALL_ACTIVITIES_ACTIVITY_ACTION"; 
private BaseActivityReceiver baseActivityReceiver = new BaseActivityReceiver(); 
public static final IntentFilter INTENT_FILTER = createIntentFilter(); 

private static IntentFilter createIntentFilter(){ 
    IntentFilter filter = new IntentFilter(); 
    filter.addAction(FINISH_ALL_ACTIVITIES_ACTIVITY_ACTION); 
    return filter; 
} 

protected void registerBaseActivityReceiver() { 
    registerReceiver(baseActivityReceiver, INTENT_FILTER); 
} 

protected void unRegisterBaseActivityReceiver() { 
    unregisterReceiver(baseActivityReceiver); 
} 

public class BaseActivityReceiver extends BroadcastReceiver{ 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     if(intent.getAction().equals(FINISH_ALL_ACTIVITIES_ACTIVITY_ACTION)){ 
      finish(); 
     } 
    } 
} 

protected void closeAllActivities(){ 
    sendBroadcast(new Intent(FINISH_ALL_ACTIVITIES_ACTIVITY_ACTION)); 
} 
    } 

然後,你需要從這個類中的所有其他類擴展,正如下面的例子:

public class FirstActivity extends AppBaseActivity implements OnClickListener { 
/** Called when the activity is first created. */ 

private Button buttonOpenNextActivity; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.first); 
    registerBaseActivityReceiver(); 
    buttonOpenNextActivity = (Button)findViewById(R.id.buttonOpenNextActivity); 
    buttonOpenNextActivity.setOnClickListener(this); 
} 

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

@Override 
public void onClick(View v) { 
    /* OPEN SECOND ACTIVITY.*/ 
    startActivity(new Intent(this, SecondActivity.class)); 
} 
    } 

另一類:

 public class SecondActivity extends AppBaseActivity implements OnClickListener { 
private Button buttonOpenNextActivity; 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.second); 
    registerBaseActivityReceiver(); 
    buttonOpenNextActivity = (Button)findViewById(R.id.buttonOpenNextActivity); 
    buttonOpenNextActivity.setOnClickListener(this); 
} 

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

@Override 
public void onClick(View v) { 
    /* OPEN THIRD ACTIVITY.*/ 
    startActivity(new Intent(this, ThirdActivity.class)); 
} 
      } 

最後一課:

​​

現在當你按下ba在第三項活動中的所有其他活動也將完成。

1 /不要忘了在onCreate中註冊接收者,並在ondestroy()中取消註冊()。

相關問題