Java 从通知导航到活动时丢失活动的状态
我有一个名为Player activity的活动,在这个活动中,我在MediaPlayer API的帮助下播放音乐。每当创建“我的活动”时,都会显示一条通知,该通知对音乐播放器有一些基本的控制 因此,当我点击我的通知时,它会跳回玩家活动,但活动的状态会丢失 在点击通知之前: 点击通知后: 以下是我的通知的待定意图代码Java 从通知导航到活动时丢失活动的状态,java,android,android-notifications,Java,Android,Android Notifications,我有一个名为Player activity的活动,在这个活动中,我在MediaPlayer API的帮助下播放音乐。每当创建“我的活动”时,都会显示一条通知,该通知对音乐播放器有一些基本的控制 因此,当我点击我的通知时,它会跳回玩家活动,但活动的状态会丢失 在点击通知之前: 点击通知后: 以下是我的通知的待定意图代码 Intent notifyIntent = new Intent(context, PlayerActivity.class); notifyIntent.setFl
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");
}
}
}
package com.example.user.musicplayer;
导入android.app.ProgressDialog;
导入android.content.BroadcastReceiver;
导入android.content.Context;
导入android.content.Intent;
导入android.media.MediaMetadataRetriever;
导入android.media.MediaPlayer;
导入android.os.AsyncTask;
导入android.os.Handler;
导入android.support.v7.app.AppActivity;
导入android.os.Bundle;
导入android.util.Log;
导入android.view.MotionEvent;
导入android.view.view;
导入android.widget.Button;
导入android.widget.ImageButton;
导入android.widget.SeekBar;
导入android.widget.TextView;
导入android.widget.Toast;
导入com.squareup.picasso.picasso;
导入java.util.concurrent.TimeUnit;
导入de.hdodenhof.circleimageview.circleimageview;
公共类PlayerActivity扩展AppCompativeActivity实现MediaPlayer.OnBufferingUpdateListener、MediaPlayer.OnCompletionListener{
私人静态按钮btn\u播放\u暂停;
私人按钮btnToggleRepeat;
私人按钮btnStop;
私人SeekBar SeekBar;
私有文本视图文本视图;
公共静态媒体播放器;
私有int mediaFileLength;
私有整数实时长度;
私人弦乐曲;
私有字符串imageUrl;
最终处理程序=新处理程序();
私有布尔isRepeat;
私人音乐圈;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u播放器);
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(新视图.OnTouchListener(){
@凌驾
公共布尔onTouch(视图v,运动事件){
if(mediaPlayer.isPlaying())
{
SeekBar SeekBar=(SeekBar)v;
int playPosition=(mediaFileLength/100)*seekBar.getProgress();
mediaPlayer.seekTo(播放位置);
}
返回false;
}
});
textView=(textView)findViewById(R.id.txtTime);
btnToggleRepeat=findviewbyd(R.id.btnRepeat);
btnStop=findviewbyd(R.id.btnStop);
musicImage=findviewbyd(R.id.musicImgView);
Picasso.get().load(imageUrl).placeholder(R.drawable.music).error(R.drawable.music).into(musicImage);
btn_play_pause=(按钮)findViewById(R.id.btnTogglePlay);
btn_play_pause.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
final ProgressDialog mDialog=新建ProgressDialog(PlayerActivity.this);
AsyncTask mp3Play=新建AsyncTask(){
@凌驾
受保护的void onPreExecute(){
mDialog.setMessage(“请稍候”);
mDialog.show();
}
@凌驾
受保护的字符串doInBackground(字符串…参数){
试一试{
mediaPlayer.setDataSource(参数[0]);
mediaPlayer.prepare();
}
捕获(例外情况除外)
{
}
返回“”;
}
@凌驾
受保护的void onPostExecute(字符串s){
mediaFileLength=mediaPlayer.getDuration();
realtimeLength=mediaFileLength;
如果(!mediaPlayer.isPlaying())
{
播放音乐();
}
其他的
{
pauseMusic();
}
updateSeekBar();
mDialog.discouse();
}
};
mp3Play.execute(musicUrl);//直接链接mp3文件
}
});
btnToggleRepeat.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
如果(isRepeat){
isRepeat=false;
mediaPlayer.setLooping(false);
btnToggleRepeat.setText(“重复”);
}
否则{
isRepeat=true;
mediaPlayer.setLooping(true);
btnToggleRepeat.setText(“单一”);
}
}
});
btnStop.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
试一试{
mediaPlayer.pause();
mediaPlayer.stop();
}
捕获(例外e){
Toast.makeText(PlayerActivity.this,“Opps!抱歉发生了不好的事情”,Toast.LENGTH\u SHORT.show();
}
}
});
mediaPlayer=新媒体播放器
android:launchMode="singleTask"
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);