gpt4 book ai didi

Android-在 Activity 中恢复服务并在销毁时销毁它们

转载 作者:行者123 更新时间:2023-11-29 02:12:05 26 4
gpt4 key购买 nike

我目前有一个 Activty,它在创建时启动并与 service 绑定(bind)。这个服务有一个mediaplayer。我想做的是,如果 Activity resumed 然后 service 继续播放,等等。当 activity 被销毁时,它应该 停止 服务。到目前为止,我既可以让服务在重新激活 Activity 时继续播放,也可以让服务在创建新 Activity 时停止,但不能同时进行。有什么建议或想法吗?谢谢。代码如下:

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();
}



}

最佳答案

我想说你很幸运它停止了——只有 onPause() 保证在你的 Activity 处于后台时被调用。唯一一次调用 onDestroy() 是在系统决定回收您的应用程序正在使用的内存时

唯一保证的生命周期调用是:

  • onCreate() 仅当应用程序从头开始时;
  • onResume() 每次运行,无论是暂停还是首次创建;
  • onPause() 每次系统将您的应用移至后台时,句号。

关于Android-在 Activity 中恢复服务并在销毁时销毁它们,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6720774/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com