首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何实现unBind MusicService

如何实现unBind MusicService
EN

Stack Overflow用户
提问于 2015-10-21 11:47:55
回答 1查看 286关注 0票数 0

我是安卓的新手,我正在开发一个游戏应用程序,我想在后台播放音乐,音乐必须在activitys的中播放。此外,我从用户的设备中获取歌曲,并将它们呈现在ListView中。用户在ListMusic活动中选择一首歌,然后继续其他活动,然后我的目的是音乐将在后台继续。

我希望您理解这个过程,我也添加了JAVA。

现在,我得到了一个错误:

com.example.summerproject.ListMusic$1@42116d20 Activity com.example.summerproject.FirstActivity泄露了最初绑定在这里的ServiceConnection

据我所知,问题在于我不是UnBind每个活动的onDestroy()上的连接。有人知道怎么修吗?我希望音乐继续在所有的激活,所以这可能是一个问题,unBind的服务,每次。

MusicService:

代码语言:javascript
复制
   public class MusicService extends Service implements
   MediaPlayer.OnPreparedListener, MediaPlayer.OnErrorListener,
   MediaPlayer.OnCompletionListener
{
     private MediaPlayer player; //media player
     private ArrayList<Song> valuesList; //songs List
     private int songPosn;  //current position
     private final IBinder musicBind = new MusicBinder();
     
    public void onCreate()
     {
        
        super.onCreate(); 
        songPosn=0;
        player= new MediaPlayer();
        initMusicPlayer();
        
        player.setOnPreparedListener(this);
        player.setOnCompletionListener(this);
        player.setOnErrorListener(this);
     }

    @Override
    public IBinder onBind(Intent intent) 
    {
        //בעת התחברות 
        return musicBind;
        
    }
    
    @Override
    public boolean onUnbind(Intent intent)
    {
      player.stop();
      player.release();
      return false;
    }
    
    public void initMusicPlayer() 
    {
          //set player properties
        player.setWakeMode(getApplicationContext(),
                PowerManager.PARTIAL_WAKE_LOCK);
                player.setAudioStreamType(AudioManager.STREAM_MUSIC);
    }
    
    public void playSong()
    {
         if(player != null) //אם נוצר כבר
            player.reset();
         
        Song songToPlay = valuesList.get(songPosn);
        long songId = songToPlay.getId();
        
        Uri trackUri = ContentUris.withAppendedId(
          android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
          songId);
        
        try{
              player.setDataSource(getApplicationContext(), trackUri);
            }
            catch(Exception e)
            {
              Log.e("MUSIC SERVICE", "Error setting data source", e);
            }
        player.setLooping(true);
        player.prepareAsync();
          
    }
    public void setList(ArrayList<Song> theSongs){
          valuesList=theSongs;
        }
    
    public class MusicBinder extends Binder 
    {
          MusicService getService() 
          {
            return MusicService.this;
          }
    }
    
    public void setSong(int songIndex)
    {
          songPosn=songIndex;
    }

    @Override
    public void onPrepared(MediaPlayer mp) 
    {
        // TODO Auto-generated method stub
         mp.start();        
    }

    @Override
    public void onCompletion(MediaPlayer mp) {
        // TODO Auto-generated method stub
        
    }

    @Override
    public boolean onError(MediaPlayer mp, int what, int extra) {
        // TODO Auto-generated method stub
        return false;
    }
    


}

ListActivity(用户从这里选择歌曲):

代码语言:javascript
复制
 public class ListMusic extends Activity implements OnItemClickListener
 {

  private static ArrayList<Song> valuesList;
private ListView list;
private MySongsAdapter songAdt;
private static MusicService MusicService;
private Intent playIntent;
private static boolean musicBound=false;

@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_music);
    
    list = (ListView)findViewById(R.id.song_list);
    valuesList = new ArrayList<Song>();
    
    getSongList(); //update the valuesList
    
    songAdt = new MySongsAdapter(this, valuesList);
    list.setAdapter(songAdt);

    list.setOnItemClickListener(this);


}

//connect to the service

public static ServiceConnection musicConnection= new ServiceConnection()
{
 
  @Override
  public void onServiceConnected(ComponentName name, IBinder service) 
  {
    MusicBinder binder = (MusicBinder)service;
    //get service
    MusicService = binder.getService();
//  Toast.makeText(getApplicationContext(), "Music Service Is Not Null", Toast.LENGTH_LONG).show();
    //pass list
    MusicService.setList(valuesList);
    musicBound = true;
  }
 
  @Override
  public void onServiceDisconnected(ComponentName name) {
    musicBound = false;
  }
};      
@Override
protected void onStart() 
{
    //
  super.onStart();
  Toast.makeText(getApplicationContext(), "Start", Toast.LENGTH_LONG).show();
  
    
  if(playIntent ==null)
  {
    playIntent = new Intent(this, MusicService.class);
    bindService(playIntent, musicConnection, Context.BIND_AUTO_CREATE);
    startService(playIntent);
  }
  
}

public void songPicked(View view, int position)
{
    //כאשר שיר נבחר
    MusicService.setSong(position);
    MusicService.playSong();
}

public void getSongList() 
{ 
    //אחזור רשימת השירים מהמכשיר
  ContentResolver musicResolver = getContentResolver();
  Uri musicUri = android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
  Cursor musicCursor = musicResolver.query(musicUri, null, null, null, null);
  
  long thisId;
  int titleColumn, idColumn, artistColumn;
  String thisTitle, thisArtist;
  
  if(musicCursor!=null && musicCursor.moveToFirst())
  {
      //get columns
      titleColumn = musicCursor.getColumnIndex
        (android.provider.MediaStore.Audio.Media.TITLE);
      idColumn = musicCursor.getColumnIndex
        (android.provider.MediaStore.Audio.Media._ID);
      artistColumn = musicCursor.getColumnIndex
        (android.provider.MediaStore.Audio.Media.ARTIST);
      //add songs to list
      
      while (musicCursor.moveToNext())
      {
        thisId = musicCursor.getLong(idColumn);
        thisTitle = musicCursor.getString(titleColumn);
        thisArtist = musicCursor.getString(artistColumn);
        valuesList.add(new Song(thisId, thisTitle, thisArtist));
      }

    }
  
}

@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
        long id)
{
     //באירוע של לחיצה על שיר
    songPicked(view, position);
    
}

@Override
public boolean onCreateOptionsMenu(Menu menu) 
{
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.music, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected (MenuItem item) 
{
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.

        int id= item.getItemId();
        switch(id)
        {
        case R.id.btnExit:
              stopService(playIntent);
              MusicService=null;
            finish();
              break;

        }
        return true;
    
}

到MainActivity:的连接

代码语言:javascript
复制
   playIntent = new Intent(this, MusicService.class);
    bindService(playIntent, ListMusic.musicConnection,    Context.BIND_AUTO_CREATE);
       startService(playIntent);

如果有人知道问题出在哪里,我会很感激的!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-21 11:58:57

我希望音乐继续在所有的激活,所以这可能是一个问题,unBind的服务,每次。

这只是一个问题,因为你这样做

代码语言:javascript
复制
@Override
public boolean onUnbind(Intent intent)
{
     player.stop();
     player.release();
     return false;
}

现在,每当有东西叫unbindService(),音乐就停止了。可以在活动的unbindService()onPause()中调用onUnbind(),但是您不应该停止服务中的onUnbind()方法中的播放器。

您可以为该服务提供一个公共静态方法,可以在ned停止音乐时调用该方法:

代码语言:javascript
复制
@Override
public boolean onUnbind(Intent intent)
{
     return false;
}

public static void stopPlayMusic()
{
     player.stop();
     player.release();
}

这样,即使有东西从你的服务中释放出来,音乐也会继续播放,同时仍然有办法阻止音乐的播放。要做到这一点,您还必须使player成为一个静态变量。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33258516

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档