2012-06-07 30 views
0

我正在开发一个在线mp3播放器,并且在开始时我决定不使用服务 - 因为有很多数据要传递:使用AIDL会变得非常复杂。相反,我让玩家成为全球单身人士。该应用几乎完成,一切正常(即使屏幕关闭时音乐也会播放) - 但有时整个过程都会被杀死!没有服务的音乐播放器?

因此,我试图通过在音乐开始时启动一个本地虚拟服务(例如:DummyService)来“操作”操作系统,并在音乐停止时停止DummyService。但这并没有太大的帮助,这个过程仍然经常遇到:(

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

所以问题是:是否有任何区别我的播放器(全球静态播放器+ DummyService)和包裹在服务中的播放器(例如:MusicDroid here http://www.helloandroid.com/tutorials/musicdroid-audio-player-part-ii

感谢您的关注, Pham Hung Son

回答

1

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

+0

Hi Antal Horvath, – hungson175

0

使用你的答案作为一个提示,我搜索了一遍,发现在互联网上的一些好东西,它在这里(约辛格尔顿-活动的服务生命周期):

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

和良好相关答案在这里:

Singletons vs. Application Context in Android?

我一直在与辛格尔顿玩弄,并找出,那答案是不太正确的。我试图在活动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; 
    } 
} 
0

这是一个迟到的答案,但我争夺一个类似的问题。

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