gpt4 book ai didi

java - 当应用程序被杀死然后重新启动时,Android 服务(在它自己的线程中)死亡

转载 作者:行者123 更新时间:2023-12-02 04:44:30 31 4
gpt4 key购买 nike

几周来我一直在为这个问题苦苦挣扎。我对 Android 还很陌生,希望您能帮助我。

我有这个服务,它运行在与应用程序不同的线程上。本质上,用户指示它启动,并且它应该保持 Activity 状态,直到用户告诉它停止或直到它达到其目的 - 它在需要时安排自己的销毁(停止)。该服务需要保持 Activity 状态,因为它包含重要的优先级相关信息,因此我不能简单地求助于警报管理器在需要时恢复它 - 尽管我确实将警报管理器用于其他目的。我有两个问题:

  • 首先,当用户关闭应用程序(通过按住中间按钮并关闭应用程序)时,服务会被销毁,这意味着我会丢失数据(我假设它会在自动重新启动时被销毁)。
  • 其次,它会自行重新启动,从而导致数据重新加载,因此我丢失了数据。

对于activity来说,它通过以下方式绑定(bind)到服务器:

private void startService() {
startService(new Intent(this, CES.class));
bindService(new Intent(this, CES.class), mConnection, 0);
}

最后,服务中的相关(或至少是我认为相关的)方法:

private final IBinder mBinder = new ICESInterface.Stub() { ..... }
@Override
public void onCreate() {
//keeps being called thus I lose my data }
@Override
public IBinder onBind(Intent intent) {
return mBinder;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return super.onStartCommand(intent,flags,startId);
//return START_STICKY;
}

如果您需要更多数据/信息,请告诉我。

最佳答案

通过在 onBind 中返回 Binder ,您将创建一个绑定(bind)服务,这意味着它“绑定(bind)”到您的应用。这意味着当您的应用程序这样做时它会被破坏,这解释了主页按钮的破坏。对于后台服务,您应该返回 null

@Override
public void onCreate() {
//keeps being called thus I lose my data
}
@Override
public IBinder onBind(Intent intent) {
return null;
}

您应该使用 START_STICKY 启动您的服务标志,这样如果操作系统在资源不足时破坏了您的服务,它稍后会重新创建它。

在销毁您的服务之前,Android 会调用 public void onLowMemory(),保存您需要的任何数据,以便当它重新启动您的服务时,您将能够再次执行您的任务。

编辑:根据您的评论,您希望有一个在后台运行且允许绑定(bind)的服务。如果您在进行任何 bindService() 调用之前调用 startService() 方法,您就可以做到这一点...这将有效地使您的服务成为启动服务而不是绑定(bind)服务。在这种情况下,您可以返回一个 IBInder 并绑定(bind)到它。

有一篇非常非常好的文章 HERE

关于java - 当应用程序被杀死然后重新启动时,Android 服务(在它自己的线程中)死亡,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29781760/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com