Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/182.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何在我关闭应用程序时继续播放音乐_Android_Android Mediaplayer - Fatal编程技术网

Android 如何在我关闭应用程序时继续播放音乐

Android 如何在我关闭应用程序时继续播放音乐,android,android-mediaplayer,Android,Android Mediaplayer,在安卓系统中,我使用服务和广播接收器播放音乐 当我按下Home(主页)按钮或Back(后退)按钮时,MediaPlayer可以继续播放音乐。但当我将其从概览屏幕中删除时,它无法工作。即使我将服务设置为前台服务 @0xDEADC0DE指出id不应该是0。我修改了它,现在它可以正常工作。但它必须有通知。一些应用程序,如网易云音乐,没有任何通知,即使被杀死也可以播放,它是如何工作的 更新: 我发现我已经关闭了该应用程序的通知,所以当我关闭它时,它似乎仍然在没有通知的情况下播放音乐…所以问题解决了,谢谢

在安卓系统中,我使用服务和广播接收器播放音乐

当我按下Home(主页)按钮或Back(后退)按钮时,MediaPlayer可以继续播放音乐。但当我将其从概览屏幕中删除时,它无法工作。即使我将服务设置为前台服务

@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);
}
}
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(),通知仍然存在。