处理活动和服务生命周期
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销毁
感谢通知和缓存任务的想法。对不起!因为另一个答案似乎通过使用广播提供了一个解决方案,所以我接受了:)。以上是关于处理活动和服务生命周期的主要内容,如果未能解决你的问题,请参考以下文章
如何在不使用常规活动生命周期事件的情况下检测/拦截应用程序生命周期事件