Как выполнить код, когда приложение закрывается? - PullRequest
0 голосов
/ 08 октября 2019

Я младший, и у меня возникла проблема.

Я использую Realm на Android (Java), и я хотел бы удалить данные из моего локального BDD, когда он закрывается. Я всегда заканчиваю свою деятельность перед тем, как начинать новую, и никогда не знаю, какой будет последняя активность, прежде чем пользователь решил закрыть приложение.

Есть ли способ выполнить код при закрытии приложения?

РЕДАКТИРОВАТЬ

Вот мой код, благодаря @ Mohanad

public class ApplicationClass extends Application {

@Override
public void onCreate() {
    super.onCreate();

    Realm.init(this);

    RealmConfiguration mRealmConfig = new RealmConfiguration.Builder()
            .schemaVersion(1)
            .migration(new RealmMigrations())
            .inMemory()
            .build();

    Realm.setDefaultConfiguration(mRealmConfig);

    registerActivityLifecycleCallBack();

    Log.i("XXX", "I've been created");

}

public void registerActivityLifecycleCallBack() {

    ActivityLifecycleCallbacks mActivity = new ActivityLifecycleCallbacks() {
        int mCounter = 0;

        @Override
        public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
            mCounter++;
            Log.i("XXX", "I'm called again and again");
        }

        @Override
        public void onActivityStarted(Activity activity) {

        }

        @Override
        public void onActivityResumed(Activity activity) {

        }

        @Override
        public void onActivityPaused(Activity activity) {

        }

        @Override
        public void onActivityStopped(Activity activity) {

        }

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

        }

        @Override
        public void onActivityDestroyed(Activity activity) {
            mCounter--;

            if (mCounter == 0) {
                Realm mRealm  = Realm.getDefaultInstance();

                mRealm.close();
            }
        }
    };
}
}

Ответы [ 4 ]

1 голос
/ 09 октября 2019

Шаги:

1.) Использовать inMemory() конфигурацию

RealmConfiguration config = new RealmConfiguration.Builder()
                                    .inMemory()
                                    .build();

2.) Вызвать realm.init() в Application.onCreate(), установить конфигурацию по умолчанию как обычно, а затем,инициализируйте / закройте Область следующим образом:

public class MyActivity extends AppCompatActivity {
    private Realm realm;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        realm = Realm.getDefaultInstance();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        realm.close();
    }
}

Теперь, когда Область закрыта во всех потоках и вы выходите из приложения (или приложение убито), Область будет удалена.

1 голос
/ 08 октября 2019

Я думаю, что самое простое решение - использовать счетчик и ActivityLifecycleCallbacks в классе вашего приложения, как показано ниже:

    registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
            int activityCounter = 0;

            @Override
            public void onActivityCreated(Activity activity, Bundle bundle) {
                activityCounter ++;
            }

            @Override
            public void onActivityStarted(Activity activity) {

            }

            @Override
            public void onActivityResumed(Activity activity) {

            }

            @Override
            public void onActivityPaused(Activity activity) {

            }

            @Override
            public void onActivityStopped(Activity activity) {

            }

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

            }

            @Override
            public void onActivityDestroyed(Activity activity) {
                activityCounter--;
                if (activityCounter == 0) {
                    //last activity on destroy
                }
            }
        });

Надеюсь, это поможет.

0 голосов
/ 08 октября 2019

Не уверен, что это то, что вы ищете, но, возможно, это поможет.

В вашем onDestroy проверьте метод действия isTaksRoot () ->, чтобы увидеть, является ли он корнем задачи. isTaskRoot docs

0 голосов
/ 08 октября 2019

используйте метод onDestroy () и напишите свой код внутри него.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...