Привязка к сервисной проблеме - PullRequest
0 голосов
/ 06 декабря 2010

Good Morning All,

В настоящее время я собираю медиаплеер для Android, и у меня возникают проблемы с привязкой сервиса плеера к Activity и извлечением данных из него.Терпите меня ... много кода следует.

Мой код ---

Интерфейс:

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");

}

}

Активность на главном экране, кнопка Shuffle:

Сервис запущен в 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 остается нулевым.

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

1 Ответ

1 голос
/ 06 декабря 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...