2010-12-06 2 views
0

Доброе утро Все,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.

Любая помощь, которую вы, ребята, можете предоставить, очень ценится.

Спасибо, Джош

ответ

1

Android не будет делать Реентрантная событие вызывает к вашей деятельности, так onServiceConnected нельзя назвать, пока OnCreate не вернулся

+0

Означает ли это, что я не могу начать какую-либо деятельность, которая относится к службе до возвращения onCreate? Не уверен, где я должен перемещать fillView в этом случае. – Josh 2010-12-07 01:03:38

Смежные вопросы