音乐播放器没有服务?

时间:2012-06-07 04:38:01

标签: android

我正在开发一个在线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

3 个答案:

答案 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,则单例将在服务期间保留在内存中。