Как я могу что-то сделать до закрытия приложения?

Я сделал приложение на Android, в котором у меня есть TCP-клиент, но теперь я хочу отправить сообщение на сервер только тогда, когда приложение будет закрыто, я пытались добавить действие openConnection (открытие соединения с TCP-клиентом) и sendMessage (отправка сообщения на TCP-сервер) в метод onDestroy, но это не сработало. TCP-клиент, который я использовал, описан в этом руководстве, на самом деле мне нужно отправить это сообщение для сообщите серверу, что связь с устройством закрыта, и отправьте сообщение «Устройство отключено», а затем просто закройте приложение.


person John K    schedule 19.07.2017    source источник
comment
попробуйте создать службу в начале, а затем отправить широковещательную рассылку этой службе при вызове onDestroy, служба останется, даже если приложение выйдет из строя...   -  person xpto    schedule 19.07.2017
comment
это может не сработать, если пользователь выключает свой телефон...   -  person xpto    schedule 19.07.2017
comment
@MarceloFilho на самом деле я пытался использовать это руководство но мне удалось снова запустить TCP-клиент только тогда, когда он слишком быстро закрыл приложение для отправки сообщения.   -  person John K    schedule 19.07.2017


Ответы (3)


Способ 1. Для этого можно использовать ActivityLifecycleCallbacks. Ниже приведен пример с некоторыми журналами.

public class MyApplication extends Application {

    private static final String TAG = MyApplication.class.getSimpleName();
    private int mVisibleCount;
    private boolean mInBackground;

    @Override public void onCreate() {
        super.onCreate();
        registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
            @Override public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
            }

            @Override public void onActivityStarted(Activity activity) {
                mVisibleCount++;
                if (mInBackground && mVisibleCount > 0) {
                    mInBackground = false;
                    Log.i(TAG, "App in foreground");
                }
            }

            @Override public void onActivityResumed(Activity activity) {
            }

            @Override public void onActivityPaused(Activity activity) {
            }

            @Override public void onActivityStopped(Activity activity) {
                mVisibleCount--;
                if (mVisibleCount == 0) {
                    if (activity.isFinishing()) {
                        Log.i(TAG, "App is finishing");
                    } else {
                        mInBackground = true;
                        Log.i(TAG, "App in background");
                    }
                }
            }

            @Override public void onActivitySaveInstanceState(Activity activity, Bundle outState) {

            }

            @Override public void onActivityDestroyed(Activity activity) {
            }
        });
    }

    public boolean isAppInBackground() {
        return mInBackground;
    }

    public boolean isAppVisible() {
        return mVisibleCount > 0;
    }

    public int getVisibleCount() {
        return mVisibleCount;
    }
}

Метод 2. Существует еще один метод, использующий Службу для определения того, завершено ли приложение. См. ссылку.

person santalu    schedule 19.07.2017
comment
Я должен реализовать это в MainActivity или создать новый класс? и как я могу вызвать его из MainActivity? - person John K; 19.07.2017
comment
Я не думаю, что вы можете сделать это в любой деятельности. Вы действительно должны создать класс приложения - person santalu; 19.07.2017
comment
И после того, как я создал новый класс со всем этим, как я могу вызвать его в MainActivity? - person John K; 19.07.2017
comment
После того, как вы создали свой класс приложения, вы должны указать имя приложения в файле манифеста, см. ссылка< /а> . Вам не нужно ничего вызывать в вашей MainActivity. Просто делай свою работу здесь. Лучшее понимание класса приложения см. ссылка - person santalu; 19.07.2017
comment
Похоже, это работает, потому что я вижу приложение журнала в фоновом режиме, но когда я закрываю его из задачи, приложение журнала не завершается ... где я должен реализовать свое действие messageSend в MyApplication? - person John K; 19.07.2017
comment
Да, именно, в вашем случае вы должны делать свою работу, когда происходит Log.i(TAG, "App is finishing"); - person santalu; 19.07.2017
comment
Кажется, это не работает должным образом, потому что я не вижу Log.i ((TAG, приложение на переднем плане), а также Log.i (TAG, приложение завершается), но только Log.i (TAG, приложение в фоновом режиме). ); - person John K; 19.07.2017
comment
Давайте продолжим это обсуждение в чате. - person John K; 19.07.2017
comment
Есть ли способ немного задержать onTaskRemoved из второго метода? потому что это слишком быстро, и у меня есть время, чтобы просто повторно открыть соединение с TCP-клиентом, но не отправлять сообщение - person John K; 19.07.2017
comment
Я думаю, вы можете использовать обработчик link - person santalu; 19.07.2017

Следующий вызов метода при различном действии

  • Сверните приложение с помощью кнопки «Домой» -> это вызывает

    при паузе() при остановке()

  • Удалить приложение из диспетчера задач ->

    затем для этой MainActivity (пусковой установки) вызывается onDestroy().

Итак, сделайте родительскую активность с именем BaseActivity и переопределите ее методы onPause(), onDestroy() и onStop() и вызовите свою реализацию отсюда, а затем расширьте эту активность из других ваших действий.

person Bhushan Uniyal    schedule 19.07.2017

Вы не должны полагаться на метод onDestroy. Согласно официальной документации Android, он не всегда вызывается.

Попробуйте поместить тот же код в метод onStop() вашей активности.

Кроме того, у вас может быть родительское действие, которое расширяется всеми другими действиями.

Затем вы можете переопределить методы onPause() и onStop() в ваших конкретных дочерних действиях и обрабатывать определенные сценарии.

person Ashray P. Shetty    schedule 19.07.2017