如何在不绑定服务的情况下访问服务?

时间:2013-01-01 16:40:57

标签: android service

我完成了我的Android应用程序,一个mp3播放器,但现在我遇到了一些问题,我不确定我是不对。

更简单一点,我将谈谈主要问题。

我有2个活动(节目(主要动作)和效果(均衡器,低音助推器))。

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

现在,我启动应用程序。

  1. 启动计划活动,在此活动中,我启动服务并将其绑定到控制音乐。

  2. 我启动效果活动(只需按下Program act上的按钮),在此活动中,我不绑定以前创建的服务。我只是用:

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

  3. 然后我用:

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

    我在徘徊:

    1. 为什么上面的方法可以在效果活动没有绑定的情况下起作用?

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

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

    4. 非常感谢你。

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

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

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

      3. 原始变量,即使是String,枚举类型也可以正常访问,但这不是之前启动的服务数据,即来自您创建的新对象的数据。对于对象类型,如果不在构造函数中初始化,则会发生NullPointerException。但是,您可以访问静态成员数据。

      4. 这就是我现在所理解的,当然,这可能是错的或不够的。如果你能贡献,请。

1 个答案:

答案 0 :(得分:1)

以下是一些答案:

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