java - 启动一个 Activity 会停止 Android 服务

标签 java android android-service

我有一个播放音乐的 Android 服务。我使用以下代码开始我的主要 Activity :

Intent service = new Intent(MainMenu.this, musicservice.class);
MainMenu.this.startService(service); 

这是我的服务:

public class musicservice extends Service {
@Override
public IBinder onBind(Intent arg0) {
    return null;
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    super.onStartCommand(intent, flags, startId);

    MediaPlayer mp;
    mp = MediaPlayer.create(musicservice.this, R.raw.music);
    mp.setOnCompletionListener(new OnCompletionListener() {
        public void onCompletion(MediaPlayer mp) {
            mp.release();
        }
    });   
    mp.start();

    return Service.START_STICKY;
}

@Override
public void onDestroy() {
    super.onDestroy();
}

}

它工作正常,但是当我开始另一项 Activity 时,我的音乐响起,似乎我的服务被破坏了!但不希望这样,我希望我的服务仅在我的应用程序结束时停止。仅当用户使用应用程序时才播放音乐。即使应用程序在后台运行,我也希望我的音乐不播放!我如何实现这个?

最佳答案

如果您希望应用程序在 Activity 进行时播放音乐,请尝试 bind it .

它应该看起来像这样:

服务:

package com.example.service;

import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.os.Binder;
import android.os.IBinder;

import com.example.playmusic.R;

public class PlayMusicService extends Service {

    private final IBinder binder = new LocalBinder();

    private MediaPlayer player;

    @Override
    public IBinder onBind(Intent intent) {
        return binder;
    }

    public class LocalBinder extends Binder {

        public PlayMusicService getService() {
            return PlayMusicService.this;
        }
    }

    public void play() {
        player = MediaPlayer.create(this, R.raw.music);
        player.setOnCompletionListener(new OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mp) {
                mp.release();
            }
        });
        player.start();

    }

    public void pause() {
        player.pause();
    }
}

Activity :

package com.example.playmusic;

import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;

import com.example.service.PlayMusicService;
import com.example.service.PlayMusicService.LocalBinder;

public class MainActivity extends Activity {

private PlayMusicService service;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
}

@Override
protected void onPause() {
    super.onPause();
    service.pause();
}

@Override
protected void onStart() {
    super.onStart();
    if (service != null) {
        service.play();
    } else {
        bindService();
    }
}

    private void bindService() {
        bindService(new Intent(this, PlayMusicService.class), new ServiceConnection() {

            @Override
            public void onServiceDisconnected(ComponentName name) {
                service = null;

            }

            @Override
            public void onServiceConnected(ComponentName name, IBinder binder) {
                LocalBinder localBinder = (LocalBinder) binder;
                service = localBinder.getService();
                service.play();

            }
        }, Context.BIND_AUTO_CREATE);
    }

}

关于java - 启动一个 Activity 会停止 Android 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15708061/

相关文章:

java - 使用 wsdl4j 解析 wsdl 以列出操作、输入/输出参数时出现空指针异常

android - 如何在 Android 中停止或销毁 VideoView

独立进程中的 Android 服务

android - 在服务中创建线程做繁重的工作有帮助吗?

android - 警报管理器意外停止

java - if 和 else 语句在 java 的 onClick() 方法中不起作用

java - 在网络浏览器中显示输出

Java varargs 方法参数列表与数组

安卓屏幕分辨率

java - 我尝试使用 Retrofit 将 JSON 解析为 Java