2011-07-16 16 views
2

私は現在、Activtyを持っています。作成時にはserviceでバインドされています。このservicemediaplayerです。私がしたいのは、アクティビティがresumedで、次にserviceがプレーし続けるなどの場合です。activityが破壊された場合、それはstopserviceです。これまでは、アクティビティが再アクティブ化されたときに再生を継続するサービスと、新しいアクティビティが作成されたときに停止するサービスの両方を同時に取得することはできません。任意の提案やアイデア?ありがとう。以下のコード:Android - アクティビティでのサービスの再開と破棄時の破棄

Activityクラス:

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

関連する問題