IntentService无法启动

时间:2014-08-24 14:14:47

标签: android android-mediaplayer intentservice

我的IntentService看起来像这样:

public class MusicService extends IntentService{

    final static String NAME = "MusicService";

    //------------------------------------------------------------------------------
    public MusicService(String name) {
        super(NAME);
    }
    //------------------------------------------------------------------------------
    public MusicService() {
        super(NAME);
    }
    //------------------------------------------------------------------------------
    @Override
    protected void onHandleIntent(Intent intent) {
        // Toast never comes up
        Toast.makeText(getApplicationContext(), NAME, Toast.LENGTH_SHORT).show();
        PodcastrApplication.newInstance().getMediaPlayer().start();
    }
    //------------------------------------------------------------------------------
}

我有MediaPlayer我保留在Application中以减少对象实例化。这个想法是,一旦应用程序失焦,媒体播放器将播放。但是,服务永远不会被解雇。

以下是我从onStop()

Fragment拨打该服务的方式
showMediaPlayerNotification();
Intent music = new Intent(getActivity(), MusicService.class);
getActivity().startService(music);  

我也在清单中宣布了它。 logcat也没有错误。

发生了什么事?

更新1:

  

调用startService()后,IntentService会完成定义的工作   在其onHandleIntent()方法中,然后自行停止。

服务是否正在停止,因为它只是一行执行? 我应该将媒体播放器移动到线程吗?

更新2:

<service
            android:name=".service.MusicService"
            android:enabled="true"
            android:exported="false" />

1 个答案:

答案 0 :(得分:1)

您已在后台线程中调用Toast.makeText()!任何UI内容都必须在UI线程中完成。

请注意:IntentService使用后台线程但Service使用UI线程

您可以尝试:

public class MusicService extends IntentService{

    Handler mHandler;
    final static String NAME = "MusicService";

    //------------------------------------------------------------------------------
    public MusicService(String name) {
        super(NAME);
        mHandler = new Handler();
    }
    //------------------------------------------------------------------------------
    public MusicService() {
        super(NAME);
        mHandler = new Handler();
    }
    //------------------------------------------------------------------------------
    @Override
    protected void onHandleIntent(Intent intent) {
        mHandler.post(new Runnable{

            @Override
            public void run(){
                Toast.makeText(getApplicationContext(), NAME, Toast.LENGTH_SHORT).show();
            }            

        });
        // Toast never comes up

        PodcastrApplication.newInstance().getMediaPlayer().start();
    }
    //------------------------------------------------------------------------------
}