我需要知道用户何时结束我的应用程序(强制停止)。 我一直在阅读Android生命周期,其中包括onStop()
和onDestroy()
函数,这些与用户在我的应用程序上结束的每个活动相关,但不是当用户强制停止或终止我的应用程序时。
有没有办法知道用户何时杀死应用程序?
我需要知道用户何时结束我的应用程序(强制停止)。 我一直在阅读Android生命周期,其中包括onStop()
和onDestroy()
函数,这些与用户在我的应用程序上结束的每个活动相关,但不是当用户强制停止或终止我的应用程序时。
有没有办法知道用户何时杀死应用程序?
我已经找到一种方法来完成这个......
创建一个像这样的服务
public class OnClearFromRecentService extends Service {
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.d("ClearFromRecentService", "Service Started");
return START_NOT_STICKY;
}
@Override
public void onDestroy() {
super.onDestroy();
Log.d("ClearFromRecentService", "Service Destroyed");
}
@Override
public void onTaskRemoved(Intent rootIntent) {
Log.e("ClearFromRecentService", "END");
//Code here
stopSelf();
}
}
将此服务在Manifest.xml中注册,如下所示
<service android:name="com.example.OnClearFromRecentService" android:stopWithTask="false" />
然后在你的启动页活动上启动此服务。startService(new Intent(getBaseContext(), OnClearFromRecentService.class));
现在,每当您从Android最近的应用程序中清除您的应用程序时,那么这个方法 onTaskRemoved()
将会被执行。
注意:在Android O+中,此解决方案仅在应用程序全时在前台运行时有效。在超过1分钟的后台运行后,OnClearFromRecentService(以及所有其他正在运行的服务)将被系统自动强制停止,因此不会执行onTaskRemoved()方法。
无法确定进程何时被终止。 来自如何检测Android应用程序是否被强制停止或卸载?。
当用户或系统强制停止您的应用程序时,整个进程会被简单地终止。没有回调通知您发生了这种情况。
当用户卸载应用程序时,首先终止进程,然后删除您的apk文件和数据目录,以及包管理器中的记录,告诉其他应用程序您已注册哪些意图过滤器。
onCreate()
Called when the application is starting, before any activity, service, or receiver objects (excluding content providers) have been created.
onLowMemory()
This is called when the overall system is running low on memory, and actively running processes should trim their memory usage.
onTerminate()
This method is for use in emulated process environments.
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="id.gits.yourpackage">
<application
android:name=".App">
<activity android:name=".SplashActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
SplashActivity:
class SplashActivity : AppCompatActivity() {
override fun onCreate() {
super.onCreate()
doSomethingAfterAppKilled()
}
}
ActivityManager activityManager = (ActivityManager) getSystemService( ACTIVITY_SERVICE );
List<ActivityManager.RunningTaskInfo> taskList = activityManager.getRunningTasks( 10 );
if ( !taskList.isEmpty() )
{
ActivityManager.RunningTaskInfo runningTaskInfo = taskList.get( 0 );
if ( runningTaskInfo.topActivity != null &&
!runningTaskInfo.topActivity.getClassName().contains(
"com.my.app.package.name" ) )
{
//You are App is being killed so here you can add some code
}
}
class StarterApplication: android.app.Application() {
var counterActivityCreate = 0
override fun onCreate() {
super.onCreate()
Log.d(TAG, "onCreate: ")
registerActivityLifecycleCallbacks(object: android.app.Application.ActivityLifecycleCallbacks{
override fun onActivityCreated(activity: android.app.Activity, savedInstanceState: android.os.Bundle?) {
Log.d(TAG, "onActivityCreated: ${activity.javaClass.name}")
counterActivityCreate++
}
override fun onActivityStarted(activity: android.app.Activity) {
Log.d(TAG, "onActivityStarted: ${activity.javaClass.name}")
}
override fun onActivityResumed(activity: android.app.Activity) {
Log.d(TAG, "onActivityResumed: ${activity.javaClass.name}")
}
override fun onActivityPaused(activity: android.app.Activity) {
Log.d(TAG, "onActivityPaused: ${activity.javaClass.name}")
}
override fun onActivityStopped(activity: android.app.Activity) {
Log.d(TAG, "onActivityStopped: ${activity.javaClass.name}")
}
override fun onActivitySaveInstanceState(activity: android.app.Activity, outState: android.os.Bundle) {
Log.d(TAG, "onActivitySaveInstanceState: ${activity.javaClass.name}")
}
override fun onActivityDestroyed(activity: android.app.Activity) {
Log.d(TAG, "onActivityDestroyed: ${activity.javaClass.name}")
counterActivityCreate--
if(counterActivityCreate == 0){
Log.d(TAG, "onActivityDestroyed: all activity destroyed")
}
}
})
}
我找到了适用于小米手机的解决方案,你需要创建一个类,例如"MyObserver",并在onCreate方法中调用它,代码如下:getLifecycle().addObserver(MyObserver(this))。
class MyObserver(var context: Context) : LifecycleObserver {
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
fun disconnect() {
Log.e("APP", "killed")
}
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
fun pause(){
Log.e("APP","Paused") //para pausa
}
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
fun resume(){
Log.e("APP","Resumed") //para retorno de pausa
}
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
fun stop(){
Log.e("APP","Stopped") // para cambio de actividad
}
}
这可能会帮助许多人,他们想知道应用程序是否已终止
最好的方法是将数据保存在一个静态变量中
例如:public static string IsAppAvailable;
静态变量的特殊之处在于,静态变量中的数据在应用程序在前台或后台时都会保留,一旦应用程序被杀死,静态变量中的数据就会被清除。基本上,当应用程序重新创建时,静态变量会被重新初始化。
创建一个静态类文件,比如Const
namespace YourProject
{
public static class Const
{
public static string IsAppAvailable;
}
}
在MainActivity中
protected override void OnResume()
{
if(string.IsNullOrWhiteSpace(Const.IsAppAvailable))
{
//Your app was terminated
}
Const.IsAppAvailable = "Available"
}
希望对开发人员有所帮助 :) 愉快编码
我有一个替代的想法。我和你一样遇到了同样的问题,上面的方法都没有解决我的问题:“当用户完全关闭应用程序时,我想清除整个应用程序中保存的所有数据”。
因此,我在Application类中添加了clear()和clear saved data(从shared preference或tinyDB中)。