覆盖后退button,就像主页button一样

按下后退button,我希望我的应用程序进入停止状态,而不是被破坏的状态。

在Android 文档中,它指出:

…并不是所有的活动都有被按下时被销毁的行为。 当用户在音乐应用程序中开始播放音乐,然后按下BACK时,应用程序将覆盖正常的后退行为,防止播放器活动被破坏,并继续播放音乐,即使其活动不再可见

我如何在我自己的应用程序中复制这个function?

我认为必须有三种可能性

  1. 捕获后退button(如下),然后调用主页button调用的任何方法。

    @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if ((keyCode == KeyEvent.KEYCODE_BACK)) { Log.d(this.getClass().getName(), "back button pressed"); } return super.onKeyDown(keyCode, event); } 
  2. 捕获后退button,然后欺骗主页button。

  3. 捕获后退button,然后启动主屏幕的活动,有效地将我的应用程序的活动进入停止状态。

编辑:我知道有关服务,并在与此问题相关的应用程序中使用。 这个问题具体是关于按下后退button将活动置于停止状态而不是被破坏的状态。

大多数情况下,您需要创build一个服务来在后台执行某些操作,而您可见的Activity只是简单地控制了该Service 。 (我确定音乐播放器的工作方式是一样的,所以文档中的例子似乎有些误导)。如果是这样的话,那么您的Activity可以照常finishService仍然在运行。

一个更简单的方法是捕获Backbutton按下并调用moveTaskToBack(true) ,如下所示:

 // 2.0 and above @Override public void onBackPressed() { moveTaskToBack(true); } // Before 2.0 @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK) { moveTaskToBack(true); return true; } return super.onKeyDown(keyCode, event); } 

我认为最好的select应该是一个活动正常完成,并能够重新创build自己,如果需要从服务读取当前状态。 但是, moveTaskToBack可以作为一个快速的替代有时。

注意 :正如由Android 2.0下面的Dave所指出的,引入了一个新的onBackPressed方法,并提供了如何处理Backbutton的build议。

使用下面的代码:

 public void onBackPressed() { Intent intent = new Intent(); intent.setAction(Intent.ACTION_MAIN); intent.addCategory(Intent.CATEGORY_HOME); startActivity(intent); } 

如果你想赶上后退button看看这个post在Android开发人员的博客 。 它涵盖了在Android 2.0中执行此操作的更简单的方法,也是为在1.x和2.0上运行的应用程序执行此操作的最佳方法。

但是,如果您的活动已停止,则可能会因设备上的内存可用性而被终止。 如果你想要一个没有UI的进程,你应该创build一个Service 。 该文档说明有关服务的以下内容:

一个服务没有可视化的用户界面,而是在后台无限期的运行。 例如,服务可能会在用户参加其他事务时播放背景音乐,或者可能通过networking获取数据或计算某些内容,并将结果提供给需要它的活动。

这些似乎适合您的要求。

尝试覆盖android.app.Activity类中定义的void onBackPressed()

如果它帮助别人,我有一个2布局的活动,我可以切换和可见性,试图模仿一种page1> page2结构。 如果他们在第2页,并按下后退button,我希望他们回到第1页,如果他们按下第1页上的后退button,它应该仍然正常工作。 它非常基本,但它的工作原理

 @Override public void onBackPressed() { // check if page 2 is open RelativeLayout page2layout = (RelativeLayout)findViewById(R.id.page2layout); if(page2layout.getVisibility() == View.VISIBLE){ togglePageLayout(); // my method to toggle the views return; }else{ super.onBackPressed(); // allows standard use of backbutton for page 1 } } 

希望能帮助别人,欢呼

工作示例

确保不要调用super.onBackPressed();

 @Override public void onBackPressed() { Log.d("CDA", "onBackPressed Called"); Intent setIntent = new Intent(Intent.ACTION_MAIN); setIntent.addCategory(Intent.CATEGORY_HOME); setIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(setIntent); } 

这样你的后退button就像主页button一样。 它没有完成你的活动,但把它放到背景

第二种方法是调用moveTaskToBack(true);onBackPressed ,一定要删除super.onBackPressed

更好的是, OnPause()如何:

作为活动生命周期的一部分,当一个活动进入后台,但还没有被杀死。 与onResume()的对应。

当活动B在活动A前面启动时,此callback将在A上被调用。在A的onPause()返回之前,B不会被创build,所以一定要enter code here不要做任何冗长的事情。

这个callback主要用于保存活动正在编辑的任何持续状态,并确保没有足够的资源来启动新的活动,而不必先杀死这个活动。

这也是一个很好的地方,例如停止animation和其他消耗大量CPU的东西,以尽快切换到下一个活动,或者closures像摄像机这样的独占访问资源。

在android 2.0之后覆盖onBackPressed()。 如

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

我使用@Mirko N. answser使用新的自定义EditText

  public class EditViewCustom extends EditText { Button cancelBtn; RelativeLayout titleReleLayout; public EditViewCustom(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } public EditViewCustom(Context context, AttributeSet attrs) { super(context, attrs); } public EditViewCustom(Context context) { super(context); } public void setViews(Button cancelBtn,RelativeLayout titleReleLayout){ this.cancelBtn = cancelBtn; this.titleReleLayout = titleReleLayout; } @Override public boolean onKeyPreIme(int keyCode, KeyEvent event) { if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) { Log.d("KEYCODE_BACK","KEYCODE_BACK"); cancelBtn.setVisibility(View.GONE); this.setFocusableInTouchMode(false); this.setFocusable(false); titleReleLayout.setVisibility(View.VISIBLE); return super.onKeyPreIme(keyCode, event); } return super.onKeyPreIme(keyCode, event); } } 

然后从您的活动中设置数据

  searchEditView.setViews(cancelBtn, titleRelativeLayout); 

谢谢。