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


74

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

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



您为什么要知道他们什么时候杀死了该应用程序?如果您的应用程序编码正确,那么您真的不会在乎是否将其杀死。
npace 2014年

2
项目规范需要知道用户何时杀死了该应用程序。我不喜欢这种方法,但是我必须编写他们要求我编写的代码。
Darknoe 2014年

7
无论应用程序是否经过正确编码,您都可能想知道它何时被挂起,终止或任何其他状态更改,以供参考@npace。
Vicenç加斯科因

3
是的,您可能想知道。但这实际上是不可能的-“经过良好编码”的意思是“以不依赖于当前Android中不存在的功能的方式进行编码”
npace 2014年

Answers:


26

无法确定何时终止进程。从如何检测android应用是否已被强制停止或卸载?

当用户或系统力量停止您的应用程序时,整个过程将被简单地杀死。没有进行任何回调来通知您这已经发生。

当用户卸载应用程序时,首先将终止该过程,然后删除apk文件和数据目录,以及“软件包管理器”中的记录,这些记录告诉其他应用程序您注册了哪个意图过滤器。


11
精细。大。这不可能。那么,作为开发人员,我们将如何处理即将淘汰的应用程序呢?我的应用程式在大约30分钟的闲置状态下停用后,重新开启应用程式时出现奇怪的现象。
乔什(Josh)

134

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

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


1
@Faisal非常感谢,这非常有帮助:)
Ahmed Mostafa16年

11
我最近以类似于此处描述的方式添加了onTaskRemoved(),并且可以正常工作。HUAWEI和XIOMI设备除外。由于某些原因,从不在这些设备上调用此方法。有什么想法吗?
阿隆·明斯基

2
这很好。任何原因onTaskRemoved没有声明为替代?
Florian Doyon

1
可以在其中保存数据吗?以sqlite为例。
K.Sopheak

2
非常有帮助,但是可以使用HUWAI或XIOMI手机进行任何一项测试。按照@Alon Minski的说法
Vrajesh '18

5

创建一个应用程序类

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也会再次启动您的Application类


当app被杀死时,Application类可以检测到这一点吗?
ondermerol

如果应用程序以正常方式被杀死,我们可以检测到,这意味着内存不足或android清理应用程序进程
rajahsekar 2015年

如果它被用户杀死,那么我们无法检测到它?
ondermerol

7
我认为OP意味着如何检测Application实例是否将要停止/杀死。onTerminate适用于只是模拟环境
保罗·约翰·帕雷诺

0

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

您需要做的就是使用以下代码检查由所有活动扩展的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
         }
    }

0

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

希望这对开发人员有所帮助:)


-4

我有另一种想法。我有与您相同的问题。以上方法未解决。我的问题:“我想在用户完全关闭应用程序时清除所有已保存的数据整个应用程序”

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.