我有Service
名为 歌曲服务 ,我使用bind service
连接此服务。
问题很简单,当我点击后退按钮时它会被破坏,这不是我想要的。
我知道如果我使用startService()
我点击后退按钮后服务不会销毁,但我再也无法访问我的服务方法了。
这是我的服务:
public class SongsService extends Service {
MediaPlayer mediaPlayer;
private IBinder mBinder;
private String path = Values.songPlayerUrl;
static String playerUrl;
static public final int STOPPED = -1, PAUSED = 0, PLAYING = 1;
static String postId;
static String postType;
static String postTitle;
static String songName;
static String lowSongDownloadLink;
static String highSongDownloadLink;
static String coverUrl;
static String postLikes;
static String postDislikes;
static String postViews;
private int status;
private boolean taken;
@Override
public void onCreate() {
super.onCreate();
mediaPlayer = new MediaPlayer();
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mBinder = new MyBinder();
setStatus(STOPPED);
}
public void take() {
taken = true;
}
private void unTake() {
synchronized (this) {
taken = false;
notifyAll();
}
}
public String getPlayerUrl() {
return playerUrl;
}
public void setPlayerUrl(String playerUrl) {
this.playerUrl = playerUrl;
}
public String getPostId() {
return postId;
}
public void setPostId(String postId) {
this.postId = postId;
}
private void setStatus(int s) {
status = s;
}
public int getStatus() {
return status;
}
public void playTrack() {
if (status > STOPPED) {
stop();
}
setPlayerUrl(Values.songPlayerUrl);
try {
mediaPlayer.setDataSource(getPlayerUrl());
mediaPlayer.prepare();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
mediaPlayer.start();
setStatus(PLAYING);
setPostId(Values.postId);
postType = Values.postType;
postTitle = Values.postTitle;
songName = Values.songName;
coverUrl = Values.coverUrl;
postLikes = Values.postLikes;
postDislikes = Values.postDislikes;
postViews = Values.postViews;
unTake();
}
public void play() {
switch (status) {
case STOPPED:
playTrack();
break;
case PLAYING:
mediaPlayer.pause();
setStatus(PAUSED);
break;
case PAUSED:
mediaPlayer.start();
setStatus(PLAYING);
break;
}
unTake();
}
public void stop() {
mediaPlayer.stop();
mediaPlayer.reset();
setStatus(STOPPED);
unTake();
}
public int getCurrentTrackProgress() {
if (status > STOPPED) {
return mediaPlayer.getCurrentPosition();
} else {
return 0;
}
}
public int getCurrentTrackDuration() {
if (status > STOPPED) {
return mediaPlayer.getDuration();
} else {
return 0;
}
}
public void seekTrack(int p) {
if (status > STOPPED) {
mediaPlayer.seekTo(p);
unTake();
}
}
public IBinder onBind(Intent arg0) {
return mBinder;
}
public boolean onUnBind(Intent intent) {
return super.onUnbind(intent);
}
public class MyBinder extends Binder {
public SongsService getService() {
return SongsService.this;
}
}
public static String formatTrackDuration(int d) {
String min = Integer.toString((d/1000)/60);
String sec = Integer.toString((d/1000)%60);
if (sec.length() == 1) sec = "0"+sec;
return min+":"+sec;
}
}
这是我的活动
public class Songs_Single extends AppMenu {
ListView lv;
ImageView cover;
ImageView playBtn;
ImageView prevBtn;
ImageView nextBtn;
SeekBar songSeekBar;
SeekBar volumeSeekBar;
TextView actionbar_Title;
TextView actionbar_Subtitle;
TextView SongCurrentTime;
TextView SongDuration;
AudioManager audioManager;
PlayerService playerService;
private UiRefresher uiRefresher;
private Timer progressRefresher;
private int playerStatus;
SongsService songsService;
ArrayList<Songs_Single_ContentSetter> postList;
Songs_Single_ArrayAdapter adapter;
TextView lvFtr;
boolean mVal = true;
private String term_id = "";
int lvCount = 0;
int count;
private ArrayList<String> term_ids = Values.postTags;
private String[] myNum = {"135","138","174","424","231","500","581","582","3132","8126"};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
LayoutInflater inflater = (LayoutInflater) this
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View contentView = inflater.inflate(R.layout.songs_single, null, false);
drawerLayout.addView(contentView, 0);
ViewGroup header = (ViewGroup) inflater.inflate(R.layout.songs_single_header, lv,
false);
postList = new ArrayList<>();
adapter = new Songs_Single_ArrayAdapter(Songs_Single.this, R.layout.songs_single_row, postList);
lv = (ListView) findViewById(R.id.Songs_Single_listView);
lvFtr = new TextView(getApplicationContext());
lvFtr.setText("loading");
lv.addHeaderView(header);
lv.setAdapter(adapter);
if (term_ids != null ) {
term_ids.removeAll(Arrays.asList(myNum));
for (int m = 0; m < term_ids.size(); m++) {
term_id += "&tax_query[0][terms][" + m + "]=" + term_ids.get(m);
}
}
new GetData().execute();
progressRefresher = new Timer();
final ImageView logo = (ImageView)findViewById(R.id.actionbar_logo);
logo.setVisibility(View.GONE);
cover = (ImageView)findViewById(R.id.Songs_Single_Cover);
actionbar_Title = (TextView) findViewById(R.id.actionbar_Title);
actionbar_Title.setSelected(true);
actionbar_Subtitle = (TextView) findViewById(R.id.actionbar_Subtitle);
actionbar_Subtitle.setVisibility(View.VISIBLE);
playBtn = (ImageView)findViewById(R.id.Songs_Single_Controls_Controls_PlayBtn);
nextBtn = (ImageView)findViewById(R.id.Songs_Single_Controls_Controls_NextBtn);
nextBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
}
});
prevBtn = (ImageView)findViewById(R.id.Songs_Single_Controls_Controls_PrevBtn);
songSeekBar = (SeekBar)findViewById(R.id.Songs_Single_Controls_SeekBar_SeekBar);
volumeSeekBar = (SeekBar)findViewById(R.id.Songs_Single_Controls_VolumeBar_VolumeBar);
SongCurrentTime = (TextView) findViewById(R.id.Songs_Single_Controls_SongCurrentTime);
SongDuration = (TextView) findViewById(R.id.Songs_Single_Controls_SongDuration);
if (Values.coverUrl != ""){
Picasso.with(getApplicationContext()).load(Values.coverUrl).into(cover);
}
if (Values.postLikes != "")
actionbar_Subtitle.setText(Values.postLikes+" Likes | "+Values.postDislikes+" Dislikes | "+Values.postViews+" Plays" );
if ((Values.postTitle != "") && (Values.songName != ""))
actionbar_Title.setText(Values.postTitle+" - "+Values.songName);
playBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (!(Values.postId.equals(songsService.getPostId()))) {
songsService.stop();
}
songsService.play();
}
});
songSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, final int progress, boolean fromUser) {
if (Values.postId.equals(songsService.getPostId())){
runOnUiThread(new Runnable() {
@Override
public void run() {
SongCurrentTime.setText(songsService.formatTrackDuration(progress));
}
});
if (fromUser) {
songsService.seekTrack(progress);
}
}
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
});
progressRefresher.schedule(new TimerTask() {
@Override
public void run() {
if (playerStatus == songsService.PLAYING) {
refreshTrack();
}
}
}, 0, 500);
audioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
int maxVolume = audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
int currentVolume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
volumeSeekBar.setMax(maxVolume);
volumeSeekBar.setProgress(currentVolume);
volumeSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, progress, 0);
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
});
lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
position = position-1;
if (postList.get(position).getPostType().equals("songs")) {
Intent songs = new Intent(getApplicationContext(), Songs_Single.class);
Values.postTitle = postList.get(position).getPostTitle();
Values.postId = postList.get(position).getPostId();
Values.postType = postList.get(position).getPostType();
Values.songName = postList.get(position).getSongName();
Values.coverUrl = postList.get(position).getCoverUrl();
Values.postLikes = postList.get(position).getPostLikes();
Values.postDislikes = postList.get(position).getPostDislikes();
Values.postViews = postList.get(position).getPostViews();
Values.songPlayerUrl = postList.get(position).getSongPlayerUrl();
Values.postTags = postList.get(position).getPostTags();
startActivity(songs);
}
}
});
}
@Override
protected void onStart() {
super.onStart();
Intent intent= new Intent(this, SongsService.class);
bindService(intent, mConnection,
Context.BIND_AUTO_CREATE);
}
private ServiceConnection mConnection = new ServiceConnection() {
public void onServiceConnected(ComponentName className,
IBinder binder) {
SongsService.MyBinder b = (SongsService.MyBinder) binder;
songsService = b.getService();
uiRefresher = new UiRefresher();
(new Thread(uiRefresher)).start();
}
public void onServiceDisconnected(ComponentName className) {
}
};
private void refreshTrack() {
if (Values.postId.equals(songsService.getPostId())) {
final int progress = songsService.getCurrentTrackProgress(), max = songsService.getCurrentTrackDuration();
final String durationText = songsService.formatTrackDuration(songsService.getCurrentTrackDuration()), progressText = songsService.formatTrackDuration(songsService.getCurrentTrackProgress());
runOnUiThread(new Runnable() {
@Override
public void run() {
SongDuration.setText(durationText);
SongCurrentTime.setText(progressText);
songSeekBar.setMax(max);
songSeekBar.setProgress(progress);
}
});
}
}
private void refreshButtons() {
runOnUiThread(new Runnable() {
@Override
public void run() {
if (Values.postId.equals(songsService.getPostId())) {
switch (playerStatus) {
case PlayerService.PLAYING:
playBtn.setImageResource(R.drawable.ic_pause);
break;
default:
playBtn.setImageResource(R.drawable.ic_play);
break;
}
}
}
});
}
private class UiRefresher implements Runnable {
private boolean done = false;
public void done() {
done = true;
}
@Override
public void run() {
while (!done) {
synchronized (songsService) {
playerStatus = songsService.getStatus();
refreshTrack();
refreshButtons();
songsService.take();
try {
songsService.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
class GetData extends AsyncTask<String, Void, Boolean> {
String postId = "";
String postType = "";
String postTitle = "";
String songName = "";
String artistName = "";
String songPlayerUrl = "";
String lowSongDownloadLink = "";
String highSongDownloadLink = "";
String coverUrl = "";
String songLyric = "";
String postLikes = "0";
String postDislikes = "0";
String postViews = "0";
String postDownloadsCount = "0";
@Override
protected void onPreExecute() {
super.onPreExecute();
lv.addFooterView(lvFtr);
}
@Override
protected Boolean doInBackground(String... params) {
HttpURLConnection urlConnection;
String results = "";
mVal = true;
try {
URL url = new URL("http://paradi3emusic.com/?json=get_posts&post_type=songs&post__not_in[]=" + Values.postId + "&tax_query[0][taxonomy]=post_tag&tax_query[0][field]=id" + term_id);
urlConnection = (HttpURLConnection) url.openConnection();
int code = urlConnection.getResponseCode();
if(code==200){
InputStream in = new BufferedInputStream(urlConnection.getInputStream());
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(in));
String line;
while ((line = bufferedReader.readLine()) != null)
results += line;
JSONObject jsono = new JSONObject(results);
count = jsono.getInt("count");
JSONArray jarray = jsono.getJSONArray("posts");
for (int i = 0; i < jarray.length() ; i++) {
Songs_Single_ContentSetter content1 = new Songs_Single_ContentSetter();
JSONObject object = jarray.getJSONObject(i);
postId = object.getString("id");
postType = object.getString("type");
JSONObject attachments = object.getJSONObject("thumbnail_images");
JSONObject attachments0 = attachments.getJSONObject("tumb");
coverUrl = attachments0.getString("url");
JSONObject customFields = object.getJSONObject("custom_fields");
if (customFields.has("ozy_post_plays_count")) {
JSONArray postViewsVal = customFields.getJSONArray("ozy_post_plays_count");
postViews = postViewsVal.getString(0);
}
if (customFields.has("like")) {
JSONArray postLikesVal = customFields.getJSONArray("like");
postLikes = postLikesVal.getString(0);
}
if (customFields.has("dislike")) {
JSONArray postDislikesVal = customFields.getJSONArray("dislike");
postDislikes = postDislikesVal.getString(0);
}
if (customFields.has("download_count")) {
JSONArray postDownloadsCountVal = customFields.getJSONArray("download_count");
postDownloadsCount = postDownloadsCountVal.getString(0);
}
if (customFields.has("playlist")) {
JSONArray playlist = customFields.getJSONArray("playlist");
if (playlist.getJSONArray(0) != null) {
JSONArray playlist0 = playlist.getJSONArray(0);
JSONObject playlistObjs = playlist0.getJSONObject(0);
postTitle = playlistObjs.getString("title");
artistName = postTitle.substring(0, postTitle.indexOf("-") + 1);
songName = postTitle.substring(postTitle.indexOf("-") + 1);
songPlayerUrl = playlistObjs.getString("mp3");
highSongDownloadLink = playlistObjs.getString("buy_link_a");
lowSongDownloadLink = playlistObjs.getString("buy_link_b");
songLyric = playlistObjs.getString("lyric").equals("") ? "Sorry,no lyrics found,submit your lyric by contact us" : playlistObjs.getString("lyric");
}
}
content1.setPostTitle(artistName.replace(" -",""));
content1.setSongName(songName);
content1.setSongPlayerUrl(songPlayerUrl);
content1.setHighSongDownloadLink(highSongDownloadLink);
content1.setLowSongDownloadLink(lowSongDownloadLink);
content1.setSongLyric(songLyric);
content1.setPostViews(postViews);
content1.setPostLikes(postLikes);
content1.setPostDislikes(postDislikes);
content1.setPostId(postId);
content1.setPostType(postType);
content1.setCoverUrl(coverUrl);
content1.setPostDownloadsCount(postDownloadsCount);
postList.add(content1);
}
in.close();
return true;
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (JSONException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return false;
}
protected void onPostExecute(Boolean result) {
lv.removeFooterView(lvFtr);
adapter.notifyDataSetChanged();
if(postList.size() < 30) {
new GetMoreData().execute("http://paradi3emusic.com/?json=get_posts&post_type=songs&orderby=rand&no_found_rows=true&count=" + (postList.size() - 30) + "&post__not_in[]=" + Values.postId);
}
if(!result)
Toast.makeText(getApplicationContext(),"Unable to get data please check yor connection and try again",Toast.LENGTH_LONG).show();
}
}
class GetMoreData extends AsyncTask<String, Void, Boolean> {
String postId = "";
String postType = "";
String postTitle = "";
String songName = "";
String artistName = "";
String songPlayerUrl = "";
String lowSongDownloadLink = "";
String highSongDownloadLink = "";
String coverUrl = "";
String songLyric = "";
String postLikes = "0";
String postDislikes = "0";
String postViews = "0";
String postDownloadsCount = "0";
@Override
protected void onPreExecute() {
super.onPreExecute();
lv.addFooterView(lvFtr);
}
@Override
protected Boolean doInBackground(String... params) {
HttpURLConnection urlConnection;
String results = "";
mVal = true;
try {
URL url = new URL(params[0]);
urlConnection = (HttpURLConnection) url.openConnection();
int code = urlConnection.getResponseCode();
if(code==200){
InputStream in = new BufferedInputStream(urlConnection.getInputStream());
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(in));
String line;
while ((line = bufferedReader.readLine()) != null)
results += line;
JSONObject jsono = new JSONObject(results);
count = jsono.getInt("count");
JSONArray jarray = jsono.getJSONArray("posts");
for (int i = 0; i < jarray.length() ; i++) {
Songs_Single_ContentSetter content1 = new Songs_Single_ContentSetter();
JSONObject object = jarray.getJSONObject(i);
postId = object.getString("id");
postType = object.getString("type");
JSONObject attachments = object.getJSONObject("thumbnail_images");
JSONObject attachments0 = attachments.getJSONObject("tumb");
coverUrl = attachments0.getString("url");
JSONObject customFields = object.getJSONObject("custom_fields");
if (customFields.has("ozy_post_plays_count")) {
JSONArray postViewsVal = customFields.getJSONArray("ozy_post_plays_count");
postViews = postViewsVal.getString(0);
}
if (customFields.has("like")) {
JSONArray postLikesVal = customFields.getJSONArray("like");
postLikes = postLikesVal.getString(0);
}
if (customFields.has("dislike")) {
JSONArray postDislikesVal = customFields.getJSONArray("dislike");
postDislikes = postDislikesVal.getString(0);
}
if (customFields.has("download_count")) {
JSONArray postDownloadsCountVal = customFields.getJSONArray("download_count");
postDownloadsCount = postDownloadsCountVal.getString(0);
}
if (customFields.has("playlist")) {
JSONArray playlist = customFields.getJSONArray("playlist");
if (playlist.getJSONArray(0) != null) {
JSONArray playlist0 = playlist.getJSONArray(0);
JSONObject playlistObjs = playlist0.getJSONObject(0);
postTitle = playlistObjs.getString("title");
artistName = postTitle.substring(0, postTitle.indexOf("-") + 1);
songName = postTitle.substring(postTitle.indexOf("-") + 1);
songPlayerUrl = playlistObjs.getString("mp3");
highSongDownloadLink = playlistObjs.getString("buy_link_a");
lowSongDownloadLink = playlistObjs.getString("buy_link_b");
songLyric = playlistObjs.getString("lyric").equals("") ? "Sorry,no lyrics found,submit your lyric by contact us" : playlistObjs.getString("lyric");
}
}
content1.setPostTitle(artistName.replace(" -",""));
content1.setSongName(songName);
content1.setSongPlayerUrl(songPlayerUrl);
content1.setHighSongDownloadLink(highSongDownloadLink);
content1.setLowSongDownloadLink(lowSongDownloadLink);
content1.setSongLyric(songLyric);
content1.setPostViews(postViews);
content1.setPostLikes(postLikes);
content1.setPostDislikes(postDislikes);
content1.setPostId(postId);
content1.setPostType(postType);
content1.setCoverUrl(coverUrl);
content1.setPostDownloadsCount(postDownloadsCount);
postList.add(content1);
}
in.close();
return true;
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (JSONException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return false;
}
protected void onPostExecute(Boolean result) {
lv.removeFooterView(lvFtr);
adapter.notifyDataSetChanged();
if(!result)
Toast.makeText(getApplicationContext(),"Unable to get data please check yor connection and try again",Toast.LENGTH_LONG).show();
}
}
}
我该怎么办?
答案 0 :(得分:0)
我不知道哪一个是好习惯,但你可以通过双向实现它
如果您需要任何代码段,请告诉我