我如何检测我的android应用程序是否被销毁/暂停/停止



我想根据应用程序是否运行来更新用户活动状态(联机/脱机(。为此,我使用LifecycleEventObserver来观察应用程序文件内的生命周期

@Override
public void onStateChanged(@NonNull LifecycleOwner source, @NonNull Lifecycle.Event event) {
Log.e("onStateChanged", "Lifecycle.Event : " + event.name());
switch (event.name()) {
case "ON_START":
case "ON_RESUME":
setStatus(true);
break;
case "ON_STOP":
case "ON_PAUSE":
setStatus(false);
break;
}
}

如Gif文件所示,它在愉快的流程中运行良好(当切换到最近的应用程序时,它会在onStateChanged内记录生命周期事件ON_PAUSE、ON_STOP(。

  • 问题案例:

但我发现了一种情况,应用程序无法观察到应用程序何时停止运行。如Gif文件所示(当切换到最近的应用程序,用户从最近的应用中快速杀死应用程序时,它没有机会观察生命周期事件。因此,它无法在onStateChanged内记录生命周期事件ON_PAUSE、ON_STOP(。

我也尝试过DefaultLifecycleObserver,但它的行为也一样。

@Override
public void onStart(@NonNull LifecycleOwner owner) {
Log.e("Globals", "onStart");
setStatus(true);
}
@Override
public void onCreate(@NonNull LifecycleOwner owner) {
Log.e("Globals", "onCreate");
}
@Override
public void onResume(@NonNull LifecycleOwner owner) {
Log.e("Globals", "onResume");
setStatus(true);
}
@Override
public void onPause(@NonNull LifecycleOwner owner) {
Log.e("Globals", "onPause");
setStatus(false);
}
@Override
public void onStop(@NonNull LifecycleOwner owner) {
Log.e("Globals", "onStop");
setStatus(false);
}
@Override
public void onDestroy(@NonNull LifecycleOwner owner) {
Log.e("Globals", "onDestroy");
setStatus(false);
}

不幸的是,这种行为是故意的。当用户从Recents菜单中杀死应用程序时,这与从手机设置中强制停止应用程序相同——这并不意味着优雅,也不调用通常的生命周期方法。

但在试图检测应用程序是否真的在运行这一更广泛的主题上,你可以实现一个";心跳;应用程序定期发送的信号(要么发送到网络服务器,要么发送到另一个应用程序(。如果心跳信号停止接收,则该应用程序已关闭

最新更新