按下后退按钮,我希望我的应用程序进入停止状态,而不是被破坏状态。
在Android docs中声明:
...并非所有活动都有按下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置于停止状态而不是被破坏状态。
答案 0 :(得分:331)
大多数情况下,您需要创建Service才能在后台执行某些操作,并且您的可见Activity
只会控制此Service
。 (我确定音乐播放器的工作方式相同,所以文档中的示例似乎有点误导。)如果是这种情况,那么Activity
可以照常finish
和{{{ 1}}仍将继续运行。
更简单的方法是按下Service
按钮,然后按以下方式拨打moveTaskToBack(true):
Back
我认为首选选项应该是一个Activity正常完成并能够重新创建自己,例如如果需要,从服务中读取当前状态。但// 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);
}
有时可以作为快速替代方案。
注意:正如Dave在Android 2.0下面所指出的那样,我推出了一种新的moveTaskToBack
方法,以及these recommendations如何处理后退按钮。
答案 1 :(得分:44)
使用以下代码:
public void onBackPressed() {
Intent intent = new Intent();
intent.setAction(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_HOME);
startActivity(intent);
}
答案 2 :(得分:22)
如果你想抓住后退按钮,请查看this post on the Android Developer Blog。它涵盖了在Android 2.0中执行此操作的更简单方法,以及为在1.x和2.0上运行的应用程序执行此操作的最佳方法。
但是,如果您的活动已停止,则可能会因设备上的内存可用性而被杀死。如果您希望在没有UI的情况下运行流程,则应创建Service
。 The documentation says the following about Services:
服务没有可视用户界面,而是在后台无限期地运行。例如,服务可能会在用户处理其他事项时播放背景音乐,或者可能通过网络获取数据或计算某些内容并将结果提供给需要它的活动。
这些似乎适合您的要求。
答案 3 :(得分:17)
尝试覆盖android.app.Activity类中定义的void onBackPressed()
。
答案 4 :(得分:13)
如果它对其他人有帮助,我有一个有2个布局的活动,我可以打开和关闭以获得可见性,尝试模拟一种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
}
}
希望它可以帮到某人, 欢呼声
答案 5 :(得分:9)
工作示例..
确保不要调用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
答案 6 :(得分:0)
更好的是OnPause():
当活动进入后台但被(但)尚未被杀死时,被称为活动生命周期的一部分。 onResume()的对应部分。
当在活动A前面启动活动B时,将在A上调用此回调。在A的onPause()返回之前不会创建B,因此请确保enter code here
在此处不做任何冗长的操作。 / p>
此回调主要用于保存活动正在编辑的任何持久状态,并确保在没有先杀死此活动的情况下没有足够的资源来启动新活动时不会丢失任何内容。
这也是一个很好的地方,可以停止动画和其他消耗大量CPU的事情,以便尽快切换到下一个活动,或者关闭独占访问的资源,如相机。
答案 7 :(得分:0)
在android 2.0之后覆盖onBackPressed()。 如
@Override
public void onBackPressed() {
moveTaskToBack(true);
}
答案 8 :(得分:-1)
我使用@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);
谢谢。
答案 9 :(得分:-1)
我已经尝试了上述所有解决方案,但是没有一个对我有用。当尝试以调用onCreate的方式返回MainActivity时,以下代码对我有所帮助:
Intent。FLAG_ACTIVITY_CLEAR_TOP是关键。
@Override
public void onBackPressed() {
Intent intent = new Intent(this, MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
}