我有一个主要活动,当我单击一个按钮时,开始一个新活动,我使用以下代码来执行此操作:
Intent intent = new Intent(this, SettingsActivity.class);
startActivity(intent);
上面的代码是从主要活动中运行的。
现在在主要活动调用的新活动中,我有一个后退按钮。当我点击这个后退按钮时,我希望我的新活动关闭,它必须回到原来的主要活动。
我曾尝试调用 super.finish()
和 finish()
(来自新活动),但这会关闭我的整个应用程序(包括我的主要活动)。
我怎样才能关闭当前焦点的活动,然后返回主要活动?
已编辑
我手机的后退按钮也关闭了我的整个应用程序这一事实让我认为我错误地启动了第二个活动?
好的,我一直在寻找,
我创建了一个设置活动,它使用相同的清单代码和相同的代码来启动活动。
对于设置活动,当我按下后退按钮时,它会返回到主活动。
通过上面提到的主要问题中的活动,它只会退出我的整个应用程序。
所以问题似乎不在于完成活动的代码,而在于活动本身。
我认为您在开始 SettingsActivity
之前在 MainActivity
中调用 finish()
方法。
您描述的场景将通过以下两种方式发生:
任何一个
您在 AndroidManifest.xml
中为 MainActivity
设置了 android:noHistory = "true"
,这会导致 MainActivity
在按返回键时自动变为 finish
。
或者
在切换到“SettingsActivity”之前,您已经在 MainActivity
中调用了 finish()
,这会杀死它。当您按下后退按钮时,由于堆栈中没有预设其他活动要弹出,它会返回到主屏幕。
您只需在您所在的活动中调用 finish() 即可返回上一个活动。请注意,finish() 调用之后的任何代码都将运行 - 您可以在调用 finish() 之后执行 return 来解决此问题。
如果您想将结果返回给活动一,那么在开始活动二时,您需要:
startActivityForResults(myIntent, MY_REQUEST_CODE);
在您调用的活动中,您可以从 onCreate() 参数中获取 Intent 或使用
getIntent();
要设置将结果返回到活动一,然后在活动二中执行
setResult(Activity.RESULT_OK, MyIntentToReturn);
如果您无意返回,请说
setResult(Activity.RESULT_OK);
如果活动的结果不好,您可以使用 Activity.RESULT_CANCELED (默认情况下使用此选项)。然后在活动一中你做
onActivityResult(int requestCode, int resultCode, Intent data) {
// Handle the logic for the requestCode, resultCode and data returned...
}
要完成活动,两个使用与上面描述的相同的方法完成(),您的结果已经设置。
如果你使用片段你应该使用
getActivity().onBackPressed();
如果您使用单一活动,您可以使用
finish();
当你点击你的按钮时,你可以让它调用:
super.onBackPressed();
我相信您的第二项活动可能与您作为子活动的主要活动无关。检查您的 AndroidManifest.xml
文件并查看您的子活动的 <activity>
条目是否包含 android:parentActivityName
属性。它应该看起来像这样:
<?xml ...?>
...
<activity
android:name=".MainActivity"
...>
</activity>
<activity
android:name=".ChildActivity"
android:parentActivityName=".MainActivity"
...>
</activity>
...
试试这个代码而不是 finish
:
onBackPressed();
Button edit = (Button) view.findViewById(R.id.yourButton);
edit.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(this, YourMainActivity.class);
startActivity(intent);
finish();
}
});
这将关闭整个应用程序:
this.finish();
你让这太难了。如果我理解您要正确执行的操作,内置的“后退”按钮和 Android 本身将为您完成所有工作:http://developer.android.com/guide/components/tasks-and-back-stack.html
此外,实现自定义“后退”按钮违反了核心应用质量指南 UX-N1:http://developer.android.com/distribute/googleplay/quality/core.html
我不知道这是否有用,但我正在努力解决同样的问题,我找到了一个非常简单的方法,只有一个全局布尔变量和 onResume() 操作。就我而言,如果单击特定按钮,我的 Activity C 应该会触发 Activity B 的 finish()!
活动_A -> 活动_B -> 活动_C
Activity_A(正常打开Activity_B)
Activity_B(在某些按钮上单击打开 Activity_C):
// Global:
boolean its_detail = false;
// -------
SharedPreferences prefs = getApplicationContext().getSharedPreferences("sharedpreferences", 0);
boolean v = prefs.getBoolean("select_client", false);
its_detail = v;
startActivity(C);
@Override
public void onResume(){
super.onResume();
if(its_detail == true){
finish();
}
}
因此,每当我单击 Activity C 上的按钮时,它都会执行 Activity B 的“onResume()”功能并返回到 Activity A。
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if ( id == android.R.id.home ) {
finish();
return true;
}
return super.onOptionsItemSelected(item);
}
试试这个,它既适用于工具栏后退按钮,也适用于硬件后退按钮。
android:parentActivityName=".MainActivity"
的 SettingsActivity 作为第二个。此代码处理工具栏中的 Home/Back 按钮,并刚刚完成当前活动,返回到堆栈中的前一个活动。谢谢。
Finish 会关闭整个应用程序,这是我在 Android 开发中讨厌的东西
startActivity(intent)
为什么不
关闭活动(意图)?
我们遇到了非常相似的情况。
活动一(开场)->活动二(预览)->活动三(详细)
不正确的“背压”响应
活动 3 上的设备后按也会关闭活动 2。
我已经检查了上面发布的所有答案,但没有一个有效。 Activity 2 和 Activity 3 之间的转换的 Java 语法经过审查是正确的。
刚从编码中调用 3rd 方应用程序。通过一个活动。我们决定从配置角度进行调查——最终使我们能够确定问题的根本原因。
范围:活动 2(调用者)的配置。
根本原因:
android:launchMode="singleInstance"
解决方案:
android:launchMode="singleTask"
显然,在这个“背压”问题上,singleInstance 考虑在一个实例中调用的活动与调用 Activity,而 singleTask 将允许调用的活动具有自己的身份,足以让预期的背压能够正常工作。
在您的活动的 onCreate 方法上编写以下代码。
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setDisplayShowHomeEnabled(true);
然后覆盖活动的 onOptionsItem 选择方法,如下所示
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()){
case android.R.id.home:
finish();
}
return super.onOptionsItemSelected(item);
}
你很高兴。
只是不要在您的 MainActivity
上调用 finish()
,这样就无需在您的 SecondActivity
中覆盖您的 onBackPressed()
,除非您在该函数中执行其他操作。如果您觉得“需要”这个后退按钮,那么您只需在 SecondActivity
上调用 finish()
,只要您没有在其上调用 finish()
,它就会将您带到您的 MainActivity
Activity
还是总是回到 MainActivity
?此外,如果您使用 Bitmaps
时内存不足,那么您应该阅读 This part of Docs。它帮助了我
您可能正在调用finish();在单击按钮事件中,因此主要活动在您单击按钮后立即关闭,当您从下一个活动返回时,应用程序退出,因为主要活动已经关闭并且没有活动活动。
您必须在 MainActivity 中使用它
Intent intent = new Intent(context , yourActivity);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
context.startActivity(intent);
该标志将启动多个任务,这些任务将保留您的 MainActivity,当您调用完成时,它将杀死其他活动并让您回到 MainActivity
{ getApplicationContext.finish(); }
试试这个方法。。
如果上述答案都没有帮助,我认为这可能会对某人有所帮助。
在按下内置的后退按钮或我的自定义后退按钮时,我也遇到了同样的问题,应用程序关闭而不返回到上一个活动。
我正在从第一个活动的工具栏中调用第二个活动。
但在启动活动中,我称之为:
case android.R.id.home:
if (isActionMode) {
clearSelectingToolbar();
adapter.notifyDataSetChanged();
} else {
onBackPressed(); // This was making the activity to finish
}
break;
这段代码开始活动
case R.id.settings:
context.startActivity(new Intent(ShowAllDirectoriesActivity.this, SettingsActivity.class));
删除“case android.R.id.home”部分后,我的活动能够以正常流程执行,即返回上一个活动。
所以检查一下你是否也在使用同样的东西!