大家好,我有一个几乎完全完整的应用程序。它是一个音乐播放器。它播放服务中的音乐。
当我按下后退按钮时,启动服务的活动明显被破坏。(我希望活动被销毁,以便用户可以导航其他活动。我告诉这个的原因是因为singleton | singleinstance等不会解决我的问题)但我不知道如何从通知中重新创建活动。 此外,当启动服务的活动可见(而不是销毁)时,如果我点击通知,我的应用程序也会意外停止。因此我有两个问题需要解决。
我正在使用一个全局变量,这是一个列表,因此我不认为我需要在销毁之前保存数据。我想我知道如何恢复和重新创建活动状态的概念,但我想我是不完全清楚它是如何完成的。我不确定活动状态应该在哪种方法中恢复以及如何恢复?还有我在onCreate方法中启动服务。我应该把它改成其他方法吗?可以在恢复活动时启动onCreate中的服务会出现问题吗?
额外注释:全局变量在整个应用程序中都可用,并且独立于单个活动,因为它们扩展了应用程序。而且Bundle只会在活动被销毁时提供帮助当按下后退按钮时,我们明确地销毁了活动,因此数据无法保存到包中,因为onSaveInstanceState永远不会被活动调用。
答案 0 :(得分:0)
如果数据一致并反映在服务中,则需要bind to the Service并从IBinder获取数据(可以包装Service对象)。我个人更喜欢这种方法,因为我根本不喜欢覆盖Application
。
另一种方法是通过SharedPreferences保存数据。将其保存为onPause()
中的活动状态,然后在onCreate()
中恢复。假设您没有保存数百个项目,那么开销非常低。这应仅用于反映活动本身状态的数据。
答案 1 :(得分:0)
您可以根据活动生命周期来播放和停止播放器 OnPause - 你应该调用player.stop() onresume你应该打电话给和 ondestroy你需要释放你的播放器实例。
调用服务中的一个线程以从服务器获取数据,以便它能顺利运行。
您应该通过调用release或reset来释放mediaplayer实例。
您可以在通知中使用待处理意图,这样当您看到通知时,您就可以打开您在活动中提到的活动。
答案 2 :(得分:-1)
应在onCreate中恢复活动状态。 onCreate方法获取Bundle as参数,该参数包含键值对数据。如果此参数为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
}
请注意,这一切都适用于系统自动销毁您的应用程序的情况。 (例如,当前台中的其他应用程序耗尽内存时。)此机制是将您的活动恢复到用户上次看到它的状态。