Android 如何在我关闭应用程序时继续播放音乐
在安卓系统中,我使用服务和广播接收器播放音乐 当我按下Home(主页)按钮或Back(后退)按钮时,MediaPlayer可以继续播放音乐。但当我将其从概览屏幕中删除时,它无法工作。即使我将服务设置为前台服务 @0xDEADC0DE指出id不应该是0。我修改了它,现在它可以正常工作。但它必须有通知。一些应用程序,如网易云音乐,没有任何通知,即使被杀死也可以播放,它是如何工作的 更新: 我发现我已经关闭了该应用程序的通知,所以当我关闭它时,它似乎仍然在没有通知的情况下播放音乐…所以问题解决了,谢谢 这是我的密码: MainActivity.javaAndroid 如何在我关闭应用程序时继续播放音乐,android,android-mediaplayer,Android,Android Mediaplayer,在安卓系统中,我使用服务和广播接收器播放音乐 当我按下Home(主页)按钮或Back(后退)按钮时,MediaPlayer可以继续播放音乐。但当我将其从概览屏幕中删除时,它无法工作。即使我将服务设置为前台服务 @0xDEADC0DE指出id不应该是0。我修改了它,现在它可以正常工作。但它必须有通知。一些应用程序,如网易云音乐,没有任何通知,即使被杀死也可以播放,它是如何工作的 更新: 我发现我已经关闭了该应用程序的通知,所以当我关闭它时,它似乎仍然在没有通知的情况下播放音乐…所以问题解决了,谢谢
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private ImageButton mPlayButton;
private ImageButton mPreviousButton;
private ImageButton mNextButton;
private TextView mMusicName;
private boolean mState = false;
private Intent intent;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mMusicName = (TextView) findViewById(R.id.music_name);
mPlayButton = (ImageButton) findViewById(R.id.play);
mNextButton = (ImageButton) findViewById(R.id.next);
mPreviousButton = (ImageButton) findViewById(R.id.previous);
mPlayButton.setOnClickListener(this);
mNextButton.setOnClickListener(this);
mPreviousButton.setOnClickListener(this);
intent = new Intent(this, MusicService.class);
startService(intent);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.play:
if (!mState) {
//start
mState = true;
mPlayButton.setImageResource(R.mipmap.ic_pause_circle_outline_white_48dp);
Intent intent = new Intent();
intent.setAction("com.geekband.mo.musicplayer");
intent.putExtra("action", 0);
sendBroadcast(intent);
} else {
//pause
mPlayButton.setImageResource(R.mipmap.ic_play_circle_outline_white_48dp);
mState = false;
Intent intent = new Intent();
intent.setAction("com.geekband.mo.musicplayer");
intent.putExtra("action", 1);
sendBroadcast(intent);
}
break;
case R.id.next:
mState = true;
mPlayButton.setImageResource(R.mipmap.ic_pause_circle_outline_white_48dp);
Intent intent = new Intent();
intent.setAction("com.geekband.mo.musicplayer");
intent.putExtra("action", 2);
sendBroadcast(intent);
break;
case R.id.previous:
mState = true;
mPlayButton.setImageResource(R.mipmap.ic_pause_circle_outline_white_48dp);
Intent intent2 = new Intent();
intent2.setAction("com.geekband.mo.musicplayer");
intent2.putExtra("action", 3);
sendBroadcast(intent2);
break;
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == R.id.action_exit) {
stopService(intent);
finish();
return true;
}
return super.onOptionsItemSelected(item);
}
}
public class MusicService extends Service {
private MediaPlayer mPlayer;
private MusicBroadcastReceiver mBroadcastReceiver;
@Override
public void onTaskRemoved(Intent rootIntent) {
Log.d("MusicService", "onTaskRemoved");
}
private void pause() {
if (mPlayer != null) {
mPlayer.pause();
}
}
private void previous() {
if (mPlayer != null) {
mPlayer.release();
}
mPlayer = MediaPlayer.create(MusicService.this, R.raw.loststars);
mPlayer.start();
}
private void next() {
if (mPlayer != null) {
mPlayer.release();
}
mPlayer = MediaPlayer.create(MusicService.this, R.raw.nanshannan);
mPlayer.start();
}
private void start() {
if (mPlayer != null) {
mPlayer.start();
}
}
@Override
public void onCreate() {
super.onCreate();
mBroadcastReceiver = new MusicBroadcastReceiver();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("com.geekband.mo.musicplayer");
registerReceiver(mBroadcastReceiver, intentFilter);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
mPlayer = MediaPlayer.create(MusicService.this, R.raw.loststars);
NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
Notification noti = new Notification.Builder(MusicService.this)
.setContentTitle("play")
.setContentText("playing")
.setSmallIcon(R.mipmap.ic_launcher)
.build();
// manager.notify(0, noti);
// startForeground(0, noti);
startForeground(1, noti);
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
if (mPlayer != null) {
mPlayer.release();
}
super.onDestroy();
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
public class MusicBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
int action = intent.getIntExtra("action",0);
switch (action) {
case 0:
start();
break;
case 1:
pause();
break;
case 2:
next();
break;
case 3:
previous();
break;
}
}
}
}
Service.java
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private ImageButton mPlayButton;
private ImageButton mPreviousButton;
private ImageButton mNextButton;
private TextView mMusicName;
private boolean mState = false;
private Intent intent;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mMusicName = (TextView) findViewById(R.id.music_name);
mPlayButton = (ImageButton) findViewById(R.id.play);
mNextButton = (ImageButton) findViewById(R.id.next);
mPreviousButton = (ImageButton) findViewById(R.id.previous);
mPlayButton.setOnClickListener(this);
mNextButton.setOnClickListener(this);
mPreviousButton.setOnClickListener(this);
intent = new Intent(this, MusicService.class);
startService(intent);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.play:
if (!mState) {
//start
mState = true;
mPlayButton.setImageResource(R.mipmap.ic_pause_circle_outline_white_48dp);
Intent intent = new Intent();
intent.setAction("com.geekband.mo.musicplayer");
intent.putExtra("action", 0);
sendBroadcast(intent);
} else {
//pause
mPlayButton.setImageResource(R.mipmap.ic_play_circle_outline_white_48dp);
mState = false;
Intent intent = new Intent();
intent.setAction("com.geekband.mo.musicplayer");
intent.putExtra("action", 1);
sendBroadcast(intent);
}
break;
case R.id.next:
mState = true;
mPlayButton.setImageResource(R.mipmap.ic_pause_circle_outline_white_48dp);
Intent intent = new Intent();
intent.setAction("com.geekband.mo.musicplayer");
intent.putExtra("action", 2);
sendBroadcast(intent);
break;
case R.id.previous:
mState = true;
mPlayButton.setImageResource(R.mipmap.ic_pause_circle_outline_white_48dp);
Intent intent2 = new Intent();
intent2.setAction("com.geekband.mo.musicplayer");
intent2.putExtra("action", 3);
sendBroadcast(intent2);
break;
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == R.id.action_exit) {
stopService(intent);
finish();
return true;
}
return super.onOptionsItemSelected(item);
}
}
public class MusicService extends Service {
private MediaPlayer mPlayer;
private MusicBroadcastReceiver mBroadcastReceiver;
@Override
public void onTaskRemoved(Intent rootIntent) {
Log.d("MusicService", "onTaskRemoved");
}
private void pause() {
if (mPlayer != null) {
mPlayer.pause();
}
}
private void previous() {
if (mPlayer != null) {
mPlayer.release();
}
mPlayer = MediaPlayer.create(MusicService.this, R.raw.loststars);
mPlayer.start();
}
private void next() {
if (mPlayer != null) {
mPlayer.release();
}
mPlayer = MediaPlayer.create(MusicService.this, R.raw.nanshannan);
mPlayer.start();
}
private void start() {
if (mPlayer != null) {
mPlayer.start();
}
}
@Override
public void onCreate() {
super.onCreate();
mBroadcastReceiver = new MusicBroadcastReceiver();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("com.geekband.mo.musicplayer");
registerReceiver(mBroadcastReceiver, intentFilter);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
mPlayer = MediaPlayer.create(MusicService.this, R.raw.loststars);
NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
Notification noti = new Notification.Builder(MusicService.this)
.setContentTitle("play")
.setContentText("playing")
.setSmallIcon(R.mipmap.ic_launcher)
.build();
// manager.notify(0, noti);
// startForeground(0, noti);
startForeground(1, noti);
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
if (mPlayer != null) {
mPlayer.release();
}
super.onDestroy();
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
public class MusicBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
int action = intent.getIntExtra("action",0);
switch (action) {
case 0:
start();
break;
case 1:
pause();
break;
case 2:
next();
break;
case 3:
previous();
break;
}
}
}
}
如果您从任务切换器中删除服务,或者当您终止应用程序时,您的服务将与应用程序的所有其他资源一样终止。通过从任务切换器中终止/删除它,进程停止。您的服务将在同一过程中使用,因此也将停止。这就是安卓(和其他操作系统)的工作原理 编辑
这确实是可能的,但根据文档,您不应使用ID为0的
startForeground
:
注意:您给startForeground()的整数ID不能为0
但其他音乐播放器即使被移除也可以播放,他们如何做到这一点?我在Sony Xperia Z3上用默认音乐播放器进行了尝试,当我从任务切换程序中移除应用程序时,音乐立即停止。如果可能的话,我不知道其他应用程序是如何做到这一点的。可能是因为广播或类似的原因而重新启动。我正在使用一个名为“网易云音乐”的音乐应用程序,当我杀死它时,它仍然可以工作。我查阅了
startForeground
的文档。看起来您是对的,而且这是可能的,但是文档中规定您不能使用0作为ID:注意:您给startForeground()的整数ID不能是0()。因此,我建议使用不同的ID,根据文档,它应该可以正常工作,实际上不应该是0。但它必须有一个通知。该应用程序没有任何通知,但它仍然可以这样做,为什么?你不能通过强制关闭应用程序来播放音乐。。将应用程序从任务切换程序中滑出与强制关闭不同。系统将尝试完成所有活动,并为运行的任何服务调用onTaskRemoved。。你应该实现onTaskRemoved,而不是让它终止你的服务。我重写了onTaskRemoved,在我刷应用程序时确实会调用它。但它不起作用,音乐停止了。请尝试将startForeground放在onStartCommand中,而不是onCreate()。此外,我不认为您需要使用notify()调用notify()。即使我没有调用notify(),通知仍然存在。