2014-09-25 176 views
1

我做了一个简单的音乐播放器,可以在后台播放一些歌曲。 进入主屏幕并通过通知重新打开应用程序也行。MusicPlayer崩溃点击后退按钮

我唯一的问题是,如果我在音乐播放器活动中按下后退按钮(转到父活动),我的应用程序崩溃。有两个类,活动MP3Player.java和服务MP3Service.jave。

我收到以下错误:

java.lang.RuntimeException: Unable to destroy activity {package/package.MP3Player}: java.lang.IllegalArgumentException: Service not registered: [email protected]

你知道任何advide? 在此先感谢!

EDIT1: 我束缚我的球员像这样在我的玩家活动: MP3Player.java(活动)

playIntent = new Intent(this, MP3Service.class); 
bindService(playIntent, musicConnection, Context.BIND_AUTO_CREATE); 
startService(playIntent); 

我用this教程,并修改它。

编辑3: 现在我得到这个错误:

java.lang.RuntimeException: Unable to stop service [email protected]: java.lang.IllegalStateException

MP3Service.java

public void onCreate() { 
    super.onCreate(); 
    songPosn = 0; 
    player = new MediaPlayer(); 
    initMusicPlayer(); 
} 

public void initMusicPlayer() { 
    player.setAudioStreamType(AudioManager.STREAM_MUSIC); 
} 

... 

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    return START_STICKY; 
} 

public void setList(ArrayList<Song> theSongs) { 
    songs = theSongs; 
} 

public class MusicBinder extends Binder { 
    MP3Service getService() { 
     return MP3Service.this; 
    } 
} 

@Override 
public IBinder onBind(Intent intent) { 
    return musicBind; 
} 

@Override 
public boolean onUnbind(Intent intent) { 
    player.stop(); 
    player.release(); 
    return false; 
} 

public void playSong() { 
    player.reset(); 

    Song playSong = songs.get(songPosn); 

    try { 
     player.setDataSource(getApplicationContext(), 
       Uri.parse(playSong.getPath())); 
    } catch (Exception e) { 
     Log.e("MUSIC SERVICE", "Error setting data source", e); 
    } 
    player.prepareAsync(); 
} 

public void pauseMusic() { 
    if (player.isPlaying()) { 
     player.pause(); 
     length = player.getCurrentPosition(); 
    } 
} 

public void resumeMusic() { 
    if (player.isPlaying() == false) { 
     player.seekTo(this.length); 
     player.start(); 
    } else { 
     Toast.makeText(getApplicationContext(), 
       "Please select a song to play", Toast.LENGTH_LONG).show(); 
    } 
} 

public void stopMusic() { 
    player.stop(); 
    player.release(); 
    player = null; 
} 

// set the song 
public void setSong(int songIndex) { 
    songPosn = songIndex; 

} 

@Override 
public void onPrepared(MediaPlayer mp) { 
    mp.start(); 
} 

@Override 
public void onDestroy() { 
    super.onDestroy(); 
    if (player != null) { 
     try { 
      player.stop(); 
      player.release(); 
     } finally { 
      player = null; 
     } 
    } 
} 

MP3Player.java

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_mp3_player); 
    getActionBar().setDisplayHomeAsUpEnabled(true); 

    songList = getSongList(); 

    listAdapter = new PlayListAdapter(this, songList); 
    listMusic.setAdapter(listAdapter); 

    listMusic.setOnItemClickListener(new OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int pos, 
       long arg3) { 
      currentSongPos = pos; 
      musicSrv.setSong(currentSongPos); 
      musicSrv.playSong(); 
     } 
    }); 

} 

private ServiceConnection musicConnection = new ServiceConnection() { 
    @Override 
    public void onServiceConnected(ComponentName name, IBinder service) { 
     MusicBinder binder = (MusicBinder) service; 
     musicSrv = binder.getService(); 
     musicSrv.setList(songList); 
     musicBound = true; 
    } 

    @Override 
    public void onServiceDisconnected(ComponentName name) { 
     musicBound = false; 
    } 
}; 

@Override 
protected void onStart() { 
    super.onStart(); 
    if (playIntent == null) { 
     playIntent = new Intent(this, MP3Service.class); 
     bindService(playIntent, musicConnection, Context.BIND_AUTO_CREATE); 
     startService(playIntent); 
    } 
} 


... 

protected void onDestroy() { 
    if (musicBound) { 
     stopService(playIntent); 
     unbindService(musicConnection); 
     musicSrv = null; 
    } 
    super.onDestroy(); 
} 
+0

你必须先打电话stopService(),然后unbindService()。 – 2014-09-25 21:12:23

+0

好吧,我切换了两个电话,但仍然是同样的问题。它在我服务的onDestroy()中? – mbauer 2014-09-25 21:16:18

+0

清理onDestroy()和onUnbind()中的代码。请发布所有printStackTrace,我无法理解错误在哪里。 – 2014-09-25 21:21:35

回答

1

Service not registered意味着它没有义务在期间服务电话。

阅读有关服务生命周期:API Guide: Services

编辑

尝试添加:

protected void onDestroy() { 
    if(musicBound){ 
     stopService(playIntent); 
     unbindService(musicConnection); 
     musicSrv=null; 
    } 
    super.onDestroy(); 
} 

编辑2

对不起我的错,你需要先致电stopService(),然后致电unbindService()

为stopService的Android文档()指出:

Note that if a stopped service still has ServiceConnection objects bound to it with the BIND_AUTO_CREATE set, it will not be destroyed until all of these bindings are removed. See the Service documentation for more details on a service's lifecycle.

+0

我将我的播放器绑定到该服务。看到更新的问题。 – mbauer 2014-09-25 19:32:22

+0

你在哪里调用了bindService()?请添加更多的代码.... – 2014-09-25 19:41:59

+0

完成,但得到另一个错误 – mbauer 2014-09-25 20:50:37