java - 覆盖后退按钮,就像主页按钮一样
按下后退按钮,我希望我的应用程序进入停止状态,而不是被破坏状态。
在Android文档中,它指出:
...当按下BACK时,并非所有活动都具有被销毁的行为。 当用户开始在音乐应用程序中播放音乐然后按BACK时,应用程序将覆盖正常的后退行为,防止播放器活动被破坏,并继续播放音乐,即使其活动不再可见
如何在我自己的应用程序中复制此功能?
我认为必须有三种可能性......
捕获后退按钮(如下所示),然后调用主页按钮调用的任何方法。
@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);
}
按下后退按钮,然后按下主页按钮。
捕获后退按钮,然后启动主屏幕的活动,有效地将我的应用程序的活动置于停止状态。
编辑:我知道服务,并且在与此问题相关的应用程序中使用了一个服务。 这个问题具体是关于按下后退按钮将Activity置于停止状态而不是销毁状态。
9个解决方案
329 votes
大多数时候你需要创建一个服务来在后台执行某些操作,而你的可见onBackPressed只是控制这个Service.(我确定音乐播放器的工作原理是一样的,所以文档中的例子似乎有点误导 。)如果是这种情况,那么你的Activity可以像往常一样finish,而Service仍然会运行。
一种更简单的方法是捕获按下onBackPressed按钮并调用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);
}
我认为首选的选项应该是一个Activity正常完成并能够重新创建自己,例如 如果需要,从服务中读取当前状态。 但偶尔可以使用onBackPressed作为快速替代方案。
注意:正如Dave下面指出的Android 2.0引入了一种新的onBackPressed方法,而这些建议就如何处理Back按钮。
Mirko N. answered 2019-02-18T04:41:48Z
43 votes
使用以下代码:
public void onBackPressed() {
Intent intent = new Intent();
intent.setAction(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_HOME);
startActivity(intent);
}
Aniruddh Ambarkar answered 2019-02-18T04:42:11Z
22 votes
如果你想赶上后退按钮,请看Android Developer Blog上的这篇文章。 它涵盖了在Android 2.0中执行此操作的更简单方法,以及为在1.x和2.0上运行的应用程序执行此操作的最佳方法。
但是,如果您的活动已停止,它仍可能会被杀死,具体取决于设备上的内存可用性。 如果您希望在没有UI的情况下运行进程,则应创建Service.文档说明以下有关服务的信息:
服务没有可视用户界面,而是在后台运行无限期。 例如,当用户注意其他事项时,服务可能会播放背景音乐,或者它可能通过网络获取数据或计算某些内容并将结果提供给需要它的活动。
这些似乎适合您的要求。
Dave Webb answered 2019-02-18T04:43:00Z
17 votes
尝试覆盖android.app.Activity类中定义的void onBackPressed()。
m-szalik answered 2019-02-18T04:43:27Z
13 votes
如果它有助于其他人,我有一个活动有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
}
}
希望它可以帮助某人,干杯
craigk answered 2019-02-18T04:44:01Z
8 votes
工作实例..
确保不要调用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);
}
通过这种方式,您的后退按钮就像主页按钮一样。 它不会完成您的活动,但会将其带到后台
第二种方式是致电moveTaskToBack(true);在onBackPressed并确保删除super.onBackPressed
Xar E Ahmer answered 2019-02-18T04:44:50Z
0 votes
更好的是,OnPause()如何:
当活动进入后台但被(但)尚未被杀死时,被称为活动生命周期的一部分。 onResume()的对应部分。
当在活动A前面启动活动B时,将在A上调用此回调。在A的onPause()返回之前不会创建B,所以一定要在这里做任何不长的事情.2323440913563649024。
此回调主要用于保存活动正在编辑的任何持久状态,并确保在没有先杀死此活动的情况下没有足够的资源来启动新活动时不会丢失任何内容。
这也是一个很好的地方,可以停止动画和其他消耗大量CPU的事情,以便尽快切换到下一个活动,或者关闭独占访问的资源,如摄像头。
user1524315 answered 2019-02-18T04:45:46Z
0 votes
在android 2.0之后覆盖onBackPressed()。如
@Override
public void onBackPressed() {
moveTaskToBack(true);
}
SaiLiu answered 2019-02-18T04:46:14Z
-1 votes
我使用@Mirko N.应答器使用了新的Custom 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);
谢谢。
Sameer Z. answered 2019-02-18T04:46:51Z