处理活动和服务生命周期

Posted

技术标签:

【中文标题】处理活动和服务生命周期【英文标题】:Handling the Activity and Service Lifecycle 【发布时间】:2019-09-11 20:59:09 【问题描述】:

我正在开发一个应用程序,它将在 JobIntentService 中执行一些后台功能。

用户从屏幕 A 启动操作。后台 Intent 服务启动。 Intent 服务完成其工作后,它会向 Screen A 发送回调,然后向 Screen Sartes Screen B 发送回调,后者利用 Intent Service 的结果。

我的问题是,假设用户启动操作,然后最小化应用程序,然后 android 操作系统由于内存不足而清除屏幕 A,然后服务发回回调。

我的问题是,既然屏幕 A 不再存在,它会收到回调吗?是否可以确定必须由Android OS清除屏幕A,以便我的服务可以直接启动屏幕B?

另外,如何处理这种情况?

任何建议将不胜感激。

【问题讨论】:

【参考方案1】:

更好的方法是创建一个独立的广播接收器。这确保您的应用程序可以响应广播,无论服务是否正在运行。在这种情况下,您可以检查服务活动是否仍然存在。然后做出决定。

将以下方法与您的包名称一起使用。如果您的任何活动在前台,它将返回 true。

public boolean isForeground(String myPackage) 
    ActivityManager manager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
    List<ActivityManager.RunningTaskInfo> runningTaskInfo = manager.getRunningTasks(1); 
    ComponentName componentInfo = runningTaskInfo.get(0).topActivity;
    return componentInfo.getPackageName().equals(myPackage);

【讨论】:

你打败了我。我打算推荐一个 BroadcastReceiver。 一个很好的答案。谢谢!我只有几个问题。假设 Android 操作系统清除了我的屏幕,并且在我的服务结束后我该怎么办?如何将用户带到新屏幕?我的服务可以启动屏幕吗?还是我必须等待用户返回我的应用程序,当他回来时,我应该检查新屏幕是否已向他显示,如果没有,我应该向他显示?还有一件事我应该如何保存服务的结果? 是的,您可以从服务开始活动。对于少量数据,请将其保存在 sharedpreference 中。 感谢您的回答。我已经接受它作为正确答案。【参考方案2】:

另外,如何处理这种情况?

你可以通过后台任务的重要性来解决这个问题。

如果您认为您的后台任务对于通知用户很重要,那么 后台工作完成后,您可以创建 Notification。因此您的用户将获得您的任务的更新。您可以将结果数据设置为 Intent 并在单击通知后启动屏幕 B。

如果通知用户不重要,您可以save 后台任务结果,当用户返回您的应用程序时,您可以将用户发送到屏幕 B。

编辑:

我认为当您的 Activity 在后台并被系统杀死时,从后台服务启动 Activity 不是很好的 UX。因为那时用户可能正在其他应用程序上执行一些重要任务(游戏、在线流媒体等)。这会给用户带来糟糕的用户体验。

【讨论】:

感谢您的回答。但是如何检查 Android 操作系统是否已经杀死了我的活动? 很难检测到您的Activity 已被操作系统杀死。检查这个答案***.com/a/5226993/1292557 你可以试试这个***.com/a/34304730/1292557来检测Activity被Service销毁 感谢通知和缓存任务的想法。对不起!因为另一个答案似乎通过使用广播提供了一个解决方案,所以我接受了:)。

以上是关于处理活动和服务生命周期的主要内容,如果未能解决你的问题,请参考以下文章

如何在不使用常规活动生命周期事件的情况下检测/拦截应用程序生命周期事件

应用程序和服务的 Android 生命周期 [重复]

Android应用程序/进程的生命周期?

登录/重试失败时的 Google Play 游戏服务怪异(活动生命周期)

活动的生命周期系列活动栈的生命周期

Spring之Bean生命周期BeanPost处理