在活动结束时防止服务破坏

时间:2016-01-10 09:22:00

标签: android android-service

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


}

我该怎么办?

1 个答案:

答案 0 :(得分:0)

我不知道哪一个是好习惯,但你可以通过双向实现它

  1. 您可以使用服务而不将其与活动类绑定,并使用服务类中的接口,该接口将由activity实现以获取回调并访问您创建的服务方法。
  2. 您可以使用本地广播管理器,并可以将活动中的广播发送到服务,反之亦然,以便从服务的活动和活动操作中访问服务操作。
  3. 如果您需要任何代码段,请告诉我

相关问题