如何停止关闭 activity 后继续播放的媒体播放器

How to stop mediaplayer which continues to play after closing the activity

我已将 MediaPlayer 设置为播放原始文件夹中的音乐文件列表。这个音乐播放器有暂停和播放按钮。使用 RecyclerView 列出歌曲。

我的挑战是每当我退出 activity activity 时,音乐会继续播放而不会自动停止。 请帮助我,我希望音乐播放器在 activity 关闭时停止。

这是 CustomMusicAdapter

public class CustomMusicAdapter extends RecyclerView.Adapter<MyViewHolder> implements Filterable {

    private Context context;
    private int layout;
    private ArrayList<Music> myArraylist;
    private ArrayList<Music> getUserModelListFiltered;
    private static MediaPlayer mediaPlayer;
    private boolean flag=true;


    public CustomMusicAdapter(Context context, int custom_music_row, ArrayList<Music> myArraylist) {
        this.context = context;
        this.layout = layout;
        this.getUserModelListFiltered = myArraylist;
        this.myArraylist = myArraylist;

    }

    @NonNull
    @Override
    public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        final View itemView = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.custom_music_row, parent, false);
        return new MyViewHolder(itemView);
    }



    @SuppressLint("RecyclerView")
    @Override
    public void onBindViewHolder(@NonNull final MyViewHolder holder, final int position) {
        holder.setIsRecyclable(false);

        final Music music = myArraylist.get(position);
        holder.mTitle.setText(music.getName());
        holder.mDes.setText(music.getSinger());

        //Play Music Setup
        holder.mImageaplay.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                if (flag){
                    mediaPlayer=MediaPlayer.create(context,music.getSong());
                    flag=false;
                }
                if (mediaPlayer.isPlaying()){
                    mediaPlayer.pause();
                    mediaPlayer.start();
                    holder.mImageaplay.setImageResource(R.drawable.ic_play);
                }else {
                    mediaPlayer.start();
                    holder. mImageaplay.setImageResource(R.drawable.ic_pause);
                }
                mediaPlayer.start();

            }
        });

        // stop player
        holder.mImageStop.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (!flag){
                    mediaPlayer.stop();
                    mediaPlayer.release();
                    flag=true;
                }
                holder.mImageaplay.setImageResource(R.drawable.ic_play);
            }
        });

    }

    @Override
    public int getItemCount() {
        return myArraylist.size();
    }

    @Override
    public Filter getFilter() {

        Filter filter = new Filter() {
            @Override
            protected FilterResults performFiltering(CharSequence charSequence) {
                FilterResults filterResults = new FilterResults();
                if (charSequence == null | charSequence.length() == 0){
                    filterResults.count = getUserModelListFiltered.size();
                    filterResults.values = getUserModelListFiltered;
                }else {
                    String searchChr = charSequence.toString().toLowerCase();
                    List<Music> resultData = new ArrayList<>();
                    for (Music music: getUserModelListFiltered){
                        if (music.getName().toLowerCase().contains(searchChr)){
                            resultData.add(music);
                        }
                    }
                    filterResults.count = resultData.size();
                    filterResults.values = resultData;
                }
                return filterResults;
            }

            @Override
            protected void publishResults(CharSequence charSequence, FilterResults filterResults) {

                myArraylist = (ArrayList<Music>) filterResults.values;
                notifyDataSetChanged();

            }
        };
        return filter;
    }

    public class ViewHolder {
        TextView textView_SongName, textView_artist;
        ImageView imageView_play, imageView_stop;
        private View convertview;
        LayoutInflater layoutInflater = (LayoutInflater) context.getSystemService(context.LAYOUT_INFLATER_SERVICE);

        public ViewHolder() {
            convertview = layoutInflater.inflate(layout, null);
            textView_SongName = convertview.findViewById(R.id.textName);
            textView_artist = convertview.findViewById(R.id.txtSinger);
            imageView_play = convertview.findViewById(R.id.ivPlay);
            imageView_stop = convertview.findViewById(R.id.ivStop);

        }
    }
}

这是我在代码中的放置方式 对吗?

// stop player
        holder.mImageStop.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (!flag){
                    mediaPlayer.stop();
                    mediaPlayer.release();
                    flag=true;
                }
                public void onDestroy(){
                    if( CustomMusicAdapter !=null ){
                        CustomMusicAdapter.release()
                    }
                }
                holder.mImageaplay.setImageResource(R.drawable.ic_play);

            }
        });

Tip1Activity.java

public class Tip1Activity extends AppCompatActivity {
    private ArrayList<Music> arrayList;
    private CustomMusicAdapter adapter;
    private RecyclerView recyclerView;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_tip1);



        Button button1 = (Button)findViewById(R.id.mainButton1);
        button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent i = new Intent(Tip1Activity.this, MainActivity.class);
                i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                startActivity(i);
                Toast.makeText(Tip1Activity.this, "songs!", Toast.LENGTH_SHORT).show();
            }
        });

      

        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

        recyclerView =  findViewById(R.id.recyclerViewList);

        arrayList = new ArrayList<>();
        arrayList.add(new Music("001 Veni, veni, Emmanuel", "SONGS OF WORSHIP", R.raw.veni_emmanuel));
        arrayList.add(new Music("002 O come. O come Emmanuel", "SONGS OF WORSHIP", R.raw.o_come_emmanuel));
        arrayList.add(new Music("003 Savior of the nations, come", "SONGS OF WORSHIP", R.raw.savior_of_nations));
        arrayList.add(new Music("004 On Jordan's bank the Baptist's cry", "SONGS OF WORSHIP", R.raw.on_jordans_bank));
        arrayList.add(new Music("005 Lo, he comes", "SONGS OF WORSHIP", R.raw.lo_he_comes));
        arrayList.add(new Music("006 O Word that goest forth on high", "SONGS OF WORSHIP", R.raw.o_word_that_goes_forth));
        arrayList.add(new Music("007 Wake, awake", "SONGS OF WORSHIP", R.raw.wake_awake));
        arrayList.add(new Music("008 Rorate caeli", "SONGS OF WORSHIP", R.raw.rorate_caeli));
        arrayList.add(new Music("009 Conditor alme siderum", "SONGS OF WORSHIP", R.raw.conditor_alme_siderum));
        arrayList.add(new Music("010 Creator of the stars of night", "SONGS OF WORSHIP", R.raw.creator_of_the_stars));



        adapter = new CustomMusicAdapter(this, R.layout.custom_music_row, arrayList);
        recyclerView.setAdapter(adapter);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        recyclerView.setHasFixedSize(false);

    }

   }

    @Override
    public void onBackPressed() {
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setMessage("Do you want to close Catholic Mass Songs App?")
                .setCancelable(false)
                .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) {
                        Tip1Activity.this.finish();
                    }
                })
                .setNegativeButton("No", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) {
                        dialog.cancel();
                    }
                });
        AlertDialog alert = builder.create();
        alert.show();

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu_options, menu);

        MenuItem menuItem = menu.findItem(R.id.search_view);

        SearchView searchView = (SearchView) menuItem.getActionView();

        searchView.setMaxWidth(Integer.MAX_VALUE);

        searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String query) {
                return false;
            }

            @Override
            public boolean onQueryTextChange(String newText) {

                adapter.getFilter().filter(newText);
                return true;
            }
        });



        return  true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()){

            case R.id.item1:
                Toast.makeText(this, "Settings Selected", Toast.LENGTH_SHORT).show();
                startActivity(new Intent(this, Main2Activity.class));
                return true;

            //do more funtionality here

                


            default:
                return super.onOptionsItemSelected(item);
        }

    }
}

代码错误图片

在适配器中创建一个方法:

public class CustomMusicAdapter extends RecyclerView.Adapter<MyViewHolder> implements Filterable {

    private Context context;
    private int layout;
    private ArrayList<Music> myArraylist;
    private ArrayList<Music> getUserModelListFiltered;
    private static MediaPlayer mediaPlayer;
    private boolean flag=true;


    public CustomMusicAdapter(Context context, int custom_music_row, ArrayList<Music> myArraylist) {
        this.context = context;
        this.layout = layout;
        this.getUserModelListFiltered = myArraylist;
        this.myArraylist = myArraylist;

    }

     public release(){
            mediaPlayer.stop();
            mediaPlayer.release();
     }


    @NonNull
    @Override
    public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        final View itemView = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.custom_music_row, parent, false);
        return new MyViewHolder(itemView);
    }



    @SuppressLint("RecyclerView")
    @Override
    public void onBindViewHolder(@NonNull final MyViewHolder holder, final int position) {
        holder.setIsRecyclable(false);

        final Music music = myArraylist.get(position);
        holder.mTitle.setText(music.getName());
        holder.mDes.setText(music.getSinger());

        //Play Music Setup
        holder.mImageaplay.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                if (flag){
                    mediaPlayer=MediaPlayer.create(context,music.getSong());
                    flag=false;
                }
                if (mediaPlayer.isPlaying()){
                    mediaPlayer.pause();
                    mediaPlayer.start();
                    holder.mImageaplay.setImageResource(R.drawable.ic_play);
                }else {
                    mediaPlayer.start();
                    holder. mImageaplay.setImageResource(R.drawable.ic_pause);
                }
                mediaPlayer.start();

            }
        });

        // stop player
        holder.mImageStop.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (!flag){
                    mediaPlayer.stop();
                    mediaPlayer.release();
                    flag=true;
                }
                holder.mImageaplay.setImageResource(R.drawable.ic_play);
            }
        });

    }

    @Override
    public int getItemCount() {
        return myArraylist.size();
    }

    @Override
    public Filter getFilter() {

        Filter filter = new Filter() {
            @Override
            protected FilterResults performFiltering(CharSequence charSequence) {
                FilterResults filterResults = new FilterResults();
                if (charSequence == null | charSequence.length() == 0){
                    filterResults.count = getUserModelListFiltered.size();
                    filterResults.values = getUserModelListFiltered;
                }else {
                    String searchChr = charSequence.toString().toLowerCase();
                    List<Music> resultData = new ArrayList<>();
                    for (Music music: getUserModelListFiltered){
                        if (music.getName().toLowerCase().contains(searchChr)){
                            resultData.add(music);
                        }
                    }
                    filterResults.count = resultData.size();
                    filterResults.values = resultData;
                }
                return filterResults;
            }

            @Override
            protected void publishResults(CharSequence charSequence, FilterResults filterResults) {

                myArraylist = (ArrayList<Music>) filterResults.values;
                notifyDataSetChanged();

            }
        };
        return filter;
    }

    public class ViewHolder {
        TextView textView_SongName, textView_artist;
        ImageView imageView_play, imageView_stop;
        private View convertview;
        LayoutInflater layoutInflater = (LayoutInflater) context.getSystemService(context.LAYOUT_INFLATER_SERVICE);

        public ViewHolder() {
            convertview = layoutInflater.inflate(layout, null);
            textView_SongName = convertview.findViewById(R.id.textName);
            textView_artist = convertview.findViewById(R.id.txtSinger);
            imageView_play = convertview.findViewById(R.id.ivPlay);
            imageView_stop = convertview.findViewById(R.id.ivStop);

        }
    }
}

覆盖 activity onDestroy() 方法

 public class Tip1Activity extends AppCompatActivity {
        private ArrayList<Music> arrayList;
        private CustomMusicAdapter adapter;
        private RecyclerView recyclerView;
    
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_tip1);
    
    
    
            Button button1 = (Button)findViewById(R.id.mainButton1);
            button1.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent i = new Intent(Tip1Activity.this, MainActivity.class);
                    i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                    startActivity(i);
                    Toast.makeText(Tip1Activity.this, "songs!", Toast.LENGTH_SHORT).show();
                }
            });
    
          
    
            getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
    
            recyclerView =  findViewById(R.id.recyclerViewList);
    
            arrayList = new ArrayList<>();
            arrayList.add(new Music("001 Veni, veni, Emmanuel", "SONGS OF WORSHIP", R.raw.veni_emmanuel));
            arrayList.add(new Music("002 O come. O come Emmanuel", "SONGS OF WORSHIP", R.raw.o_come_emmanuel));
            arrayList.add(new Music("003 Savior of the nations, come", "SONGS OF WORSHIP", R.raw.savior_of_nations));
            arrayList.add(new Music("004 On Jordan's bank the Baptist's cry", "SONGS OF WORSHIP", R.raw.on_jordans_bank));
            arrayList.add(new Music("005 Lo, he comes", "SONGS OF WORSHIP", R.raw.lo_he_comes));
            arrayList.add(new Music("006 O Word that goest forth on high", "SONGS OF WORSHIP", R.raw.o_word_that_goes_forth));
            arrayList.add(new Music("007 Wake, awake", "SONGS OF WORSHIP", R.raw.wake_awake));
            arrayList.add(new Music("008 Rorate caeli", "SONGS OF WORSHIP", R.raw.rorate_caeli));
            arrayList.add(new Music("009 Conditor alme siderum", "SONGS OF WORSHIP", R.raw.conditor_alme_siderum));
            arrayList.add(new Music("010 Creator of the stars of night", "SONGS OF WORSHIP", R.raw.creator_of_the_stars));
    
    
    
            adapter = new CustomMusicAdapter(this, R.layout.custom_music_row, arrayList);
            recyclerView.setAdapter(adapter);
            recyclerView.setLayoutManager(new LinearLayoutManager(this));
            recyclerView.setHasFixedSize(false);
    
        }
    
     
    
    onDestroy() {
      if( adapter !=null ){
        adapter.release()
      }
    }
    
        @Override
        public void onBackPressed() {
            AlertDialog.Builder builder = new AlertDialog.Builder(this);
            builder.setMessage("Do you want to close Catholic Mass Songs App?")
                    .setCancelable(false)
                    .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int id) {
                            Tip1Activity.this.finish();
                        }
                    })
                    .setNegativeButton("No", new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int id) {
                            dialog.cancel();
                        }
                    });
            AlertDialog alert = builder.create();
            alert.show();
    
        }
    
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            getMenuInflater().inflate(R.menu.menu_options, menu);
    
            MenuItem menuItem = menu.findItem(R.id.search_view);
    
            SearchView searchView = (SearchView) menuItem.getActionView();
    
            searchView.setMaxWidth(Integer.MAX_VALUE);
    
            searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
                @Override
                public boolean onQueryTextSubmit(String query) {
                    return false;
                }
    
                @Override
                public boolean onQueryTextChange(String newText) {
    
                    adapter.getFilter().filter(newText);
                    return true;
                }
            });
    
    
    
            return  true;
        }
    
        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
            switch (item.getItemId()){
    
                case R.id.item1:
                    Toast.makeText(this, "Settings Selected", Toast.LENGTH_SHORT).show();
                    startActivity(new Intent(this, Main2Activity.class));
                    return true;
    
                //do more funtionality here
    
                    
    
    
                default:
                    return super.onOptionsItemSelected(item);
            }
    
        }
    }

使用带有 RecyclerView 适配器的界面,这样当您点击播放按钮时,您会在界面中发送原始文件的 ID(例如:R.raw.o_word_that_goes_forth),您可以在 [=14= 中使用命令媒体播放器] 现在 onDistroy 您可以停止媒体播放器的方法。