2012-07-28 94 views
1

我想提供可以被其他應用程序調用的服務。因此,我有一個服務和一個援助。但是,當我嘗試有一個單獨的應用程序來綁定此服務(bindService)時,它只是返回false,這意味着失敗。這是我的代碼。bindService with aidl返回false

PS:上下文已經它通過調用getApplicationContext()

碼獲得,嘗試服務

private static ServiceConnection connection = new ServiceConnection() { 
     @Override 
     public void onServiceConnected(ComponentName name, IBinder service) { 
      sService = XXXService.Stub.asInterface(service); 
     } 

     @Override 
     public void onServiceDisconnected(ComponentName name) { 
      sService = null; 
     } 
    }; 

    private static synchronized XXXService getService(final Context context) { 
     if (sService != null) { 
      return sService; 
     } else { 
      intent.setClassName(context.getPackageName(), "com.xxx.someservice"); 
      if (context.bindService(intent, connection, Context.BIND_AUTO_CREATE)) { 
       Log.i(TAG, "can bind"); 
      } else { 
       Log.i(TAG, "can not bind"); 
      } 
      return sService; 
     } 
    } 

AndroidManifest

<service android:name="com.xxx.someservice" 
     android:process=":main" 
     android:exported="true"/> 

回答

1

這似乎綁定的ApplicationContext基本上沒錯。我認爲這個問題是intent.setClassName(context.getPackageName(),「com.xxx.someservice」);應該是intent.setClassName(「Your.package.name.with.the.service」,「com.xxx.someservice」); 。 context.getPackageName()返回當前的包名,所以如果你試圖在自己的包中綁定,這會起作用,但是你的問題看起來就像你在一個單獨的包中一樣。

+0

它的工作原理,感謝 – Bear 2012-07-28 05:15:57

1

使用服務的操作名稱爲我工作。

E.g:

<service 
    android:name="..." 
    android:process="..." > 
    <intent-filter> 
     <action android:name="your-unique-action-name" /> 
    </intent-filter> 
</service> 

和:

... 
bindService(new Intent("your-unique-action-name"), mServiceConnection, BIND_AUTO_CREATE); 
+0

老實說,我認爲使用意圖比較好,因爲它是從重構更穩健。不過要小心。你的上面的代碼是不安全的,因爲任何應用程序都可以調用它。只要確保它具有權限保護並且如果可以更好地簽名 – Bishnu 2012-07-28 05:13:11

+0

就健壯性而言,如果您重命名類或重命名了包,代碼將會中斷。你必須記住保持同步。以後也可能很難更改,特別是如果您不擁有其他代碼。 – Bishnu 2012-07-28 05:20:10

+0

@Bishnu請問您可以添加更多關於安全性的信息嗎?爲什麼動作名稱比簡單的名稱更強大? - Bear 5分鐘前 – Bear 2012-07-28 05:20:15