【问题标题】:Music player without service?没有服务的音乐播放器?
【发布时间】:2012-06-07 04:38:01
【问题描述】:

我正在开发一个在线 mp3 播放器,一开始我决定不使用 Service - 因为要传递大量数据:使用 AIDL 变得非常复杂。相反,我让 Player 作为全局单例。该应用程序几乎完成了,一切正常(即使屏幕关闭也会播放音乐)-但有时整个过程都被杀死了!

所以我试图通过在音乐开始时启动本地虚拟服务(例如:DummyService)来“欺骗”操作系统,并在音乐停止时停止 DummyService。但这并没有多大帮助,该过程仍然经常被杀死:(。

恕我直言,如果我的应用程序进程有一个“正在运行”的服务——它将有更好的机会不被安卓操作系统杀死。而且 DummyService 与托管 MediaPlayer 的 Service 并没有太大区别 - 因为 MediaPlayer 也不在 UI 线程上播放(调用 Service 时的默认线程)。

所以问题是:我的播放器(全局静态播放器 + DummyService)和被服务包装的播放器之间有什么区别(例如:这里是 MusicDroid http://www.helloandroid.com/tutorials/musicdroid-audio-player-part-ii

感谢您的关注, 范雄山

【问题讨论】:

    标签: android


    【解决方案1】:

    您的问题将是单例实现。你可以阅读很多关于它是否适合 DalvikVM 的争论。这是一个为什么不是的例子。 Dalvik GC 会吃掉你的 Singleton,你需要另一种实现。

    【讨论】:

      【解决方案2】:

      以你的答案为提示,我又搜索了一遍,在网上找到了一些好东西,就在这里(关于 Singleton-Activity-Service 生命周期):

      http://www.2linessoftware.com/2010/08/03/singletons-and-services-and-shutdowns-oh-my/

      这里有很好的相关答案:

      Singletons vs. Application Context in Android?

      我一直在玩 Singleton,发现答案并不完全正确。我试图在活动 A 中创建单例 S,然后转到活动 B(在离开 A 之前,我调用了 A.finish() ,并在 B.onCreate() 中调用 System.gc()) - 但是 S.finalize( ) 不叫!

      代码如下:

      public class FirstAct extends Activity implements OnClickListener {
      
          public static final String TAG = "Test_Service";
          private View btChange;
      
          /** Called when the activity is first created. */
          @Override
          public void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              System.gc();
              setContentView(R.layout.first_lay);
              btChange = findViewById(R.id.btChange);
              btChange.setOnClickListener(this);
              SomeSingleton.getInstance();
          }
      
          @Override
          public void onClick(View v) {
              Intent i = new Intent(this,SecAct.class);
              startActivity(i);
              this.finish();
          }
      
          @Override
          protected void onDestroy() {
              Log.i(TAG,"First activity is destroyed !");     
              super.onDestroy();
              System.gc();
          }
      
      }
      

      第二个活动:

      public class SecAct extends Activity implements OnClickListener {
      
          /** Called when the activity is first created. */
          @Override
          public void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              System.gc();
              setContentView(R.layout.first_lay);
              ((TextView) findViewById(R.id.tvLabel)).setText("Second activity");
              findViewById(R.id.btChange).setOnClickListener(this);
          }
      
          @Override
          public void onClick(View v) {
              Intent i = new Intent(this,FirstAct.class);
              this.startActivity(i);
              this.finish();
          }
      
      
          @Override
          protected void onDestroy() {
              Log.i(FirstAct.TAG,"Second activity is destroyed !");
              super.onDestroy();
              System.gc();
          }
      
      }
      

      单身人士:

      public class SomeSingleton {
          private static volatile SomeSingleton instance = null;
          private static int count = 0;
          private SomeSingleton() {
              count++;
              Log.i(FirstAct.TAG, "Created, instance: #" + count);
          }
      
          public static SomeSingleton getInstance() {
              if ( instance == null ) {
                  instance = new SomeSingleton();
              }
              return instance;
          }
      
          @Override
          protected void finalize() throws Throwable {
              Log.i(FirstAct.TAG, "Finalized! ");
              super.finalize();
          }
      
          public void kill() {
              instance = null;
          }
      }
      

      【讨论】:

        【解决方案3】:

        这是一个迟到的答案,但我正在与类似的问题作斗争。

        您是否尝试过从 DummyService 内部初始化 MP3Singleton?根据您在答案中发布的链接,如果您从服务的生命周期内初始化单例,则单例将在服务期间保留在内存中。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-11-28
          • 1970-01-01
          • 1970-01-01
          • 2012-06-19
          • 1970-01-01
          相关资源
          最近更新 更多