Android 单击返回时应用程序未正确关闭
Android App Not Closing Properly When Clicking Back
Post 已编辑
我编写了一个 android 应用程序作为练习项目,用于学习目的。我遇到一个问题,当我在访问设置 activity 并在其中进行更改(复选框选项)后按下主 activity 上的后退按钮时,它会返回到设置 activity.如果在设置 activity 中没有进行任何更改,然后我返回到主 activity 并再次按返回,它会正常退出。如果我访问任何其他 activity 然后返回主页面,请再次按回它一次单击即可正常关闭。
下面您将看到设置 activity 和主要 activity 的后退按钮代码。
user_settings_activity.java(设置activity):
// When the back button is pressed, it goes back to the previous screen.
@Override
public void onBackPressed() {
super.onBackPressed();
finish();
}
User_Options.java(主要activity):
// When the back button is clicked, the user is asked if they want to close the app window or not.
@Override
public void onBackPressed() {
super.onBackPressed();
finish();
}
请告知我是否需要任何其他代码。
任何致力于解决问题的帮助都将不胜感激。
谢谢。
解决方案
首先,感谢所有坚持回答和评论这个问题的人。我感谢大家的帮助。现在经过更多的修补,我终于设法找到了解决方案。代码如下。
设置Activity:
// For the go back button.
public void go_back_butt(View v){
// Goes to main activity.
Intent main_activity = new Intent(getApplicationContext(), User_Options.class);
main_activity.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
main_activity.putExtra("EXIT", true);
startActivity(main_activity);
finish();
}
和
// When the back button is pressed, it goes back to the previous screen.
@Override
public void onBackPressed() {
super.onBackPressed();
finish();
}
主要Activity:
// When the back button is clicked, the user is asked if they want to close the app window or not.
@Override
public void onBackPressed() {
super.onBackPressed();
if (getIntent().getBooleanExtra("EXIT", false)) {
finish();
}
android.os.Process.killProcess(android.os.Process.myPid());
}
解释:
正如@chichiangho 提到的,我需要深入了解堆栈。由于我对此类问题的了解有限,我做了,但设法弄清楚由于某种原因设置 activity 没有像我最初推测的那样正确关闭。所以这让我想知道如何在保留我保存的设置的同时正确处理这个问题。
感谢@kevz 和@MFP 的回复,我得以解决这个问题。我实现了一个 "Go Back" 按钮(参见代码)并在主 activity 上使用了 kill 进程以确保应用程序 "exits" 正常。我还将一个意图从设置 activity 传递到主要 activity 以确保 finish() 过程发生。
感谢所有参与并花时间 post 的有用回复,让我跳出框框思考更多,同时学习有关 android 应用程序开发的新知识 = ).
覆盖 Activity
中的 onBackPressed 函数
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public void onBackPressed() {
super.onBackPressed();
// Call finish() function here
finish();
}
您可以使用以下代码退出应用程序。
@Override
public void onBackPressed() {
super.onBackPressed();
ActivityCompat.finishAffinity(MainActivity.this);
android.os.Process.killProcess(android.os.Process.myPid());
}
用这个..
@Override
public boolean onKeyDown(int keyCode, KeyEvent event)
{
if ((keyCode == KeyEvent.KEYCODE_BACK))
{
finish();
}
return super.onKeyDown(keyCode, event);
}
单击按钮时从 MainActivity 启动 SettingActivity -
btnSecond.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(MainActivity.this, SettingActivity.class));
}
});
启动SettingActivity后无需finish() MainActvity。
无需重写 SettingActivity 中的 onKeyDown() 或 onBackPressed()。
无论您在设置中做出什么 wt 更改 activity 都不要覆盖上述任何方法,它会正常工作。
关闭 SettingActivity 时尝试不执行任何操作。
这是您的活动堆栈。
首先:MainActivity
开始SettingActivity:MainActivity->SettingActivity
在onBackPressed()
中启动MainActivity:MainActivity->SettingActivity->MainActivity
然后完成SettingActivity:MainActivity->MainActivity
看,有两个 MainActivities,我认为这就是为什么您的 MainActivity 看起来像重新启动的原因。
Post 已编辑
我编写了一个 android 应用程序作为练习项目,用于学习目的。我遇到一个问题,当我在访问设置 activity 并在其中进行更改(复选框选项)后按下主 activity 上的后退按钮时,它会返回到设置 activity.如果在设置 activity 中没有进行任何更改,然后我返回到主 activity 并再次按返回,它会正常退出。如果我访问任何其他 activity 然后返回主页面,请再次按回它一次单击即可正常关闭。
下面您将看到设置 activity 和主要 activity 的后退按钮代码。
user_settings_activity.java(设置activity):
// When the back button is pressed, it goes back to the previous screen.
@Override
public void onBackPressed() {
super.onBackPressed();
finish();
}
User_Options.java(主要activity):
// When the back button is clicked, the user is asked if they want to close the app window or not.
@Override
public void onBackPressed() {
super.onBackPressed();
finish();
}
请告知我是否需要任何其他代码。
任何致力于解决问题的帮助都将不胜感激。
谢谢。
解决方案
首先,感谢所有坚持回答和评论这个问题的人。我感谢大家的帮助。现在经过更多的修补,我终于设法找到了解决方案。代码如下。
设置Activity:
// For the go back button.
public void go_back_butt(View v){
// Goes to main activity.
Intent main_activity = new Intent(getApplicationContext(), User_Options.class);
main_activity.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
main_activity.putExtra("EXIT", true);
startActivity(main_activity);
finish();
}
和
// When the back button is pressed, it goes back to the previous screen.
@Override
public void onBackPressed() {
super.onBackPressed();
finish();
}
主要Activity:
// When the back button is clicked, the user is asked if they want to close the app window or not.
@Override
public void onBackPressed() {
super.onBackPressed();
if (getIntent().getBooleanExtra("EXIT", false)) {
finish();
}
android.os.Process.killProcess(android.os.Process.myPid());
}
解释:
正如@chichiangho 提到的,我需要深入了解堆栈。由于我对此类问题的了解有限,我做了,但设法弄清楚由于某种原因设置 activity 没有像我最初推测的那样正确关闭。所以这让我想知道如何在保留我保存的设置的同时正确处理这个问题。
感谢@kevz 和@MFP 的回复,我得以解决这个问题。我实现了一个 "Go Back" 按钮(参见代码)并在主 activity 上使用了 kill 进程以确保应用程序 "exits" 正常。我还将一个意图从设置 activity 传递到主要 activity 以确保 finish() 过程发生。
感谢所有参与并花时间 post 的有用回复,让我跳出框框思考更多,同时学习有关 android 应用程序开发的新知识 = ).
覆盖 Activity
中的 onBackPressed 函数@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public void onBackPressed() {
super.onBackPressed();
// Call finish() function here
finish();
}
您可以使用以下代码退出应用程序。
@Override
public void onBackPressed() {
super.onBackPressed();
ActivityCompat.finishAffinity(MainActivity.this);
android.os.Process.killProcess(android.os.Process.myPid());
}
用这个..
@Override
public boolean onKeyDown(int keyCode, KeyEvent event)
{
if ((keyCode == KeyEvent.KEYCODE_BACK))
{
finish();
}
return super.onKeyDown(keyCode, event);
}
单击按钮时从 MainActivity 启动 SettingActivity -
btnSecond.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(MainActivity.this, SettingActivity.class));
}
});
启动SettingActivity后无需finish() MainActvity。
无需重写 SettingActivity 中的 onKeyDown() 或 onBackPressed()。
无论您在设置中做出什么 wt 更改 activity 都不要覆盖上述任何方法,它会正常工作。
关闭 SettingActivity 时尝试不执行任何操作。
这是您的活动堆栈。
首先:MainActivity
开始SettingActivity:MainActivity->SettingActivity
在onBackPressed()
中启动MainActivity:MainActivity->SettingActivity->MainActivity
然后完成SettingActivity:MainActivity->MainActivity
看,有两个 MainActivities,我认为这就是为什么您的 MainActivity 看起来像重新启动的原因。