使用完成按钮单击关闭 android 活动(完全,甚至不在后台)

Posted

技术标签:

【中文标题】使用完成按钮单击关闭 android 活动(完全,甚至不在后台)【英文标题】:Close android activity (completely, not even in background) using finish on a button click 【发布时间】:2018-04-24 02:07:03 【问题描述】:

单击按钮时,我需要关闭活动。不幸的是,当单击按钮时,活动确实消失了,但仍在后台。用户仍然可以选择它,它会回到前面。我需要的是活动完全消失/销毁。

public class MainActivity extends AppCompatActivity 
        @Override
        protected void onCreate(Bundle savedInstanceState) 
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);

            Button button = (Button)findViewById(R.id.button);
            button.setOnClickListener(new View.OnClickListener() 
            @Override
            public void onClick(View view) 
                finish();
            
        );
    

    @Override
    protected void onDestroy() 
        super.onDestroy();
    

我在 SO 上搜索了相关问题,但是,它们都没有帮助完全结束活动。我已经尝试添加返回,添加另一个广播侦听器并传递命令以在 onCreate 之外调用完成。所以在这一点上,问题是 - 这真的有可能还是 android 是这样工作的,你可以调用 finish() 但它仍然在后台,用户可以重新启动它。

这里是xml文件。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.app1.test.myapplication">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

编辑:添加 android:excludeFromRecents="true" 并不能解决问题。以下是重新创建此问题的步骤,如果有人认为它是重复的或已解决,请尝试发表评论/答案,我会接受。

    打开 Android Studio 创建空活动项目。 添加按钮。 在 MainActivity 的 onCreate 中为按钮点击监听器添加代码。 内部点击监听,调用完成。 运行应用程序并单击按钮,查看 Activity 是否仍在后台。

【问题讨论】:

***.com/a/14523375/5492047 的可能重复项 Android - How to remove activity from recent apps?的可能重复 @ReyanshMishra ...在下结论之前,请理解这个问题。我已经尝试过您的指针中提供的解决方案,在这种情况下它不起作用。自己尝试,创建空活动,添加按钮,在按钮单击侦听器中调用完成。如果它适合你,然后建议一个副本。 我在你提到的清单中标记它的原因我没有找到 android:excludeFromRecents="true" 并且它对我有用我刚刚尝试过看看youtube.com/watch?v=YoK4mZ7kFAY&feature=youtu.be。完成后可能有一个区别,您可以调用 System.exit(0);并在演示中退出应用程序,我点击了搜索按钮。 【参考方案1】:

试一试。 在你的清单中。

    <activity
        android:excludeFromRecents="true"
        android:name=".Activities.SplashActivity"
        android:theme="@style/AppThemeSubActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

现在在您的 java 代码中。

     @Override
        public boolean onOptionsItemSelected(MenuItem item) 
            switch (item.getItemId()) 
                case R.id.item_search:
    //                Intent intent = new Intent(MainActivity.this, SearchActivity.class);
    //                startActivity(intent);
                    finish();
                    System.exit(0);

把额外的行 System.exit(0);调用完成后它对我有用。

【讨论】:

【参考方案2】:

你需要把它放在你的 XML 清单中:android:excludeFromRecents="true"

在您的活动标签中。

<activity
            ...
             android:excludeFromRecents="true">
</activity>

【讨论】:

谢谢,但在 androidmanifest.xml 中添加该行不起作用。它仍然存在。这只是基本代码,我打开 Android Studio,选择空活动,添加一个按钮并在按钮单击侦听器上添加完成()。就是这样。 如果你想完全关闭应用程序你应该使用finishAffinity();而不是 finish() 。它将清除应用程序先前打开的所有活动堆栈。如果你想删除进程: int pid = android.os.Process.myPid(); android.os.Process.killProcess(pid); 在仔细查看了该行的放置位置后,我发现它必须在 内。我把它放在 和 之间。在那次更正之后,它按预期工作。【参考方案3】:

你可以试试这个

android:excludeFromRecents="true",在你的清单中使用它。

【讨论】:

以上是关于使用完成按钮单击关闭 android 活动(完全,甚至不在后台)的主要内容,如果未能解决你的问题,请参考以下文章

如何关闭应用程序? [复制]

Android:如何在按下按钮时关闭一个活动并在按下另一个按钮时关闭整个后台堆栈? [复制]

当我们单击 android 设备中的后退按钮时,Sencha 触摸选择字段没有关闭

如何关闭活动并返回到android中的上一个活动

使用关闭按钮切换引导选项卡

Android确定单击哪个按钮以启动活动