2
我目前有一個Activty
,當創建時開始並綁定service
。這service
有一個mediaplayer
。我想要做的是如果活動是resumed
然後service
繼續播放等。當activity
被銷燬時,它應該stop
service
。到目前爲止,我可以同時獲得服務,以便在重新激活活動時繼續玩,並且在創建新活動時停止服務,但不能同時停止。任何建議或想法?謝謝。下面的代碼: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();
}
}
好的。那麼你建議我做什麼? – Splitusa
如果您希望的行爲是當您的應用程序不再處於前臺時停止您的應用程序,請使用onPause停止應用程序的工作:) – Dan
因此,當另一個活動被調用時停止,但當點擊同一活動時它也停止再次。有任何想法嗎? – Splitusa