Android- listview, service mediaplayer, and boolea

2020-03-07 14:56发布

问题:

I currently have a listview and when you click on an item it runs a service with a mediaplayer. If I click on another item in the listview the service that's running should stop and run the new service. I am using a boolean isRunning set to false and when the service is created it returns true. Then in the listview I call that flag in an if statement. However, its not exactly working. I think I may be doing this wrong. Any ideas?

This probably sounds confusing the way I described it so Here is the code to my listview and my service. I am only testing this on case 3 (so I press this item to start the service and then click on case 2 to see if it will stop it).

Listview class:

public class PlaylistActivity extends ListActivity{

    private static final String TAG = PlaylistActivity.class.getSimpleName();

    // Data to put in the ListAdapter
    private String[] sdrPlaylistNames = new String[] {
            "Best of June 2011", "Best of May 2011", "Dubstep",
            "House", "Other"};

    private ListAdapter sdrListAdapter;
    Intent playbackServiceIntentBOJ, playbackServiceIntentBOM, playbackServiceIntentDUB;



    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.playlists_layout);
        //fill the screen with the list adapter
        playlistFillData();

        playbackServiceIntentDUB = new Intent(this, DUBAudioService.class);
        Log.d(TAG, "Made DUB Service Intent");
    }

    public void playlistFillData() {
        //create and set up the Array adapter for the list view
        ArrayAdapter sdrListAdapter = new ArrayAdapter(this, R.layout.list_item, sdrPlaylistNames);
        setListAdapter(sdrListAdapter);
    }

    //set up the on list item Click 
    @Override
    protected void onListItemClick(ListView l, View v, int position, long id) {
        super.onListItemClick(l, v, position, id);
        //create a switch so that each list item is a different playlist
        switch(position){
        case 0:
            Intent BOJintent = new Intent(this, BOJAudioActivity.class);
            // Create the view using PlaylistGroup's LocalActivityManager
            View view = PlaylistGroup.group.getLocalActivityManager()
            .startActivity("show_city", BOJintent
            .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP))
            .getDecorView();

            // Again, replace the view
            PlaylistGroup.group.replaceView(view);

         //   playbackServiceIntentBOJ = new Intent(this, BOJAudioService.class);
                Log.d(TAG, "Made BOJ Intent");
        //  startService(playbackServiceIntentBOJ);
                Log.d(TAG, "started BOJ Service");

            break;
        case 1:
            Intent BOMintent = new Intent(this, BOMAudioActivity.class);
            // Create the view using PlaylistGroup's LocalActivityManager
            View view2 = PlaylistGroup.group.getLocalActivityManager()
            .startActivity("show_city", BOMintent
            .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP))
            .getDecorView();

            // Again, replace the view
           PlaylistGroup.group.replaceView(view2);
                Log.d(TAG, "Replace view");

                //getApplicationContext().stopService(playbackServiceIntentBOJ);

            //playbackServiceIntentBOM = new Intent(this, BOJAudioService.class);
                Log.d(TAG, "Made BOM Service Intent");
        //  startService(playbackServiceIntentBOM);
                Log.d(TAG, "started BOM Service");

                if(DUBAudioActivity.isRunningDUB = true){
                    stopService(playbackServiceIntentDUB);
                    Log.d(TAG, "stop service isRunningDUB");
                }
//
            break;
        case 2:

            Intent DUBIntent = new Intent (this, DUBAudioActivity.class);
            View view3 = PlaylistGroup.group.getLocalActivityManager()
                        .startActivity("show_city", DUBIntent
                                .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP))
                                .getDecorView();
            PlaylistGroup.group.replaceView(view3);
                Log.d(TAG, "Replace view");

            startService(playbackServiceIntentDUB);
                Log.d(TAG, "started DUB service");

            break;

        }


    }


}

Service Class:

public class DUBAudioService extends Service implements OnPreparedListener, OnCompletionListener{

Toast loadingMessage;

private static final String TAG = DUBAudioService.class.getSimpleName();

    public static boolean isRunningDUB = false;

    //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");

            isRunningDUB = true;
            Log.d(TAG, "isRunningRUB = true");
    }

    @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) {
        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:

This gets pretty complicated but I used the following to see if my service was running:

private boolean isMyServiceRunning() {
ActivityManager manager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
    if ("com.example.MyService".equals(service.service.getClassName())) {
        return true;
    }
}
return false;
}

I added this in my listview class and put if statements in each case to see if it was running and if so would stop the service.

I also made my all of my binding conenctions public so that the listview class could access them and start them on click.

If anyone wants to further understand, etc message me.



回答2:

let your app track the state, not your service.