繁体   English   中英

如何知道我的应用程序何时被杀死?

[英]How to know when my app has been killed?

我需要知道用户何时终止我的应用程序(强制停止)。 我一直在阅读 android 生命周期,它具有onStop()onDestroy()函数,这些与用户在我的应用程序上结束的每个活动有关,但与用户强制停止或终止我的应用程序时无关。

有什么方法可以知道用户何时终止应用程序?

我找到了一种方法来做到这一点......

  1. 做这样的一项服务

    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(); } }
  2. 像这样在 Manifest.xml 中注册这个服务

    <service android:name="com.example.OnClearFromRecentService" android:stopWithTask="false" />
  3. 然后在您的启动活动中启动此服务

    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.

即使您被应用程序杀死或强制停止,Android 也会再次启动您的应用程序类

在深入研究这个问题后,我找到了一个可能对你有帮助的解决方案:

您需要做的就是使用以下代码检查由您的所有活动扩展的 BaseActivity 的 onDestroy 方法,无论堆栈的最后一个运行活动是否来自您的包:

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
         }
    }

在某些情况下,您可以创建启动画面页面来确定应用程序之前是否已被系统杀死。

它基本上是一个带有意图过滤器主/启动器的屏幕,将完成,更改为主要活动。

所以,每次用户访问splashScreen时,都显示该应用程序之前已被杀死,您可以做任何您想做的事情。

我找到了一种可以检测 app kill 的方法:使用 ActivityLifecycleCallbacks 来计算活动活跃数

有几种情况:

  • 对于用户 kill(使用 App 切换器):计数器活动编号/任务堆栈等
  • (未指定)Android 框架终止(低 Memory 等):
  • (unspecify)for Native kill(Process.kill kill signal):使用native
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")

            }
        }

    })
}

这可能对许多想知道应用程序是否终止的人有所帮助 最好的方法是将数据保存在一个静态变量中,例如: public static string IsAppAvailable;

静态变量的特点是静态变量中的数据包含直到应用程序在前台或后台,一旦应用程序被杀死,静态变量中的数据将被删除。 基本上,新创建的应用程序时会重新初始化静态变量

创建一个静态类文件,比如Const

namespace YourProject
{
    public static class Const
    {
        public static string IsAppAvailable;
     }
}

在主活动中

   protected override void OnResume()
    {
       if(string.IsNullOrWhiteSpace(Const.IsAppAvailable))
       {
          //Your app was terminated
       }
       Const.IsAppAvailable = "Available" 
    }

希望这对开发人员有帮助:) 快乐编码

我发现了一些对我有用的东西(在小米中),你必须制作一个 class 例如“MyObserver”,并在你的创建中调用它,如下所示: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
    }
}

您始终可以使用此代码:

protected void onCreate(Bundle savedInstanceState) {
//...
Thread.setDefaultUncaughtExceptionHandler(new UncaughtExceptionHandler() {
        @Override
        public void uncaughtException(Thread thread, Throwable ex) {
        //inform yourself that the activity unexpectedly stopped
        //or
        YourActivity.this.finish();
        }
    });
//...
}

我有替代想法。我有和你一样的问题。上述方法无法解决。我的问题:“当用户完全关闭应用程序时,我想清除整个应用程序的所有保存数据”

因此,我在 Application 类中添加了 clear() 和清除保存的数据(来自共享首选项或 tinyDB)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM