代码之家  ›  专栏  ›  技术社区  ›  Yousha Bin Arif

从通知导航到活动时丢失活动的状态

  •  0
  • Yousha Bin Arif  · 技术社区  · 4 年前

    我有个活动叫 玩家活动 其中,我使用MediaPlayerAPI来播放音乐。每当创建“我的活动”时,都会显示一个通知,其中包含对音乐播放器的一些基本控制。

    Notification

    所以当我点击我的通知时它会跳回到 玩家活动 ,但活动的状态已丢失。

    点击通知前:

    Before tapping Notification

    点击通知后:

    After tapping Notification

    这是我的通知待定意图的代码

    Intent notifyIntent = new Intent(context, PlayerActivity.class);
        notifyIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
        notifyIntent.setAction("android.intent.action.MAIN");
        notifyIntent.addCategory("android.intent.category.LAUNCHER");
        PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, notifyIntent, PendingIntent.FLAG_UPDATE_CURRENT);
    

    以下是playerActivity.java的代码:

        package com.example.user.musicplayer;
    
    import android.app.ProgressDialog;
    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    import android.media.MediaMetadataRetriever;
    import android.media.MediaPlayer;
    import android.os.AsyncTask;
    import android.os.Handler;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.MotionEvent;
    import android.view.View;
    import android.widget.Button;
    import android.widget.ImageButton;
    import android.widget.SeekBar;
    import android.widget.TextView;
    import android.widget.Toast;
    
    import com.squareup.picasso.Picasso;
    
    import java.util.concurrent.TimeUnit;
    
    import de.hdodenhof.circleimageview.CircleImageView;
    
    public class PlayerActivity extends AppCompatActivity implements MediaPlayer.OnBufferingUpdateListener,MediaPlayer.OnCompletionListener{
    
        private static Button btn_play_pause;
        private  Button btnToggleRepeat;
        private  Button btnStop;
        private SeekBar seekBar;
        private TextView textView;
    
    
        public static MediaPlayer mediaPlayer;
        private int mediaFileLength;
        private int realtimeLength;
        private String musicUrl;
        private String imageUrl;
        final Handler handler = new Handler();
        private boolean isRepeat;
        private CircleImageView musicImage;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_player);
            Log.d("TAG", "onCreate");
            NotificationGenerator.customBigNotification(getApplicationContext());
    
            musicUrl = getIntent().getStringExtra("musicUrl");
            imageUrl = getIntent().getStringExtra("imageUrl");
            seekBar = (SeekBar)findViewById(R.id.seekbar);
            seekBar.setMax(99); // 100% (0~99)
            seekBar.setOnTouchListener(new View.OnTouchListener() {
                @Override
                public boolean onTouch(View v, MotionEvent event) {
                    if(mediaPlayer.isPlaying())
                    {
                        SeekBar seekBar = (SeekBar)v;
                        int playPosition = (mediaFileLength/100)*seekBar.getProgress();
                         mediaPlayer.seekTo(playPosition);
                    }
                    return false;
                }
            });
    
            textView = (TextView)findViewById(R.id.txtTime);
            btnToggleRepeat = findViewById(R.id.btnRepeat);
            btnStop = findViewById(R.id.btnStop);
            musicImage = findViewById(R.id.musicImgView);
    
            Picasso.get().load(imageUrl).placeholder(R.drawable.music).error(R.drawable.music).into(musicImage);
    
            btn_play_pause = (Button) findViewById(R.id.btnTogglePlay);
            btn_play_pause.setOnClickListener(new View.OnClickListener() {
    
                @Override
                public void onClick(View v) {
    
                    final ProgressDialog mDialog = new ProgressDialog(PlayerActivity.this);
    
    
                    AsyncTask<String,String,String> mp3Play = new AsyncTask<String, String, String>() {
    
                        @Override
                        protected void onPreExecute() {
                            mDialog.setMessage("Please wait");
                            mDialog.show();
                        }
    
                        @Override
                        protected String doInBackground(String... params) {
                            try{
                                mediaPlayer.setDataSource(params[0]);
                                mediaPlayer.prepare();
                            }
                            catch (Exception ex)
                            {
                            }
                            return "";
                        }
    
                        @Override
                        protected void onPostExecute(String s) {
                            mediaFileLength = mediaPlayer.getDuration();
                            realtimeLength = mediaFileLength;
                            if(!mediaPlayer.isPlaying())
                            {
                                playMusic();
                            }
                            else
                            {
                                pauseMusic();
                            }
    
                            updateSeekBar();
                            mDialog.dismiss();
                        }
                    };
    
    
                    mp3Play.execute(musicUrl); // direct link mp3 file
    
                }
            });
    
    
    
            btnToggleRepeat.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if(isRepeat){
                        isRepeat = false;
                        mediaPlayer.setLooping(false);
                        btnToggleRepeat.setText("Repeat");
                    }
                    else{
                        isRepeat = true;
                        mediaPlayer.setLooping(true);
                        btnToggleRepeat.setText("Single");
    
                    }
                }
            });
    
            btnStop.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    try {
                        mediaPlayer.pause();
                        mediaPlayer.stop();
    
                    }
                    catch (Exception e){
                        Toast.makeText(PlayerActivity.this, "Opps! sorry something bad happened", Toast.LENGTH_SHORT).show();
                    }
    
                }
            });
    
    
            mediaPlayer = new MediaPlayer();
            mediaPlayer.setOnBufferingUpdateListener(this);
            mediaPlayer.setOnCompletionListener(this);
    
    
        }
    
        public void pauseMusic() {
            mediaPlayer.pause();
            btn_play_pause.setText("Play");
        }
    
        public  void playMusic() {
            mediaPlayer.start();
            btn_play_pause.setText("Pause");
        }
    
    
        private void updateSeekBar() {
            seekBar.setProgress((int)(((float)mediaPlayer.getCurrentPosition() / mediaFileLength)*100));
            if(mediaPlayer.isPlaying())
            {
                Runnable updater = new Runnable() {
                    @Override
                    public void run() {
                        updateSeekBar();
                        realtimeLength-=1000; // declare 1 second
                        textView.setText(String.format("%d:%d",TimeUnit.MILLISECONDS.toMinutes(realtimeLength),
                                TimeUnit.MILLISECONDS.toSeconds(realtimeLength) -
                                        TimeUnit.MILLISECONDS.toSeconds(TimeUnit.MILLISECONDS.toMinutes(realtimeLength))));
    
                    }
    
                };
                handler.postDelayed(updater,1000); // 1 second
            }
        }
    
        @Override
        protected void onResume() {
            super.onResume();
            Log.d("TAG", "onResume");
        }
    
        @Override
        protected void onStart() {
            super.onStart();
            Log.d("TAG", "onStart");
        }
    
        @Override
        public void onBufferingUpdate(MediaPlayer mp, int percent) {
            seekBar.setSecondaryProgress(percent);
        }
    
        @Override
        public void onCompletion(MediaPlayer mp) {
            if(!mediaPlayer.isLooping())
                btn_play_pause.setText("Play");
    
        }
    
        @Override
        protected void onStop() {
            super.onStop();
    
        }
    
    
        @Override
        protected void onPause() {
            super.onPause();
        }
    
        public static class DownloadCancelReceiver extends BroadcastReceiver {
    
            @Override
            public void onReceive(Context context, Intent intent) {
    
                Log.d("notificationPlayer","Received Cancelled Event");
            }
        }
    }
    

    提前谢谢。如果解释不清楚请原谅,因为如果我有合适的词来解释,我会用谷歌搜索。

    1 回复  |  直到 4 年前
        1
  •  1
  •   Shrey Garg    4 年前

    将此添加到 PlayerActivity 清单中的活动:

    android:launchMode="singleTask"
    

    并使用这些旗子来悬挂:

    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);