如何在 android app kill 上停止所有服务、线程、卸载库
How to stop all services, threads, unload libraries on android app kill
我想让用户能够选择应用程序 UI 的语言和不同语言的内容。
我想使用用户 select.
的新语言从服务器重新加载新的本地化数据
要使用新的语言设置重新创建应用程序,我计划:
- 将 select 编辑的语言保存到共享首选项。
- 对我的两个 IntentService 调用 stopService()。
- 完全杀死当前 运行 应用程序,答案来自这里:How do I programmatically "restart" an Android app?
- 在 MyApplication 启动时,首先检查共享首选项以及它们是否包含新的用户语言 - 然后清除 SharedPreferances、Realm 数据库中的几乎所有记录。
- 再次启动所有服务,现在它们将转到服务器并使用新语言首选项获取新数据。
关于查杀我想了解的是:
在杀死我当前的 运行 应用程序的那一刻 - 我所有的 运行 Services, Threads, ThreadExecutors, CompositeDisposable, WorkEnqueuer, Runnables, AsyncTasks, Handlers
和所有线程和(工作在后台)东西会在System.exit(0)
被调用的同时停止?这是否意味着当我终止我的应用程序时,它也会立即完全停止所有与线程相关的工作?
是否会从内存中卸载我使用的所有库,然后在第二次启动时正确地重新初始化?这样的图书馆如:RealmDB, Firebase, Dagger, RxJava2, Retrofit
?下面列出了我在项目中使用的库和服务列表。
是否会重新初始化所有静态变量?
谢谢。
这是我使用的清单和库:
<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
如果您调用 system.exit()
,托管您的应用程序的 OS 进程将会终止。这将被视为 "application crash" 并且可能会显示一个对话框,向用户表明这一点。这不是关闭应用程序的用户友好方式,也不是在 Android.
上执行此操作的常用方式
在任何情况下,您的所有代码都将停止 运行(所有线程),所有库都将被卸载,所有静态变量都将被清除,因为 OS 进程将终止,所有这些都将结束走开。
我想让用户能够选择应用程序 UI 的语言和不同语言的内容。 我想使用用户 select.
的新语言从服务器重新加载新的本地化数据要使用新的语言设置重新创建应用程序,我计划:
- 将 select 编辑的语言保存到共享首选项。
- 对我的两个 IntentService 调用 stopService()。
- 完全杀死当前 运行 应用程序,答案来自这里:How do I programmatically "restart" an Android app?
- 在 MyApplication 启动时,首先检查共享首选项以及它们是否包含新的用户语言 - 然后清除 SharedPreferances、Realm 数据库中的几乎所有记录。
- 再次启动所有服务,现在它们将转到服务器并使用新语言首选项获取新数据。
关于查杀我想了解的是:
在杀死我当前的 运行 应用程序的那一刻 - 我所有的 运行
Services, Threads, ThreadExecutors, CompositeDisposable, WorkEnqueuer, Runnables, AsyncTasks, Handlers
和所有线程和(工作在后台)东西会在System.exit(0)
被调用的同时停止?这是否意味着当我终止我的应用程序时,它也会立即完全停止所有与线程相关的工作?是否会从内存中卸载我使用的所有库,然后在第二次启动时正确地重新初始化?这样的图书馆如:
RealmDB, Firebase, Dagger, RxJava2, Retrofit
?下面列出了我在项目中使用的库和服务列表。是否会重新初始化所有静态变量?
谢谢。
这是我使用的清单和库:
<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
如果您调用 system.exit()
,托管您的应用程序的 OS 进程将会终止。这将被视为 "application crash" 并且可能会显示一个对话框,向用户表明这一点。这不是关闭应用程序的用户友好方式,也不是在 Android.
在任何情况下,您的所有代码都将停止 运行(所有线程),所有库都将被卸载,所有静态变量都将被清除,因为 OS 进程将终止,所有这些都将结束走开。