Хорошо, я сделал Service
, чтобы мой музыкальный проигрыватель мог работать во всех моих действиях. По крайней мере, это был план.
Я могу связываться со своим служением в некоторых из моих действий, но в других делах связывание, похоже, ничего не делает.
Настройка
Мой сервис запускается на главном экране:
startService(new Intent(this, MusicService.class));
Я пытаюсь связать это с несколькими другими действиями. Список действий выглядит так:
MainScreen -> FillerActivity -> привязка к сервису -> Работает
MainScreen -> AlbumList -> SongList -> SingleSong -> привязка к сервису -> не работает
В чем может быть причина того, что привязка работает в классе FillerActivity, но не работает в классе SingleSong?
Мой код выглядит следующим образом:
Наполнитель
public class Filler extends Activity {
private MusicService s;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.filler);
doBindService();
Button b = (Button) findViewById(R.id.terug);
b.setOnClickListener(new View.OnClickListener() {
public void onClick(View arg0) {
Intent intent = new Intent();
setResult(RESULT_OK, intent);
finish();
}
});
}
public void startSong(View view){
if(s != null){
s.startSong(s.songPlaying);
System.out.println("Song started");
}
}
public void stopSong(View view){
if(s != null){
s.stopSong();
System.out.println("Song paused");
}
}
private ServiceConnection mConnection = new ServiceConnection() {
public void onServiceConnected(ComponentName className, IBinder binder) {
s = ((MusicService.MyBinder) binder).getService();
Toast.makeText(Filler.this, "Connected",
Toast.LENGTH_SHORT).show();
System.out.println("s is gevuld");
}
public void onServiceDisconnected(ComponentName className) {
s = null;
}
};
void doBindService() {
bindService(new Intent(this, MusicService.class), mConnection,
Context.BIND_AUTO_CREATE);
}
}
SingleSong
public class SingleSongInfo extends Activity {
private MediaDetail mDetails;
private TextView textView;
boolean playing = false;
private String songURL;
private MusicService s;
Button b;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.album_song_info);
Bundle bun = getIntent().getExtras();
doBindService();
if (s != null) {
System.out.println("S filled");
} else {
System.out.println("S empty");
}
b = (Button) findViewById(R.id.playButtonSongPage);
mDetails = (MediaDetail) bun.getSerializable("details");
if (mDetails != null) {
System.out.println("Details gevuld");
songURL = mDetails.getSong_url();
setUpTextViews();
setUpImage();
b.setOnClickListener(new View.OnClickListener() {
public void onClick(View arg0) {
}
});
}
}
public void buttonPressed(View view) {
if (s != null) {
if (!s.isPlaying()) {
s.startSong(songURL);
b.setBackgroundResource(R.drawable.button_pause);
} else {
s.stopSong();
b.setBackgroundResource(R.drawable.button_play);
}
} else {
System.out.println("S is leeg");
}
}
private ServiceConnection mConnection = new ServiceConnection() {
public void onServiceConnected(ComponentName className, IBinder binder) {
s = ((MusicService.MyBinder) binder).getService();
Toast.makeText(SingleSongInfo.this, "Connected", Toast.LENGTH_SHORT)
.show();
}
public void onServiceDisconnected(ComponentName className) {
s = null;
}
};
void doBindService() {
bindService(new Intent(this, MusicService.class), mConnection,
Context.BIND_AUTO_CREATE);
}
}
Любая помощь очень ценится.
Интересное открытие после еще нескольких испытаний.
Когда я вызываю класс SingleSong непосредственно из MainScreen, объект MediaService
s
заполняется и может использоваться. Он даже печатает сообщение, что он был заполнен.
Однако, когда класс SingleSong открывается через SongList (который открывает класс SingleSong в представлении табуляции с некоторыми другими классами), объект, который не заполняется. НО, и вот где это странно, он не печатает сообщение о том, что объект НЕ был заполнен, хотя и должен. Код для этого можно найти ниже.
Что может быть причиной того, что код полностью не запускается в tabView?
Используемый код:
private ServiceConnection mConnection = new ServiceConnection() {
public void onServiceConnected(ComponentName className, IBinder binder) {
s = ((MusicService.MyBinder) binder).getService();
Toast.makeText(SingleSongInfo.this, "Connected", Toast.LENGTH_SHORT)
.show();
if (s != null) {
System.out.println("S filled"); // works when calling class directly
} else {
System.out.println("S empty"); // Does not print when object is empty when class is called through SongList (tabview)
}
}
public void onServiceDisconnected(ComponentName className) {
s = null;
}
};