【问题标题】:How to know when my app has been killed?如何知道我的应用程序何时被杀死?
【发布时间】:2014-01-29 04:35:37
【问题描述】:

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

有什么方法可以知道用户何时杀死了应用程序?

【问题讨论】:

  • 为什么你需要知道他们什么时候杀死应用程序?如果您的应用程序编码良好,那么您真的不会在意他们是否将其杀死。
  • 项目规范需要知道用户何时终止此应用程序。我不喜欢这种方法,但我必须按照他们的要求编写代码。
  • 无论应用程序是否编码良好,您都可能想知道它何时被暂停、终止或任何其他状态更改以供参考@npace。
  • 是的,您可能想知道。但这实际上是不可能的——我所说的“编码良好”是指“以一种不依赖于目前 Android 中不存在的功能的方式进行编码”

标签: android android-lifecycle


【解决方案1】:

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

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

所以,每次用户访问splashScreen,都表明该应用之前已经被杀死,你可以做任何你想做的事情。

【讨论】:

    【解决方案2】:

    这可能对许多想知道应用程序是否终止的人有所帮助 最好的方法是将数据保存在一个静态变量中 例如: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" 
        }
    

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

    【讨论】:

    • 那么如何检测 const 值何时被冻结?
    【解决方案3】:

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

    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()。

    【讨论】:

    • @Faisal 非常感谢,这非常有帮助:)
    • 我最近以类似于此处描述的方式添加了 onTaskRemoved() 并且它有效。华为和小米设备除外。出于某种原因,这些设备上永远不会调用此方法。任何想法为什么?
    • 这很好用。没有将 onTaskRemoved 声明为覆盖的任何原因?
    • 是否可以在其中保存数据?以 sqlite 为例。
    • 非常有帮助,但是用HUWAI或XIOMI手机任何一个测试。正如@Alon Minski 所说
    【解决方案4】:

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

    您需要做的就是使用以下代码检查您的 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
             }
        }
    

    【讨论】:

      【解决方案5】:

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

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

      【讨论】:

        【解决方案6】:

        创建一个应用程序类

        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 也会再次启动您的应用程序类

        【讨论】:

        • 当app被杀死时,Application类能检测到吗?
        • 如果应用程序以正常方式被杀死,我们可以检测到,意味着由于内存不足或android清理应用程序进程
        • 如果是被用户杀死的,那我们检测不到?
        • 我认为 OP 的意思是如何检测应用程序实例是否即将停止/终止。 onTerminate 仅适用于模拟环境
        【解决方案7】:

        无法确定进程何时被终止。 来自How to detect if android app is force stopped or uninstalled?

        当用户或系统强制停止您的应用程序时,整个 进程被简单地杀死。没有回调通知您 这已经发生了。

        当用户卸载应用程序时,首先进程被杀死,然后 您的 apk 文件和数据目录连同记录一起被删除 在包管理器中告诉其他应用您使用了哪些意图过滤器 已注册。

        【讨论】:

        • 很好。伟大的。这不可能。那么作为开发人员,我们可以做些什么来预测应用程序被杀死呢?我的应用在大约 30 分钟处于非活动状态后重新打开时出现了奇怪的行为。
        猜你喜欢
        • 1970-01-01
        • 2021-11-24
        • 1970-01-01
        • 2020-03-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-25
        • 2021-09-21
        相关资源
        最近更新 更多