我正在开发一个在线mp3播放器,一开始我决定不使用服务 - 因为有很多数据需要传递:使用AIDL会变得非常复杂。相反,我让玩家成为全球单身人士。该应用程序几乎完成,一切正常(即使屏幕关闭时音乐播放) - 但有时整个过程被杀死!
因此,我试图通过在音乐开始时启动本地虚拟服务(例如:DummyService)来“欺骗”操作系统,并在音乐停止时停止DummyService。但这并没有多大帮助,这个过程仍然经常被杀死:(。
恕我直言,如果我的申请流程有“正在运行”的服务 - 它将有更好的机会不被Android操作系统杀死。并且DummyService与托管MediaPlayer的服务没有太大区别 - 因为MediaPlayer也没有在UI线程上播放(调用服务时的默认线程)。
所以问题是:我的播放器(全局静态播放器+ DummyService)与服务包裹的播放器之间是否存在任何差异(例如:MusicDroid here http://www.helloandroid.com/tutorials/musicdroid-audio-player-part-ii)< / p>
感谢您的关注, Pham Hung Son
答案 0 :(得分:1)
你的问题将是Singleton的实现。您可以阅读很多关于它是否适合DalvikVM的争论。这是一个例子,为什么不是。 Dalvik GC会吃你的Singleton,你需要另一种实现。
答案 1 :(得分:0)
使用您的答案作为提示,我再次搜索,并在互联网上找到了一些好东西,就在这里(关于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();
}
}
The Singleton:
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;
}
}
答案 2 :(得分:0)
这是一个迟到的答案,但我正在与类似的问题作斗争。
您是否尝试过从DummyService内部初始化MP3Singleton?根据您在答案中发布的链接,如果您在服务的生命周期内初始化Singleton,则单例将在服务期间保留在内存中。