закрытие активности с помощью Finish(); не заставит приложение начать заново при следующем запуске! Зачем?

Я задавался вопросом, может ли кто-нибудь пролить свет на это,

У меня есть одно приложение активности, в котором есть список. В onCreate() я заполняю некоторые данные в этом списке (читая их из базы данных sqlite). У меня есть кнопка закрытия, которая запускает finish(); слишком. теперь, когда я нажимаю кнопку закрытия, активность исчезает, но когда я нажимаю значок приложения на рабочем столе (или выбираю его из кнопки истории телефона), я вижу все предыдущие данные в списке. функция, которую я ищу, - запустить приложение заново после нажатия кнопки закрытия для следующего запуска. (что-то вроде кнопки выхода из банковского приложения). (представление списка здесь является лишь примером, демонстрирующим необходимость, поэтому очистка представления списка перед finish(); неприемлема. Это очень простой и простой запрос, и я не думаю, что какой-либо код необходим, но если кому-то интересно, я также опубликуйте код.

То, что я хочу, - это то же поведение, что и банковское приложение при выходе, когда пользователь покидает главный экран или щелкает выход, приложение полностью закрывается. Я могу добиться этого, используя следующие методы (номер 2 и 3), но, по-видимому, эти решения не являются лучшими практиками. Тогда какой метод использует банковское приложение для мгновенного закрытия приложения? Я сомневаюсь, что они используют что-то, что не является лучшей практикой, например System.exit(0)?! или они!

  1. Многие разработчики утверждают, что закрытие приложения или уничтожение родительской активности — это работа ОС.

  2. Некоторые говорят, используйте use :

    int pid = android.as.Process.myPid();

    android.os.Process.killProcess(pid);

(это решение в соответствии с этим не является хорошей идеей, потому что при следующем запуске приложение ведет себя так, как будто оно было аварийно завершено в прошлый раз https://stackoverflow.com/a/24015569/4173238 )

  1. некоторые говорят, что используйте System.exit(0); в соответствии с этим https://stackoverflow.com/a/5846275/4173238 также не рекомендуется

  2. некоторые говорят, что используйте finish(); но финиш не делает то, что я хочу

Спасибо за любой вклад


person bastami82    schedule 14.07.2015    source источник
comment
возможный дубликат Выход из приложения - это не одобряется?   -  person Machado    schedule 14.07.2015
comment
что насчет того, если вы измените порядок стека действий на этой кнопке, нажмите, чтобы удалить все действия, перейдите к основному и просто вызовите finish(). возможно, используя FLAG_ACTIVITY_CLEAR_TOP.   -  person Tobiel    schedule 14.07.2015
comment
Тогда какой метод использует банковское приложение для мгновенного закрытия приложения одним щелчком мыши? -- во-первых, пожалуйста, объясните в точных технических терминах, что вы подразумеваете под прекращением работы приложения. Затем, пожалуйста, объясните в точных технических терминах, как вы определили, что банковское приложение делает что-то, чтобы закрыть приложение.   -  person CommonsWare    schedule 14.07.2015
comment
@Machado Пост, на который вы ссылаетесь, находится в абзаце номер 2 (причина неиспользования имеет ссылку на этот пост)   -  person bastami82    schedule 14.07.2015
comment
@Tobiel Я пробовал это только с одним действием, но это не работает, используя finish() для закрытия этого действия. Я ожидаю увидеть новое состояние, когда я вернусь или повторно открою приложение, но я вижу предыдущее состояние этого действия .   -  person bastami82    schedule 14.07.2015
comment
@CommonsWare, во-первых, спасибо за время, чтобы ответить. Под «прекращением работы приложения» я имел в виду, что приложение не вернется в предыдущее состояние закрытой активности. приложение будет работать заново при следующем запуске. что-то вроде последействия System.exit(0); в двух словах новый старт для приложения. Я не знаю точных технических терминов, но мне хотелось бы знать, как банковское приложение ведет себя таким образом (когда вы выходите или покидаете действие, вам нужно снова запустить приложение. надеюсь, что я ответил на ваш вопрос, и я надеюсь, что вы понимаете, что нет все здесь находятся на одном уровне знаний об Android, поэтому stackoverflow.   -  person bastami82    schedule 14.07.2015
comment
начать действие в new_task | режим clear_task. Тогда закончи это.   -  person njzk2    schedule 14.07.2015
comment
приложение не вернется в предыдущее состояние закрытой активности — это то, что делает finish(). Finish() не выполняет ту же работу для меня - тогда вам нужно подробно объяснить, что такое та же работа и что finish() не делает. Вы также можете объяснить, что означает уход пользователя с главного экрана. Я надеюсь, вы понимаете, что не все здесь находятся на одном уровне знаний об Android. Я надеюсь, вы понимаете, что вы должны предоставить минимальный, полный и проверенный пример того, что у вас не работает.   -  person CommonsWare    schedule 14.07.2015
comment
@ njzk2, не могли бы вы немного подробнее объяснить свое решение (я изучаю Android), и я думаю, что читал аналогичное концептуальное решение с вашим ответом где-то еще, оно заключалось в том, чтобы открыть другое действие (чтобы отправить основное действие в фоновый режим), а затем запустить закончить основное занятие). но у меня есть только одно действие в моем тестовом приложении).   -  person bastami82    schedule 15.07.2015
comment
@CommonsWare Я добавил больше деталей в свой пост, как вы просили. пожалуйста, пересмотрите описание вопроса.   -  person bastami82    schedule 15.07.2015
comment
когда я снова нажимаю на значок приложения, я вижу все предыдущие данные в представлении списка - если вы вызвали finish(), вы просматриваете новый экземпляр действия, когда снова нажимаете значок приложения. Это означает, что откуда бы ни поступали все предыдущие данные, они находятся вне области действия, например, в статическом члене данных. Вам нужно будет определить, откуда поступают эти данные, и предпринять шаги, чтобы не использовать эти данные, когда вы этого не хотите.   -  person CommonsWare    schedule 15.07.2015
comment
СПАСИБО и +1 за упоминание статических членов. Как вы указали, я заметил, что причина, по которой мое приложение не запускается заново, заключается в том, что я использовал статическую переменную для сохранения извлеченных данных (я изменил это, и это работает. В конце концов, кажется, что Finish делает свою работу! спасибо. Я оставляю этот вопрос открыто, потому что мне все еще интересно узнать, как банковское приложение входит / выходит из системы.   -  person bastami82    schedule 15.07.2015


Ответы (2)


Если у вас есть механизм, позволяющий доставлять сообщения в основной поток только тогда, когда приложение resumed, то вы может зарегистрировать ваши действия в шине событий, например Otto, и отправить событие, на которое подписано каждое действие, на которое они вызывают finish() на себя.

Другое возможное решение — начинать каждое действие с startActivityForResult(), и если вы нажмете кнопку exit, то вы бы сказали

    public static final int KILL_ACTIVITY_RESULT_CODE = 0xD34DB33F; //why not

    public boolean onOptionsMenuItemSelected(MenuItem menuItem) {
          if(menuItem.getId() == R.menu.kill_activity) {
               setResult(KILL_ACTIVITY_RESULT_CODE);
               finish();
          }
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        if(resultCode == KILL_ACTIVITY_RESULT_CODE) {
            setResult(KILL_ACTIVITY_RESULT_CODE);
            finish();
        }
    }
}

... и однажды я видел, как кто-то делал статические ссылки на каждое действие, которое у него было, и вызывал finish() для каждого из них. Но не делайте этого, это по сути означает, что вы потерпели неудачу как Android-программист, и вам нечем искупить ваши грехи.

person EpicPandaForce    schedule 14.07.2015
comment
LOL, твой пост меня рассмешил... Я тоже видел этот ответ на другом форуме. Я попробую ваше решение и сообщу вам завтра. Я отправляюсь на 3D Terminator 3 ... ура - person bastami82; 14.07.2015
comment
Просто чтобы вы знали, статические ссылки на действия были в том же коде, что и этот: reddit.com/r/programminghorror/comments/3c85pp/ ‹ -- просто чтобы доказать, насколько это плохо - person EpicPandaForce; 14.07.2015
comment
еще раз спасибо за ответ, я не уверен, что понимаю ... Я только что обновил описание вопроса, и я буду признателен, если вы сообщите мне, как реализовать ваше решение в моем случае. - person bastami82; 15.07.2015

Как блестяще отметил CommonsWare в своем комментарии, проблема заключалась в статике! Я использовал статические переменные для хранения данных, чтобы заполнить My listView. По-видимому, даже если у вас есть только одно действие и вы закроете его, статические переменные останутся нетронутыми! при повторном запуске приложения! Если вы спросите, почему я использовал статическую переменную в первую очередь, я должен сказать, правильно это или неправильно, я хотел разделить эту переменную между моим другим классом Java (моим databaseHandler.class).

Почему Android не очищает все (включая статические переменные) ресурсы при закрытии основной и единственной активности приложения, остается вопросом, и это моя следующая тема для чтения! но большое спасибо всем, кто оставит комментарий по этому вопросу,

Я также изменю вопрос с:

Как закрываются банковские приложения? Finish () не выполняет ту же работу для меня

to

закрытие активности с помощью Finish(); не заставит приложение начать заново при следующем запуске! Зачем?

person bastami82    schedule 16.07.2015