2011-07-16 171 views
2

我目前有一個Activty,當創建時開始並綁定service。這service有一個mediaplayer。我想要做的是如果活動是resumed然後service繼續播放等。當activity被銷燬時,它應該stopservice。到目前爲止,我可以同時獲得服務,以便在重新激活活動時繼續玩,並且在創建新活動時停止服務,但不能同時停止。任何建議或想法?謝謝。下面的代碼:Android-恢復活動中的服務並銷燬它們銷燬

活動類:

public class DUBAudioActivity extends Activity{ 

    private static final String TAG = DUBAudioActivity.class.getSimpleName(); 

    Button playPauseButtonDUB; 
    Intent playbackServiceIntentDUB; 


    public void onCreate(Bundle savedInstanceState){ 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.sdrplaylist_dubstep); 

     playPauseButtonDUB = (Button)findViewById(R.id.playpausebuttonDUB); 

     playbackServiceIntentDUB = new Intent(this, DUBAudioService.class); 
     Log.d(TAG, "created intent"); 

     startService(playbackServiceIntentDUB); 

     Log.d(TAG, "bound service"); 
     // 
     //set button text 
     playPauseButtonDUB.setText("Pause"); 
     //set button tag 
     playPauseButtonDUB.setTag(1); 



     playPauseButtonDUB.setOnClickListener(new OnClickListener(){ 

      @Override 
      public void onClick(View v) { 
       //set the tag stuff 
       final int status = (Integer) v.getTag(); 
       //create if statement for the button to do play and pause 
       if(status==1){ 
        playPauseButtonDUB.setText("Play"); 
        v.setTag(0); 
        Log.d(TAG, "set tag to 0"); 
        baServiceDUB.pauseSong(); 
        Log.d(TAG, "pause song"); 
       }else{ 
        playPauseButtonDUB.setText("Pause"); 
        v.setTag(1); 
        Log.d(TAG, "set tag to 1"); 
        baServiceDUB.playSong(); 
        Log.d(TAG, "song play'd"); 
       } 

      } 

     }); 
    // 
    } 
    private DUBAudioService baServiceDUB; 

    private ServiceConnection serviceConnectionDUB = new ServiceConnection(){ 
     public void onServiceConnected(ComponentName className, IBinder baBinder) { 
      baServiceDUB = 
      ((DUBAudioService.DUBBackgroundAudioServiceBinder)baBinder).getService(); 
     } 

     public void onServiceDisconnected(ComponentName className){ 
      baServiceDUB = null; 
     } 
// 
    }; 

    void doBindService(){ 
     getApplicationContext().bindService(playbackServiceIntentDUB, serviceConnectionDUB, 
       Context.BIND_AUTO_CREATE); 
     Log.d(TAG, "do bind service"); 

    } 

    @Override 
    public void onResume() { 
     getApplicationContext().bindService(playbackServiceIntentDUB, serviceConnectionDUB, 
       Context.BIND_AUTO_CREATE); 
      Log.d(TAG, "on resume + re-bound service"); 
     super.onResume(); 
    } 

    @Override 
    public void onDestroy(){ 
     stopService(playbackServiceIntentDUB); 
     getApplicationContext().unbindService(serviceConnectionDUB); 

     Log.d(TAG, "destroy'd + unbind service"); 
     //finish(); 
     super.onDestroy(); 
    } 

} 

服務類:

public class DUBAudioService extends Service implements OnPreparedListener, OnCompletionListener{ 

Toast loadingMessage; 

private static final String TAG = DUBAudioService.class.getSimpleName(); 

    public boolean isRunning; 

    //to keep track of the playlist item 
    Vector<PlaylistFile> playlistItems; 

    MediaPlayer mediaPlayer; 

    String baseURL = ""; 

    //keep track of which item from the vector we are on 
    int currentPlaylistltemNumber = 0; 

    public class DUBBackgroundAudioServiceBinder extends Binder { 
     DUBAudioService getService() { 
     return DUBAudioService.this; 
     } 
    } 

    private final IBinder basBinderDUB = new DUBBackgroundAudioServiceBinder(); 



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

    @Override 
    public void onCreate() { 
     Log.v("PLAYERSERVICE", "onCreate"); 
     mediaPlayer = new MediaPlayer(); 
     new MusicAsync().execute(); 
      Log.d(TAG, "execute'd async"); 
     mediaPlayer.setOnPreparedListener(this); 
      Log.d(TAG, "set on prepared listener"); 
     mediaPlayer.setOnCompletionListener(this); 
      Log.d(TAG, "set on completion listener"); 
    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     //if (!mediaPlayer.isPlaying()) { 
     // mediaPlayer.start(); 
     //} 
     return START_STICKY; 
    } 

    class MusicAsync extends AsyncTask<Void,Void,Void>{ 
     @Override 
     protected void onPreExecute(){ 
     } 
     @Override 
     protected Void doInBackground(Void... arg0) { 
      // TODO Auto-generated method stub 

      //create empty vector 
      playlistItems = new Vector<PlaylistFile>(); 

      //HTTP client library 
      HttpClient httpClient = new DefaultHttpClient(); 
      HttpGet getRequest = new HttpGet ("http://dl.dropbox.com/u/24535120/m3u%20playlist/DubstepPlaylist.m3u"); //i think you could add the m3u thing in here 

      Log.v("URI",getRequest.getURI().toString()); 

      try { 
      HttpResponse httpResponse = httpClient.execute(getRequest); 
      if (httpResponse.getStatusLine().getStatusCode() != HttpStatus.SC_OK) { 
      // ERROR MESSAGE 
      Log.v("HTTP ERROR",httpResponse.getStatusLine().getReasonPhrase()); 
      } 
      else { 
       InputStream inputStream = httpResponse.getEntity().getContent(); 
       BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); 

       String line; 
       while ((line = bufferedReader.readLine()) != null) { 
        Log.v("PLAYLISTLINE","ORIG: " + line); 

        if (line.startsWith("#")) { 
         //Metadata 
         //Could do more with this but not fo now 
        } else if (line.length() > 0) { 
         String filePath = ""; 
          if (line.startsWith("http://")) { 
          // Assume its a full URL 
           filePath = line; 
          } else { 
          //Assume it’s relative 
          filePath = getRequest.getURI().resolve(line).toString(); 
          } 

          PlaylistFile playlistFile = new PlaylistFile(filePath); 
          playlistItems.add (playlistFile); 
          } 
          } 
          inputStream.close(); 
          } 
          } catch (ClientProtocolException e) { 
           e.printStackTrace(); 
          } catch (IOException e) { 
          e. printStackTrace(); 
          } 


          currentPlaylistltemNumber = 0; 
          if (playlistItems.size() > 0) 
          { 
          String path = ((PlaylistFile)playlistItems.get(currentPlaylistltemNumber)).getFilePath(); 
          try { 
           mediaPlayer.setDataSource(path); 

          mediaPlayer.prepareAsync();} 
          catch (IllegalArgumentException e) 
          { e.printStackTrace(); 
          }catch (IllegalStateException e) { 
           e.printStackTrace(); 
          }catch (IOException e) { 
          e.printStackTrace();} 
          } 



      return null; 
     } 
     // 
     protected void onPostExecute(Void result){ 
      //playButton. setEnabled (false); 
     } 
    } 



    @Override 
    public void onStart(Intent intent, int startId) { 
     // TODO Auto-generated method stub 

     super.onStart(intent, startId); 
    } 

    public void onDestroy() { 
     if (mediaPlayer.isPlaying()) { 
      mediaPlayer.stop(); 
      Log.d(TAG, "music stopp'd"); 
     } 
     //mediaPlayer.release(); 
     Log.d(TAG, "onDestroy"); 
    } 

    @Override 
    public void onPrepared(MediaPlayer mediaPlayer) { 
     // TODO Auto-generated method stub\ 
     Log.d(TAG, "music is prepared and will start"); 
     mediaPlayer.start(); 
    } 

    public void onCompletion(MediaPlayer _mediaPlayer) { 
     Log.d(TAG, "Song completed, next song"); 
     mediaPlayer.stop(); 
     mediaPlayer.reset(); 
      if (playlistItems.size() > currentPlaylistltemNumber + 1) { 
       currentPlaylistltemNumber++; 
      String path = 
       ((PlaylistFile)playlistItems.get(currentPlaylistltemNumber)).getFilePath(); 
       try { 
        mediaPlayer.setDataSource(path); 
        mediaPlayer.prepareAsync(); 
       } catch (IllegalArgumentException e) { 
        e. printStackTrace(); 
       } catch (IllegalStateException e) { 
        e.printStackTrace(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
    } 

    class PlaylistFile { 
     String filePath; 
      public PlaylistFile(String _filePath) { 
       filePath = _filePath; 
      } 
      public void setFilePath(String _filePath) { 
       filePath = _filePath; 
      } 
      public String getFilePath() { 
       return filePath; 
      } 
     } 


    public void playSong(){ 
     Log.d(TAG, "start'd"); 
     mediaPlayer.start(); 
    } 

    public void pauseSong(){ 
     Log.d(TAG, "pause'd"); 
     mediaPlayer.pause(); 
    } 



} 

回答

1

我說你很幸運,它停止了 - 只有onPause()保證當你的活動被稱爲中背景。唯一的一次onDestroy()被稱爲是當系統決定收回你的應用程序使用

唯一可以保證的生命週期調用內存是:只有

  • onCreate()當應用程序是白手起家;
  • onResume()每次運行,無論是暫停還是首次創建;
  • onPause()每次系統將您的應用程序移動到背景時,週期。
+0

好的。那麼你建議我做什麼? – Splitusa

+0

如果您希望的行爲是當您的應用程序不再處於前臺時停止您的應用程序,請使用onPause停止應用程序的工作:) – Dan

+0

因此,當另一個活動被調用時停止,但當點擊同一活動時它也停止再次。有任何想法嗎? – Splitusa