我正试着在android上做一个抽搐脚趾游戏。它也有一些变体。我创建了一个后台服务类。相同的代码如下所示。
package com.sudarshan.tictactoenew;
import android.content.Intent;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Bundle;
import android.os.IBinder;
import android.app.Service;
import android.util.Log;
public class BackgroundSoundService extends Service {
private static final String TAG = null;
// Intent intent;
MediaPlayer mp;
public IBinder onBind(Intent arg0) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
}
public int onStartCommand(Intent intent, int flags, int startId) {
mp = new MediaPlayer();
Bundle extras = intent.getExtras();
String itemname = (String) extras.get("itemname");
Log.i("Itemname",itemname);
if(itemname.equals("menupage"))
{
String filename = "android.resource://" + this.getPackageName() + "/raw/got";
try {
mp.setDataSource(this, Uri.parse(filename));
mp.prepareAsync();
mp.setLooping(true); // Set looping
mp.setVolume(100,100);
mp.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
mp.start();
}
});
;
} catch(Exception e){
e.printStackTrace();
}
// = MediaPlayer.create(this, R.raw.got);
// player1.start();
}
else if(itemname.equals("classictictactoe"))
{
Log.i("Inside","Inside classic tic tac toe");
String filename = "android.resource://" + this.getPackageName() + "/raw/cof";
try {
mp.setDataSource(this, Uri.parse(filename));
mp.prepareAsync();
mp.setLooping(true); // Set looping
mp.setVolume(100,100);
mp.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
mp.start();
}
});
} catch(Exception e){
e.printStackTrace();
}
}
return startId;
}
public void onStart(Intent intent, int startId) {
// TO DO
}
public IBinder onUnBind(Intent arg0) {
// TO DO Auto-generated method
return null;
}
public void onStop() {
}
public void onPause() {
}
@Override
public void onDestroy() {
mp.stop();
mp.release();
}
@Override
public void onLowMemory() {
}
}
这段代码不会被执行Log.i( "Inside ",“inin古典toe");下面是我的日志文件的一部分
2022-10-02 21:44:36.475 13019-13019 Itemname com.sudarshan.tictactoenew I menupage
2022-10-02 21:45:01.080 13019-13019 Itemname com.sudarshan.tictactoenew I classictictactoe
2022-10-02 21:57:39.288 13019-13019 Itemname com.sudarshan.tictactoenew I menupage
2022-10-02 21:57:46.764 13019-13019 Itemname com.sudarshan.tictactoenew I classictictactoe
2022-10-02 21:57:57.114 13019-13019 Itemname com.sudarshan.tictactoenew I menupage
2022-10-02 21:58:03.626 13019-13019 Itemname com.sudarshan.tictactoenew I menupage
2022-10-02 21:58:08.837 13019-13019 Itemname com.sudarshan.tictactoenew I classictictactoe
---------------------------- PROCESS ENDED (13019) for package com.sudarshan.tictactoenew ----------------------------
---------------------------- PROCESS STARTED (13341) for package com.sudarshan.tictactoenew ----------------------------
---------------------------- PROCESS ENDED (13341) for package com.sudarshan.tictactoenew ----------------------------
---------------------------- PROCESS STARTED (13430) for package com.sudarshan.tictactoenew ----------------------------
2022-10-02 21:59:31.086 13430-13430 Itemname com.sudarshan.tictactoenew I menupage
2022-10-02 21:59:36.137 13430-13430 Itemname com.sudarshan.tictactoenew I classictictactoe
男人和古典主义都是活动。音乐应该在活动开始时播放(无论是活动还是古典音乐),但当活动古典音乐开始时,音乐不播放,只有当活动活动开始时,音乐才会播放。
//古典主义活动相关代码的一部分
Intent intent = new Intent(ClassicTicToe.this, BackgroundSoundService.class);
intent.putExtra("itemname","classictictactoe");
startService(intent);
//有关活动守则的部分
i = new Intent(MenuPage.this, BackgroundSoundService.class);
i.putExtra("itemname","menupage");
startService(i);
我不明白为什么两种活动中的音乐都不演奏。
我在原始文件夹中有音乐文件cof.mp3和got.mp3
发布于 2022-10-05 05:37:35
发布于 2022-10-05 09:05:20
我已经测试了您的代码,在您在onStartCommand()
of BackgroundSoundService中做了以下更改之后,它就可以工作了:
public int onStartCommand(Intent intent, int flags, int startId) {
if(mp == null){
mp = new MediaPlayer();
}
else{
mp.reset();
}
Bundle extras = intent.getExtras();
String itemname = (String) extras.get("itemname");
...
...
return START_STICKY;
}
第一次从MenuPage活动启动服务时,它会创建一个新的MediaPlayer
实例,并播放第一个音乐(got.mp3)。稍后,当您想用不同的意图数据从ClassicTicToe活动重新启动服务时,它使用reset()
方法重置现有的MediaPlayer
实例,然后播放第二个音乐(cof.mp3)。此外,我还根据START_STICKY
的文档将返回id更改为onStartCommand。
返回值指示系统应该对服务的当前启动状态使用什么语义。它可能是与START_CONTINUATION_MASK位相关联的常量之一。值是START_STICKY_COMPATIBILITY、START_STICKY、START_NOT_STICKY或START_REDELIVER_INTENT。
因此,在您的例子中,最好是START_STICKY
,因为您有一个服务正在执行背景音乐播放。根据粘稠的文档
这种模式对于将显式启动并停止运行任意一段时间的事情是有意义的,例如执行背景音乐播放的服务。
另外,当您使用活动中的stopService()
或BackgroundSoundService中的stopSelf()
完成服务任务时,不要忘记停止服务来释放资源。
https://stackoverflow.com/questions/73927714
复制相似问题