2011-02-26 2 views
3

안녕하세요 : 동일한 패키지의 서비스에 바인딩하는 활동을 가져올 수 없습니다.Android - 서비스 바인딩

활동은 다음과 같습니다

public class myApp extends TabActivity { 
    static private String TAG = "myApp"; 
    private myService mService = null; 
    private ServiceConnection mServiceConn = new ServiceConnection(){ 
     public void onServiceConnected(ComponentName name, IBinder service) { 
      Log.v(TAG, "Service: " + name + " connected"); 
      mService = ((myService.myBinder)service).getService(); 
     } 

     public void onServiceDisconnected(ComponentName name) { 
      Log.v(TAG, "Service: " + name + " disconnected"); 
     } 
    }; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     doBind(); 
     Log.i(TAG, "Started (UI Thread)"); 

     // set content 
     setContentView(R.layout.main); 

     Resources res = getResources(); // Resource object to get Drawables 
     TabHost tabHost = getTabHost(); // The activity TabHost 

     ... add some tabs here.... 

     tabHost.setCurrentTab(0); 
    } 

    private void doBind(){  
     Intent i = new Intent(this,myService.class); 
     if(bindService(i, mServiceConn, 0)){ 
      Log.i(TAG, "Service bound"); 
     } else { 
      Log.e(TAG, "Service not bound"); 
     } 
    } 

} 

그런 다음 서비스 :

public class myService extends Service { 
    private String TAG = "myService"; 

    private boolean mRunning = false; 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startid) { 
     Log.i(TAG,"Service start"); 

     mRunning = true; 

     Log.d(TAG,"Finished onStartCommand"); 
     return START_STICKY; 
    } 

    /* 
    * Called on service stop 
    */ 
    @Override 
    public void onDestroy(){ 
     Log.i(TAG,"onDestroy"); 
     mRunning = false; 
     super.onDestroy(); 
    } 

    @Override 
    public IBinder onBind(Intent intent) { 
     return mBinder; 
    } 


    boolean isRunning() { 
     return mRunning; 
    } 

    /* 
    * class for binding 
    */ 
    private final IBinder mBinder = new myBinder(); 
    public class myBinder extends Binder { 
     myService getService() { 
      return myService.this; 
     } 
    } 
} 

bindService 사실 반환하지만 onServiceConnection가 호출되지 않습니다 (mService는 항상 null, 그래서 내가 뭔가를 할 수 없어 같은 mService.isRunning())

서비스에 대한 매니페스트 항목은 그냥 :

<service android:name=".myService"></service> 

안드로이드 개발자 사이트에서 직접 코드를 복사하고 있었지만 뭔가 놓쳤을 것입니다.

답변

3

서비스가 시작되지 않습니다. 이 같은 코드를 참조하십시오 startService(bindIntent)

과 함께 서비스를 시작합니다 : 여기에 0

대신 BIND_AUTO_CREATE와 결합 할 때 자동으로 서비스를 시작할 수

Intent bindIntent = new Intent(this,ServiceTask.class); 
if (ServiceTools.isServiceRunning() == false){ 
    Log.d(Global.TAG,"-->service will be started."); 
    startService(bindIntent); 
}else{ 
    Log.d(Global.TAG,"-->service already is running"); 
} 
boolean bound = bindService(bindIntent,mConnection,0); 

하면 경우도 ServiceTools 클래스 만 귀하의 서비스가 한 번 시작되기를 바랍니다. 그렇지 않으면 onServiceConnected에서 호출 된 메소드는 onCreate()/doBind()가 발생할 때마다 실패합니다.

public class ServiceTools { 
    public static boolean isServiceRunning(){ 
     final ActivityManager activityManager = (ActivityManager)Global.gContext.getSystemService(Global.gContext.ACTIVITY_SERVICE); 
     final List<RunningServiceInfo> services = activityManager.getRunningServices(Integer.MAX_VALUE); 

     boolean isServiceFound = false; 

     for (int i = 0; i < services.size(); i++) { 
      //Log.d(Global.TAG, "Service" + i + " :" + services.get(i).service); 
      //Log.d(Global.TAG, "Service" + i + " package name : " + services.get(i).service.getPackageName()); 
      //Log.d(Global.TAG, "Service" + i + " class name : " + services.get(i).service.getClassName()); 

      if ("com.atClass.lmt".equals(services.get(i).service.getPackageName())){ 
       if ("com.atClass.lmt.ServiceTask".equals(services.get(i).service.getClassName())){ 
        isServiceFound = true; 
       } 
      } 
     } 
     return isServiceFound; 
    } 
} 
+0

도움이 될 경우 답변을 수락하십시오. –

25

는 활동도 동일한 패키지에 서비스를 바인딩 할 수 없습니다합니다 (tabhost에서 실행)을 tabactivity에서 보조 Activity로 시작 알려진 문제입니다. "해킹"해결 방법이 있습니다. 전화 할 경우 :

getApplicationContext().bindService(Intent, connection, flags); 

을 오히려 단지보다 :

bindService(Intent, connection, flags); 

모든 작동합니다. 이 동일한 문제가 있었는데이 버그 보고서의 세부 사항을 발견했습니다 : http://code.google.com/p/android/issues/detail?id=2483