Закройте активность Android (полностью, даже в фоновом режиме), используя завершение по нажатию кнопки

Мне нужно закрыть действие при нажатии кнопки. К сожалению, при нажатии кнопки активность исчезает, но все еще находится в фоновом режиме. Пользователь все еще может выбрать его, и он вернется на передний план. Мне нужно, чтобы активность полностью исчезла/уничтожилась.

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 связанные вопросы, однако ни один из них не помогает полностью закрыть действие. Я уже пытался добавить return, добавить еще одного прослушивателя широковещательной рассылки и передать команду для завершения вызова вне 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" не решает проблему. Вот шаги, чтобы воссоздать это, если кто-то думает, что это дубликат или уже решен, попробуйте и оставьте комментарий/ответ, я приму его.

  1. Откройте Android-студию
  2. Создайте пустой проект активности.
  3. Добавьте кнопку.
  4. Добавьте код в onCreate MainActivity для прослушивателя нажатия кнопки.
  5. Внутри прослушиватель кликов, завершение вызова.
  6. Запустите приложение и нажмите кнопку и посмотрите, выполняется ли действие в фоновом режиме или нет.

comment
возможный дубликат stackoverflow.com/a/14523375/5492047   -  person Reyansh Mishra    schedule 10.11.2017
comment
Возможный дубликат Android — как удалить активность из последних приложений?   -  person Reyansh Mishra    schedule 10.11.2017
comment
@ReyanshMishra ... Прежде чем делать выводы, пожалуйста, поймите вопрос. Я уже пробовал решение, указанное в ваших указателях, в этом случае оно не работает. Попробуйте сами, создайте пустую активность, добавьте кнопку, завершите вызов в прослушивателе нажатия кнопки. Затем предложите дубликат, если он работает для вас.   -  person Bill    schedule 10.11.2017
comment
Причина, по которой я отметил это в упомянутом вами манифесте, я не нашел android:excludeFromRecents=true, и это работает для меня, я только что попробовал, посмотрите youtube.com/watch?v=YoK4mZ7kFAY&feature=youtu.be. Может быть одно отличие после завершения, можете ли вы вызвать System.exit(0); и в демо, чтобы выйти из приложения, я нажимаю кнопку поиска.   -  person Reyansh Mishra    schedule 10.11.2017


Ответы (3)


Вам нужно поместить это в свой XML-манифест:android:excludeFromRecents="true"

в теге активности.

<activity
            ...
             android:excludeFromRecents="true">
</activity>
person Rodrigo Gontijo    schedule 10.11.2017
comment
Спасибо, но добавление этой строки в androidmanifest.xml не работает. Он все еще остается. Это всего лишь базовый код, я открываю Android Studio, выбираю пустую активность, добавляю кнопку, а прослушиватель нажатия кнопки добавляет Finish(). Все это. - person Bill; 10.11.2017
comment
Если вы хотите полностью закрыть приложение, вы должны использовать finishAffinity(); вместо финиша() . Он очистит весь стек действий, ранее открытых приложением. И если вы хотите удалить процесс: int pid = android.os.Process.myPid(); android.os.Process.killProcess(pid); - person Rodrigo Gontijo; 11.11.2017
comment
Присмотревшись, куда поместить эту строку, я обнаружил, что она должна быть внутри ‹activity... ›. Я помещал его между «активностью» и «/активностью». После исправления все заработало как надо. - person Bill; 17.11.2017

Просто попробуйте. В тебе проявляется.

    <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); после вызова финиша это работает для меня.

person Reyansh Mishra    schedule 10.11.2017

Вы можете попробовать это

android:excludeFromRecents="true", используйте его в своем манифесте.

person That's Enam    schedule 10.11.2017