0

我完成了我的 android 应用程序,一个 mp3 播放器,但现在我有一些问题,我不确定我是否正确。

为了更简单,我将只谈谈主要问题。

我有 2 个活动(程序(主要行为)和效果(用于均衡器、低音增强器))。

我有一个名为 ServicePlayer 的服务,用于播放音乐(使用 Mediaplayer)

现在,我启动应用程序。

  1. 程序活动启动,在这个活动中,我启动服务并绑定它来控制音乐。

  2. 我启动了效果活动(只需按下程序动作上的按钮),在此活动中,我不绑定到之前创建的服务。我只是使用:

    ServicePlayer mSer = new ServicePlayer();* 注意:我没有在 ServicePlayer 类中定义任何构造函数,只使用默认构造函数(因此,在创建新的 servicelayer 对象时没有初始化变量)。

然后我使用:

mSer.stop()// method to stop music in serviceplayer ( just call mediaplayer object to stop)

我在徘徊:

  1. 为什么上面的方法可以工作,而效果活动没有绑定到它?

  2. 代码行 (*) 是否创建了 serviceplayer 的新对象?如果是,那么有 2 个可以播放音乐的 serviceplayer 对象?如果没有,那么第一次只创建了1个serviceplayer对象,然后,在下一个回调中,没有创建新的服务,只是使用之前创建的服务?

  3. 如何在不绑定的情况下访问 serviceplayer 类的数据?实际上,我可以这样做,但我不知道为什么,因为没有初始化 serviceplayer 的变量(请参见上面的 (*) 行。

太感谢了。

更新答案,感谢 Snicolas 的帮助:

  1. 因为方法 stop() 将停止一个静态对象媒体播放器。(注:静态成员)。如果它不是静态成员,您将收到 NullPointerException。

  2. 是的,它创建了一个新对象,但不是一个新服务。只有 1 和 1 个服务(当然是同一个服务)可以启动,当一个服务启动时,下一个 startService 或 bindService 方法回调不会创建新的服务。只需使用旧服务。

  3. 原始变量,甚至String,枚举类型都可以正常访问,但那不是之前启动的服务的数据,而是你创建的新对象的数据。对于对象类型,如果你不在构造函数中初始化,就会发生 NullPointerException。但是,您可以访问静态成员数据。

这就是我现在所理解的,所以当然,它可能是错误的,也可能是不够的。如果你能贡献,请。

4

1 回答 1

1

以下是一些答案:

  1. 如果您的媒体播放器是静态的,那么它将由您的所有 ServicePlayer 实例共享。但请阅读第 2 点以了解更多信息。
  2. 当你使用new时,你只是创建了服务,但它是一个简单的java对象,而不是术语android含义中的服务:它不是由系统启动的,没有系统管理的生命周期,无法绑定, 无法正常启动和停止。但在 Android 中也不例外:每个 new 都会创建一个新对象。因此,程序活动将正确启动您的服务的一个实例,而第二个实例仅像 POJO 一样实例化。
  3. 我不明白。只需从您的第二个活动绑定到您的服务即可。
于 2013-01-01T16:52:08.537 回答