Как остановить все сервисы, потоки, выгрузить библиотеки на Android App Kill - PullRequest
0 голосов
/ 29 августа 2018

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

Чтобы восстановить приложение с новыми настройками языка, я планирую:

  1. Сохранить выбранный язык в общих настройках.
  2. Вызовите stopService () на двух моих IntentServices.
  3. Полностью убить запущенное в данный момент приложение с ответом здесь: Как программно "перезапустить" приложение для Android?
  4. При запуске MyApplication сначала проверьте общие предпочтения и, если они содержат новый пользовательский язык, - затем очистите почти все записи в базе данных SharedPreferances, Realm.
  5. снова запустите все службы, и теперь они пойдут на сервер и получат новые данные с новыми языковыми предпочтениями.

Что я хочу понять об убийстве приложений, так это:

  1. В момент уничтожения моего текущего запущенного приложения - все мои запущенные Services, Threads, ThreadExecutors, CompositeDisposable, WorkEnqueuer, Runnables, AsyncTasks, Handlers и все эти потоки и (работающие в фоновом режиме) будут остановлены в тот же момент, что и System.exit(0) будет называться? Означает ли это, что когда я убиваю свое приложение, оно также полностью и немедленно останавливает работу всех связанных с потоками вещей?

  2. Будут ли все библиотеки, которые я использую, выгружаться из памяти, а затем, на втором этапе, будут правильно переинициализированы? Такие библиотеки как: RealmDB, Firebase, Dagger, RxJava2, Retrofit? Список библиотек и служб, которые я использую в своем проекте, приведен ниже.

  3. Будут ли все статические переменные повторно инициализированы?

Спасибо.

Вот манифест и библиотеки, которые я использую:

<application
        android:allowBackup="false"
        android:hardwareAccelerated="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:largeHeap="true"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:name=".application.MyApplication"
        android:theme="@style/AppTheme"
        tools:replace="android:allowBackup">

    <activity
            android:name=".view.activity.SplashActivity"
            android:label="@string/app_name"
            android:screenOrientation="portrait"
            android:launchMode="singleTask"
            android:theme="@style/Theme.AppCompat.Translucent">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

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

    <service android:name=".services.MyFirebaseMessagingService">
            <intent-filter>
                <action android:name="com.google.firebase.MESSAGING_EVENT" />
            </intent-filter>
        </service>

        <service android:name=".services.MyFirebaseInstanceIDService">
            <intent-filter>
                <action android:name="com.google.firebase.INSTANCE_ID_EVENT" />
            </intent-filter>
        </service>

    <receiver android:name="com.appsflyer.MultipleInstallBroadcastReceiver" android:exported="true">
            <intent-filter>
                <action android:name="com.android.vending.INSTALL_REFERRER" />
            </intent-filter>
        </receiver>

    <receiver android:name="io.branch.referral.InstallListener" android:exported="true">
            <intent-filter>
                <action android:name="com.android.vending.INSTALL_REFERRER" />
            </intent-filter>
        </receiver>

        <receiver
            android:name="com.google.android.gms.analytics.AnalyticsReceiver"
            android:enabled="true">
            <intent-filter>
                <action android:name="com.google.android.gms.analytics.ANALYTICS_DISPATCH" />
            </intent-filter>
        </receiver>


    <service
            android:name="com.google.android.gms.analytics.AnalyticsService"
            android:enabled="true"
            android:exported="false" />

        <receiver
            android:name="com.google.android.gms.measurement.AppMeasurementReceiver"
            android:enabled="true"
            android:exported="false"/>

        <receiver
            android:name="com.google.android.gms.measurement.AppMeasurementInstallReferrerReceiver"
            android:enabled="true"
            android:permission="android.permission.INSTALL_PACKAGES">
            <intent-filter>
                <action android:name="com.android.vending.INSTALL_REFERRER" />
            </intent-filter>
        </receiver>

    <service
            android:name="com.google.android.gms.measurement.AppMeasurementService"
            android:enabled="true"
            android:exported="false" />

    <service
            android:name=".services.MyIntentService"
            android:enabled="true"
            android:exported="false" />
        <service
            android:name=".services.MyJobIntentService"
            android:exported="false"
            android:permission="android.permission.BIND_JOB_SERVICE" />

</application>

Библиотека:

com.google.dagger:dagger
com.jakewharton:butterknife
io.reactivex.rxjava2:rxjava
com.github.bumptech.glide:glide
com.google.code.gson:gson
com.squareup.retrofit2:retrofit
com.facebook.android:facebook-android-sdk
com.google.android.gms:play-services-auth
com.google.firebase:firebase-core
io.realm:realm-gradle-plugin

1 Ответ

0 голосов
/ 03 сентября 2018

Если вы позвоните system.exit(), процесс ОС, на котором размещено ваше приложение, умрет. Это будет рассматриваться как «сбой приложения» и может показать диалоговое окно, указывающее это пользователю. Это не удобный способ закрыть приложение и не обычный способ сделать это на Android.

В любом случае весь ваш код перестанет работать (все потоки), все библиотеки будут выгружены, все статические переменные будут очищены, так как процесс ОС умрет, и все это исчезнет.

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