【发布时间】:2016-02-11 13:33:18
【问题描述】:
在 Android 中,我使用 Service 和 BroadcastReceiver 来播放音乐。
当我按下主页按钮或返回按钮时,MediaPlayer 可以继续播放音乐。但是当我从概览屏幕中删除它时它就无法工作。即使我将服务设置为前台服务。 p>
@0xDEADC0DE指出id不应该是0。我修改了一下,现在可以正常使用了'没有任何通知,即使被杀死也可以播放,它是如何工作的?
更新: 我发现我已经关闭了那个应用的通知,所以当我杀死它时它似乎仍在播放音乐而没有通知......所以问题解决了,谢谢
这是我的代码:
MainActivity.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);
}
}
Service.java ,
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;
}
}
}
}
【问题讨论】:
-
您无法通过强制关闭应用来播放音乐。将应用从任务切换器上滑开与强制关闭不同。系统将尝试完成所有活动,并为所有正在运行的服务调用 onTaskRemoved。你应该实现 onTaskRemoved 并且不要让它杀死你的服务。
-
我覆盖了onTaskRemoved,当我刷应用程序时确实会调用它。但它不起作用,音乐停止了。
-
尝试将 startForeground 放入 onStartCommand 而不是 onCreate()。另外我认为您需要使用通知调用 notify() ..
-
即使我没有调用 notify(),通知仍然存在。
标签: android android-mediaplayer