Доброе утро Все,Binding в услужении неприятности
Сейчас я ПОСТРОЕНИЕ медиа-плеер для Android, и у меня возникли проблемы связывания моей службы игрока к деятельности и вытягивать из него данные. Потерпите меня ... много кода.
Мой код ---
Интерфейс:
interface MyInterface{
void playFile(in String file);
void shuffle();
String getPlayingData();
}
Услуги:
public class MyService extends Service {
public Context context;
public static String nowPlayingData = null;
@Override
public IBinder onBind(Intent intent) {
return mBinder;
}
private final MyInterface.Stub mBinder = new MyInterface.Stub() {
public void playFile(String file) throws DeadObjectException {
//Song playing method working great!
}
public void shuffle()throws DeadObjectException {
//This method picks a random song and passes it to nowPlayingData string
}
public String getPlayingData() throws RemoteException {
return nowPlayingData;
}
};
@Override
public void onCreate() {
//Toast.makeText(this, "My Service Created", Toast.LENGTH_LONG).show();
Log.d(TAG, "onCreate");
mp.setLooping(false); // Set looping
}
@Override
public void onDestroy() {
//Toast.makeText(this, "My Service Stopped", Toast.LENGTH_LONG).show();
Log.d(TAG, "onDestroy");
mp.stop();
}
@Override
public void onStart(Intent intent, int startid) {
//Toast.makeText(this, "My Service Started", Toast.LENGTH_LONG).show();
Log.d(TAG, "onStart");
}
}
Основной экран Активность, в случайном порядке Кнопка:
Сервис запущен в OnCreate. Когда я нажимаю кнопку тасования, он использует метод в службе для воспроизведения случайной песни, тем самым устанавливая строку nowPlayingData.
public class mainMenu extends Activity {
private MyInterface mInterface;
private ServiceToken mToken;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Intent startedSvc = new Intent(mainMenu.this, MyService.class);
boolean success = this.bindService(
startedSvc, svcConn, Context.BIND_AUTO_CREATE);
this.startService(startedSvc);
findViewById(R.id.shuffle).setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
try {
sInterface.shuffle();
} catch (RemoteException e) {
e.printStackTrace();
}
Intent play_screen = new Intent(MyPlayer.getContext(), NowPlaying.class);
startActivity(play_screen);
}
Игрок Активность:
Я хочу, чтобы привязать к службе, и тянуть nowPlayingData по сравнению с использованием интерфейсов getPlayingData метода.
public class NowPlaying extends Activity implements OnClickListener {
public static String nowPlayingData = null;
MyInterface mInterface;
boolean isConnected = false;
RemoteServiceConnection conn = null;
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.now_playing);
setVolumeControlStream(AudioManager.STREAM_MUSIC);
Log.i("Log", "Player Loaded");
bindService();
getData();
fillView();
}
public void fillView(){
//This method needs the nowPlayingData string to update the view
}
class RemoteServiceConnection implements ServiceConnection {
public void onServiceConnected(ComponentName className,
IBinder boundService) {
mInterface = MyInterface.Stub.asInterface((IBinder)boundService);
isConnected = true;
Log.d("Now Playing", "Service Connected");
}
public void onServiceDisconnected(ComponentName className) {
sInterface = null;
// updateServiceStatus();
isConnected = false;
Log.d(getClass().getSimpleName(), "onServiceDisconnected");
getData();
}
};
private void bindService() {
if(conn == null) {
conn = new RemoteServiceConnection();
Intent i = new Intent();
i.setClassName("com.musicplayer.MyPlayer", "com.musicplayer.MyPlayer.MyService");
bindService(i, conn, Context.BIND_AUTO_CREATE);
Log.d(getClass().getSimpleName(), "bindService()");
} else {
Toast.makeText(NowPlaying.this, "Cannot bind - service already bound", Toast.LENGTH_SHORT).show();
}
}
private void getData() {
if(conn == null) {
Log.i("getData", "No Connection");
} else {
try {
String data = mInterface.getPlayingData();
Log.i("Data Recieved", data);
Log.d(getClass().getSimpleName(), "invokeService()");
} catch (RemoteException re) {
Log.e(getClass().getSimpleName(), "RemoteException");
}
}
}
}
Я изучаю много примеров в Интернете, и, возможно, моя мешанину попыток это вызвано не работать. Мой код работает до привязки службы, но OnServiceConnected никогда не вызывается, а conn остается null.
Любая помощь, которую вы, ребята, можете предоставить, очень ценится.
Спасибо, Джош
Означает ли это, что я не могу начать какую-либо деятельность, которая относится к службе до возвращения onCreate? Не уверен, где я должен перемещать fillView в этом случае. – Josh 2010-12-07 01:03:38