0

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

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

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

所以问题是:我的播放器(全局静态播放器 + DummyService)和由服务包装的播放器之间是否有任何区别(例如:MusicDroid 此处http://www.helloandroid.com/tutorials/musicdroid-audio-player -第二部分

谢谢你的关注,范雄山

4

3 回答 3

1

Your problem is gonna be the Singleton implementation. You can read a lot of debate wheter it is suited for DalvikVM or not. This is an example why it is not. The Dalvik GC gonna eat your Singleton, you need another kind of implementation.

于 2012-06-07T13:19:16.067 回答
0

使用您的答案作为提示,我再次搜索,并在互联网上找到了一些好东西,它就在这里(关于 Singleton-Activity-Service 生命周期):

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

这里有很好的相关答案:

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;
    }
}
于 2012-06-12T08:36:18.393 回答
0

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

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

于 2015-07-29T18:13:11.930 回答