Android 销毁后恢复活动?(活动生命周期)需要帮助

Android 销毁后恢复活动?(活动生命周期)需要帮助,android,android-lifecycle,Android,Android Lifecycle,嗨,伙计们,我有一个几乎完全完整的应用程序。它是一个音乐播放器。它播放服务中的音乐 当我按下后退按钮时,启动服务的活动显然已被销毁。(我希望该活动被销毁,以便用户可以导航其他活动。我之所以这样说,是因为singleton | singleinstance等无法解决我的问题)但我不知道如何从通知中重新创建活动。 此外,当启动服务的活动可见(且未被破坏)时,如果我单击通知,我的应用程序也会意外停止。因此,我有两个问题需要解决 我使用的是一个全局变量,它是一个列表,因此我认为我不需要在销毁之前保存数据

嗨,伙计们,我有一个几乎完全完整的应用程序。它是一个音乐播放器。它播放服务中的音乐

当我按下后退按钮时,启动服务的活动显然已被销毁。(我希望该活动被销毁,以便用户可以导航其他活动。我之所以这样说,是因为singleton | singleinstance等无法解决我的问题)但我不知道如何从通知中重新创建活动。 此外,当启动服务的活动可见(且未被破坏)时,如果我单击通知,我的应用程序也会意外停止。因此,我有两个问题需要解决

我使用的是一个全局变量,它是一个列表,因此我认为我不需要在销毁之前保存数据。我认为我知道如何恢复和重新创建活动状态的概念,但我认为我不完全知道如何进行。我不确定应使用哪种方法恢复活动状态以及如何恢复活动状态??我也不知道我正在onCreate方法中启动服务。是否应将其更改为其他方法?在还原活动时,在onCreate中启动服务是否会出现问题


额外说明:全局变量在整个应用程序中都可用,并且独立于单个活动,当它们扩展应用程序时
。捆绑包也只有在系统销毁活动时才有帮助。当按下后退按钮时,我们明确销毁活动,因此数据无法保存到捆绑包中,因为活动从未调用onSaveInstanceState。

活动状态应在onCreate中恢复。onCreate方法获取一个Bundle作为参数,其中包含数据的键值对。如果此参数为null,则表示未保存以前的状态。只需检查它是否为null,并在必要时恢复:

@Override
public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);

  setContentView(...);
  ...

  if(savedInstanceState!=null) {
    // Restore activity state based on saved data!
  }
}
当然,如果要在恢复时使用数据,则需要保存数据。系统自动调用活动的onSaveInstance状态方法,您可以在其中将数据放入捆绑包

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
  savedInstanceState.putInt("key", value); // Store data
}

请注意,这一切都适用于系统自动销毁您的应用程序的情况。(例如,当前台的其他应用程序内存不足时。)此机制用于将您的活动恢复到用户上次看到它时的状态。

如果数据一致并与服务反映,则您需要从IBinder(可以包装服务对象)中获取数据。一、 就个人而言,我更喜欢这种方法,因为我只是不喜欢覆盖
应用程序


另一种方法是通过保存数据。在
onPause()
中将其保存为您的活动状态,并在
onCreate()中还原。假设您没有保存数百个项目,则开销非常低。这只能用于反映活动本身状态的数据。

您可以根据活动生命周期播放和停止播放机,如 OnPause-您应该呼叫player.stop() 在恢复时,你应该打电话给play and ondestroy您需要释放您的播放器实例

调用服务中的线程从服务器获取数据,以便它能够顺利工作

您应该通过调用release或reset来释放mediaplayer实例


您可以在通知中使用Pending intent,这样当您看到通知时,您就可以打开Pending intent中提到的任何活动。

我认为您不知道全局变量……它们在整个应用程序中都是可用的,并且独立于单个活动。此外,捆绑包仅在活动被激活时才有帮助已被系统销毁。当按下“上一步”按钮时,我们会显式销毁活动,因此数据无法保存到捆绑包中,因为活动从未调用onSaveInstanceState。为什么要进行“下一步”表决?您试图在活动中恢复的状态是什么,列表?什么?@funkthemank我在回答这个问题时真的不知道这些信息有什么用处。顺便说一下,这是我创建的一个类的列表。我真的不认为我会绑定服务。我正在使用广播接收器进行通信……你能告诉我应该用什么方法恢复活动吗???您正在使用广播接收器进行通信,但如果要恢复活动以反映服务状态(例如歌曲的位置),则绑定是最好的方式。它不需要依赖接收器来激活,它更容易遵循代码,通信也更快。谢谢你,但是扩展应用程序类可能会有什么问题???我发现这更容易,所以你能告诉我下一步应该如何恢复活动吗?我可以给你我的apk来检查真正的问题吗???(如果你有时间的话)?只是它用方法封装了数据,这样你就可以在其他地方重用服务。从应用程序类中删除依赖项。但是,如果数据已经存在于应用程序中,并且您在onCreate(或anywhere)中的活动中从应用程序中获取数据,则它将强制关闭,以便使用其他方法。这不是杀死它的东西。