覆盖后退button,就像主页button一样
按下后退button,我希望我的应用程序进入停止状态,而不是被破坏的状态。
在Android 文档中,它指出:
…并不是所有的活动都有被按下时被销毁的行为。 当用户在音乐应用程序中开始播放音乐,然后按下BACK时,应用程序将覆盖正常的后退行为,防止播放器活动被破坏,并继续播放音乐,即使其活动不再可见
我如何在我自己的应用程序中复制这个function?
我认为必须有三种可能性
-
捕获后退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); }
-
捕获后退button,然后欺骗主页button。
-
捕获后退button,然后启动主屏幕的活动,有效地将我的应用程序的活动进入停止状态。
编辑:我知道有关服务,并在与此问题相关的应用程序中使用。 这个问题具体是关于按下后退button将活动置于停止状态而不是被破坏的状态。
大多数情况下,您需要创build一个服务来在后台执行某些操作,而您可见的Activity
只是简单地控制了该Service
。 (我确定音乐播放器的工作方式是一样的,所以文档中的例子似乎有些误导)。如果是这样的话,那么您的Activity
可以照常finish
, Service
仍然在运行。
一个更简单的方法是捕获Back
button按下并调用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);
谢谢。