2010-01-04 153 views
232

按下后退按钮时,我希望我的应用程序进入停止状态,而不是被破坏的状态。覆盖后退按钮以充当主页按钮

在Android docs它指出:

...不是所有的活动具有以下行为被压回来时,他们被摧毁。当用户开始播放音乐在音乐应用程序,然后按下BACK,应用覆盖了正常的回行为,防止被破坏的玩家活动,并继续播放音乐,即使它的活动将不再可见

如何在我自己的应用程序中复制此功能?

我认为必须有三种可能性......

  1. 捕获后退按钮按下(如下图),然后调用任何方法(S)的home键调用。

    @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. 捕获后退按钮然后欺骗主页按钮按下。

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

编辑: 我知道服务和正在使用的应用程序之一,它这个问题有关。这个问题具体是关于在按下后退按钮时将活动置于停止状态而非已销毁状态。

+0

看到了类似的回答http://stackoverflow.com/questions/5914040/onbackpressed-to-hide-not-destroy-activity/23759328#23759328 – Nepster 2014-05-20 12:06:51

回答

324

大多数情况下,您需要创建Service才能在后台执行某些操作,而您可见的Activity只是简单控制此Service。 (我确定音乐播放器以相同的方式工作,所以文档中的示例似乎有点误导)。如果是这种情况,那么您的Activity可以像往常一样finishService仍然会运行。

更简单的方法是捕捉Back按钮按压和呼叫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); 
} 

我认为优选的选择应该是一个活动正常完成并且能够重新本身例如如果需要,从服务中读取当前状态。但有时可以使用moveTaskToBack作为快速替代品。

注意:如指出,由Dave低于Android 2.0的推出了新的onBackPressed方法,以及these recommendations如何处理后退按钮。

+1

moveTaskToBack()表现为所希望的工作。使用这种方法会有什么缺点?有没有这种情况下,这可能无法按预期工作? – bdls 2010-01-04 16:14:22

+1

在仔细阅读文档后,我认为它应该可以正常工作。 (我最初认为它适用于该活动,但实际上它说的是“包含此活动的任务”。)但是当然,您应该自己测试它。 :) – 2010-01-04 16:28:02

+0

谢谢Mirko,该方法似乎运作良好。如果您在稍后查看此问题的答案的底部给出更加突出的编辑方式,这可能会很酷 - 因为那是我寻找的位! – bdls 2010-01-04 17:20:45

22

如果你想赶上后退按钮看看this post on the Android Developer Blog。它涵盖了在Android 2.0中执行此操作的更简单的方法,以及为在1.x和2.0上运行的应用程序执行此操作的最佳方法。

但是,如果您的活动已停止,它仍然可能会被杀死,具体取决于设备上的内存可用性。如果你想要一个没有UI的进程运行,你应该创建一个ServiceThe documentation says the following about Services:

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

这些似乎适合您的要求。

17

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

+1

因为android 2.0这是正确的覆盖。 http://developer.android.com/sdk/android-2.0.html – jay 2011-09-29 19:54:42

+2

16 upvotes像这样的答案... 2011是一个不同的时间... – GabrielOshiro 2016-06-28 15:26:55

13

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

@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 
    } 

} 

希望它可以帮助别人, 欢呼

-1

我使用@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); 

谢谢。

42

使用下面的代码:

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

更妙的是,怎么样OnPause()

古称当活动进入后台活动周期的一部分,但还没有(尚未)杀害。与onResume()的对应部分。

当活动B在活动A前面启动时,此回调将在A上调用.B将不会创建,直到A的onPause()返回,所以请确保enter code here在此处不做任何冗长的操作。

此回调函数主要用于保存活动正在编辑的任何持久状态,并确保没有足够的资源来启动新活动而没有先杀死该活动,则不会丢失任何内容。

这也是一个很好的地方,可以做停止动画和其他消耗大量CPU的东西,以便尽可能快地切换到下一个活动,或关闭独占访问等资源作为相机。

8

工作实例..

制作肯定不叫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); 
} 

通过这种方式,您的后退按钮就像Home按钮一样。它不会完成你的活动,但它采取的背景

第二种方式是使用Android 2.0后打电话到moveTaskToBack(true);onBackPressed,并一定要删除super.onBackPressed

0

覆盖onBackPressed()。 如

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