如果应用程序是onStop Android,背景音乐不会停止

时间:2017-09-29 19:23:31

标签: java android

我创建了一项通过我的活动播放音乐的服务。我有2个活动和一个splashScreen。我从第一个活动开始服务,点击一些项目我去第二个活动。音乐播放正常,但当我把我的应用程序放在后台或我锁定手机或我在另一个应用程序时,我仍然听到声音。我不能把stopService放在onStop上,因为如果我去第二次活动,音乐就会停止。

这是我的服务音乐课程:

public class BackgroundMusicService extends Service {
MediaPlayer player;

public IBinder onBind(Intent arg0) {

    return null;
}

@Override
public void onCreate() {
    super.onCreate();


    player = MediaPlayer.create(this, R.raw.game_music);
    player.setLooping(true);
    player.setVolume(10, 10);
    player.start();

}

public int onStartCommand(Intent intent, int flags, int startId) {


    player.start();

    return 1;
}



@Override
public void onDestroy() {

    player.stop();
    player.release();
}

@Override
public void onLowMemory() {

}

}

和:

       public class Activity1 extends AppCompatActivity implements View.OnClickListener{
          protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_1);
                     Intent   backgSound = new Intent(Activity1.this, BackgroundMusicService.class);
        startService(backgSound);
        Button b1 = (Button) findViewById(R.id.b1);
        b1.setOnClickListener(this);


            } 

    @Override
   public void onDestroy() {
    super.onDestroy();
    Intent   backgSound = new Intent(Activity1.this, BackgroundMusicService.class);
        stopService(backgSound);
    }

        @Override
       public void onClick(View v) {
          startActivity(new Intent(this,Activity2.class);
        }

第二个活动只是一个视图(用于测试)。

如果我的应用程序处于后台或手机已锁定,我怎样才能将声音保留在这两个活动上并停止播放。

我试图在onStop中停止服务,然后在onResume中启动startService,但它在活动之间不起作用。

2 个答案:

答案 0 :(得分:0)

众所周知,X-Amz-Date并非始终在调用,将onDestroy操作移至onDestroy()方法将起作用:

  

注意:不要指望将此方法称为保存数据的地方!例如,如果某个活动正在编辑内容提供程序中的数据,那么这些编辑应该在onPause()或onSaveInstanceState(Bundle)中提交,而不是在此处。通常实现此方法是为了释放与活动相关联的线程之类的资源,以便在其应用程序的其余部分仍在运行时,被破坏的活动不会留下这些东西。在某些情况下,系统会在不调用此方法(或其他任何方法)的情况下简单地终止活动的托管过程,因此不应该使用它来执行在过程消失后仍然存在的事情。

More info here.

您需要详细了解Android的基础知识。

问候。

答案 1 :(得分:0)

根据您的需要判断,您需要对MediaPlayer对象的启动和停止进行更细粒度的控制。一个简单的解决方案是添加intent-filters和类似的操作:

public class BackgroundMusicService extends Service {

    public static final String ACTION_START_MUSIC = "package_name.action_start_music";
    public static final String ACTION_STOP_MUSIC = "package_name.action_stop";

    private MediaPlayer player;

    public IBinder onBind(Intent arg0) {

        return null;
    }

    @Override
    public void onCreate() {
        super.onCreate();

        player = MediaPlayer.create(this, R.raw.game_music);
        player.setLooping(true);
        player.setVolume(10, 10);

    }

    public int onStartCommand(Intent intent, int flags, int startId) {
        if(intent.getAction() != null){
            switch (intent.getAction()){
                case ACTION_START_MUSIC :
                    if(!player.isPlaying()){
                          player.start();
                    }
                    break;
                case ACTION_STOP_MUSIC :
                    if(player.isPlaying()) {
                         player.stop();
                    }
                    break;
                default: break;
            }
        }
        return START_STICKY;
    }



    @Override
    public void onDestroy() {
       player.release();
    }

    @Override
    public void onLowMemory() {

    }
}

更新您的清单:

<service android:name=".BackgroundMusicService"
        android:exported="false">
        <intent-filter>
        <action android:name="package_name.action_start_music" />
        <action android:name="package_name.action_stop" />
    </intent-filter>
</service>

使用:

startService(new Intent(BackgroundMusicService.ACTION_START_MUSIC));

startService(new Intent(BackgroundMusicService.ACTION_STOP_MUSIC));