Я нашел ответ на свой вопрос.Чтобы упростить задачу для других, вот решение:
При выполнении удаленного сервиса необходимо написать AIDL, который будет скомпилирован в своего рода интерфейс-заглушку, реализацию этого интерфейса (то есть код, которыйвыполняется, когда кто-то вызывает удаленные методы), и класс, который расширяет «Service», который возвращает класс реализации в методе onBind ().(Обычный локальный сервис возвращает ноль в этом методе)
Теперь я не понял, что вы ДОЛЖНЫ иметь определение сервиса в манифесте - С ФИЛЬТРОМ НАМЕРЕНИЯ!
Скажем, ваш AIDLназывается IRemoteService.aidl, тогда у вас есть класс RemoteService, который выглядит следующим образом:
public class RemoteService extends Service {
public IBinder onBind(Intent intent) {
Log.i("RemoteService", "onBind() called");
return new RemoteServiceImpl();
}
/**
* The IRemoteInterface is defined through IDL
*/
public class RemoteServiceImpl extends IRemoteService.Stub {
public void remoteDetonateBirthdayCake() throws RemoteException {
//your code here
}
};
}
В вашем манифесте Android вы хотите:
<service android:name="RemoteService">
<intent-filter>
<action android:name="com.sofurry.favorites.IRemoteService"></action>
</intent-filter>
</service>
Обратите внимание на имя службы:Это «RemoteService», а не «IRemoteService» или даже «RemoteServiceImpl».Вам нужно имя класса, который расширяет "Service", метод onBind которого мы переопределили.
Для завершения приведем код на стороне клиента - и да, этот код также работает из другой службы, дляпример, который вы начали с вашего виджета;)
IRemoteService mService;
RemoteServiceConnection mConnection = new RemoteServiceConnection();
getApplicationContext().bindService(new Intent(IRemoteService.class.getName()), mConnection, Context.BIND_AUTO_CREATE);
... где RemoteServiceConnection может быть внутренним классом, например так:
class RemoteServiceConnection implements ServiceConnection {
public void onServiceConnected(ComponentName className,
IBinder service ) {
mService = IRemoteService.Stub.asInterface(service);
isBound = true;
}
public void onServiceDisconnected(ComponentName className) {
mService = null;
isBound = false;
}
};
И теперь вы можете звонить..
mService.remoteDetonateBirthdayCake();
В заключение: убедитесь, что в манифесте android указан раздел службы, задайте для «name» класс, который возвращает фактическую реализацию в методе onBind (), и вы также должны иметьФильтр намерений с определением действия, указывающим на интерфейс AIDL.
Подсказка: если вы вызываете удаленные службы из приложения внутри другого APK, добавьте элемент «категория» в фильтр намерений и установите егоПО УМОЛЧАНИЮ.