Потеря состояния активности при переходе от уведомления к активности - PullRequest
0 голосов
/ 26 октября 2019

У меня есть действие с именем Активность игрока , в котором я транслирую музыку с помощью MediaPlayer API. Всякий раз, когда моя деятельность создается, отображается уведомление, которое имеет некоторый базовый контроль над музыкальным проигрывателем.

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 Ответ

1 голос
/ 26 октября 2019

Добавьте это к вашему PlayerActivity действию в манифесте:

android:launchMode="singleTask"

И используйте эти флаги в намерении для pendingintent:

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