【问题标题】:How to continue playing music when I killed App杀死App时如何继续播放音乐
【发布时间】: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


【解决方案1】:

如果您将服务从任务切换器中移除或终止应用程序,您的服务会像应用程序的所有其他资源一样被终止。通过从任务切换器中杀死/删除它,进程停止。您的服务存在于同一进程中,因此也会停止。这就是 Android(和其他操作系统)的工作原理。

编辑
这确实是可能的,但是根据文档,您不应该使用 ID 为 0 的startForeground

注意:给 startForeground() 的整数 ID 不能为 0。

http://developer.android.com/guide/components/services.html#Foreground

【讨论】:

  • 但是其他的MusicPlayer即使被移除了仍然可以播放,他们是怎么做到的?
  • 好吧,我在 Sony Xperia Z3 上使用默认音乐播放器进行了尝试,当我从任务切换器中删除应用程序时,音乐立即停止。我不知道其他应用程序是如何做到的,如果可能的话。可能是由于广播或类似的事情而重新启动了
  • 我在用一个叫网易云音乐的音乐应用,我杀了它还能用..
  • 我查看了startForeground 的文档。看起来您是对的,并且有可能,但文档指出您不能使用 0 作为 ID: 注意:您提供给 startForeground() 的整数 ID 不能为 0 (developer.android.com/guide/components/services.html#Foreground)。所以我建议使用不同的 ID 并根据文档它应该可以工作
  • 嗯,确实不应该是0,但是必须有通知。那个App没有通知,还能这样,为什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多