Override back button to act like home button
按下后退按钮,我希望我的应用程序进入停止状态,而不是被破坏状态。
在Android文档中,它指出:
...not all activities have the behavior that they are destroyed when BACK is pressed. When the user starts playing music in the Music application and then presses BACK, the application overrides the normal back behavior, preventing the player activity from being destroyed, and continues playing music, even though its activity is no longer visible
如何在我自己的应用程序中复制此功能?
我认为必须有三种可能性......
捕获后退按钮(如下所示),然后调用主页按钮调用的任何方法。
按下后退按钮,然后按下主页按钮。
捕获后退按钮,然后启动主屏幕的活动,有效地将我的应用程序的活动置于停止状态。
编辑:
我知道服务,并且在与此问题相关的应用程序中使用了一个服务。 这个问题具体是关于按下后退按钮将Activity置于停止状态而不是销毁状态。
大多数情况下,您需要创建一个服务来在后台执行某些操作,而您的可见
一种更简单的方法是捕获按下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
我认为首选的选项应该是一个Activity正常完成并能够重新创建自己,例如如果需要,从服务中读取当前状态。但
注意:正如Dave在Android 2.0下面所指出的那样引入了一种新的
使用以下代码:
1 2 3 4 5 6 | public void onBackPressed() { Intent intent = new Intent(); intent.setAction(Intent.ACTION_MAIN); intent.addCategory(Intent.CATEGORY_HOME); startActivity(intent); } |
如果你想赶上后退按钮,请看Android Developer Blog上的这篇文章。它涵盖了在Android 2.0中执行此操作的更简单方法,以及为在1.x和2.0上运行的应用程序执行此操作的最佳方法。
但是,如果您的活动已停止,它仍可能会被杀死,具体取决于设备上的内存可用性。如果您希望在没有UI的情况下运行进程,则应创建
A service doesn't have a visual user interface, but rather runs in the background for an indefinite period of time. For example, a service might play background music as the user attends to other matters, or it might fetch data over the network or calculate something and provide the result to activities that need it.
这些似乎适合您的要求。
尝试覆盖android.app.Activity类中定义的void
如果它可以帮助其他人,我有一个活动有2个布局,我打开和关闭visibilty,试图模仿一种page1> page2结构。如果他们在第2页并按下后退按钮我想让他们回到第1页,如果他们按下第1页上的后退按钮它应该仍然正常工作。它很基本,但它的工作原理
1 2 3 4 5 6 7 8 9 10 11 12 | @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();
1 2 3 4 5 6 7 8 | @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); } |
通过这种方式,您的后退按钮就像主页按钮一样。它不会完成您的活动,但会将其带到后台
第二种方法是在
在android 2.0之后覆盖onBackPressed()。
如
1 2 3 4 | @Override public void onBackPressed() { moveTaskToBack(true); } |
更好的是,OnPause()如何:
当活动进入后台但被(但)尚未被杀死时,被称为活动生命周期的一部分。 onResume()的对应部分。
当在活动A前面启动活动B时,将在A上调用此回调。在A的onPause()返回之前不会创建B,因此请确保
此回调主要用于保存活动正在编辑的任何持久状态,并确保在没有先杀死此活动的情况下没有足够的资源来启动新活动时不会丢失任何内容。
这也是一个很好的做法,例如停止动画和其他消耗大量CPU的事情,以便尽快切换到下一个活动,或者关闭独占访问的资源,如摄像头。
我使用@Mirko N.应答器使用了新的Custom EditText
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | 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); } } |
然后从您的活动中设置数据
1 | searchEditView.setViews(cancelBtn, titleRelativeLayout); |
谢谢。