2010-12-06 77 views
0

早安所有,結合服務故障

我目前buidling媒體播放器爲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開始。當我點擊shuffle按鈕時,它使用服務中的一個方法播放隨機歌曲,從而設置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

的Android不會讓重入事件調用您的活動,所以onServiceConnected不能稱之爲直到的onCreate返回

+0

這是否意味着我不能啓動任何活動所屬到onCreate返回之前的服務?在這種情況下,我不知道應該在哪裏移動fillView。 – Josh 2010-12-07 01:03:38