Один Сервис, связывающийся с двумя Активами, и другой Сервис - PullRequest
0 голосов
/ 27 марта 2011

Итак, вот мой сценарий: У меня есть два действия и один сервис -> всем трем (классам) требуется значение типа возврата из другого сервиса (итого 2 действия, 2 сервиса в приложении).

т.е: Действие A, запускается -> Действие B и Услуга I.

Деятельность B, запускается -> Служба II.

После этого Деятельность A, B и Служба II должны связываться со Службой I. Служба I всегда работает позади и никогда не останавливается после запуска.

Мой подход был следующим:

  1. Напишите три файла .aidl, которые объявляют интерфейс между четырьмя взаимодействующими классами.

  2. Создайте операцию A, затем создайте службу I, операцию B, а из операции B создайте службу II.

  3. В качестве службы у меня может быть только один метод onBind () для связи с 3-мя классами в любое время, и я делаю то, что все намерения из 3-х классов различаются путем присвоения различного значения с помощью setType () свойство.

  4. Соединение создается между каждыми двумя классами, когда связь должна осуществляться с помощью initService () и вскоре после этого освобождается с помощью releaseService ().

  5. В Сервисе I метод onBind () должен сначала проверить, из какого из 3 классов идет намерение, используя свойство getType (), и вернуть соответствующий тип IBinder.

Теперь, Моя проблема на шаге 5. В котором метод onBind () не может выполнить операцию проверки getType () всех намерений и дать соответствующий тип возврата. Вот мой код для метода onBinder () в Сервисе I:

@Override
public IBinder onBind(final Intent intent){
    Log.d(Main_Service.TAG,"it got connected");
    if(intent.getType=="Activity_A")
    {
        return new Activity_A_aidl.Stub() {
            public void function1(int u1,String p1,String p2) throws RemoteException{
                //do something
            }
        };}

    if(intent.getType=="Activity_B"){
        return new Activity_B_aidl.Stub() {
            public int function2() throws RemoteException{//do something
                return some_integer_values;
            }
        };} 
    if(intent.getType()="Service_II"){
        return new Service_II_aidl.Stub(){
            public boolean function3(String u,String p) throws RemoteException{
                //do something

            return boolean_type_variable;
            }
        };}
}

ошибка: как показано в LogCat: java.lang.NullPointerException

из всех 3 классов (Деятельность A, B & Service II), где бы я ни вызывал одну из функций в блоке try-catch.

Может кто-нибудь сказать мне, где я иду не так.

-Кишор Дебнат, (3-й год, студент CSE).

Ответы [ 2 ]

1 голос
/ 28 марта 2011

Не комментируя ваш общий дизайн, я бы добавил, что способ, с помощью которого служба различает вызывающих абонентов, заключается в использовании свойства action. Я не знаю, что такое initService (), но когда я связываюсь с удаленным сервисом, я просто использую bindService (). Так что в вашей деятельности есть что-то вроде:

bindService(new Intent("com.mypackage.myService.ACTION_1"), this,
                Context.BIND_AUTO_CREATE);

или .ACTION_2 или .ACTION_3.

Тогда в манифесте ваших сервисов есть фильтр намерений:

<intent-filter>
   <action  android:name="com.mypackage.myService.ACTION_1" />
   <action  android:name="com.mypackage.myService.ACTION_2" />
   <action  android:name="com.mypackage.myService.ACTION_3" />
</intent-filter>

Затем в onBind () службы используйте намерение. getAction () , чтобы вернуть строку, идентифицирующую вызывающего. (Используйте правильный метод .equals () для соответствия String!) И верните соответствующий IBinder

Я не думаю, что дополнительные материалы по Намерению будут переданы в службу. Я никогда не связывался с сервисом из другого сервиса, но полагаю, он может работать.

В заключение я использую только AIDL и удаленный сервис, потому что по коммерческим причинам мне нужно разделить функциональность между двумя отдельными .apks. У меня нет веских технических причин для его использования, на самом деле все наоборот.

0 голосов
/ 27 марта 2011

Может кто-нибудь сказать мне, где я иду не так

Ну, вы спросили ...

  • Маловероятно, что вам нужнодве службы, еще менее вероятно, что вам нужен один сервис для связи с другим, и еще менее вероятно, что вам нужен один сервис для привязки к другому.

  • Маловероятно, что вам нужен AIDL.

  • Маловероятно, что вам действительно нужен сервис, который "всегда работает позади и никогда не останавливается после запуска".

  • Неиспользуйте type свойство Intent для всего, кроме MIME-типа.Используйте Intent extra для других данных, которые вы хотите присоединить к Intent.

  • Не сравнивайте строки с =, как в третьем выражении if()выше.

  • Не вставляйте код в вопрос StackOverflow с очевидными опечатками, такими как приведенный выше =, или пропускайте () в вызовах getType(), как у васв первых двух if() утверждениях.Если он не скомпилируется, это не хороший пример, чтобы продемонстрировать ваше понимание ситуации.

Ваша настоящая проблема, скорее всего, связана с кодом, не показанным здесь.Вероятно, вы пытаетесь вызвать методы ваших Binder объектов до того, как будет установлено соединение (например, до вызова onServiceConnected()).Или, возможно, у вас просто есть ошибки в реализациях ваших Binder методов, которые вы также здесь не показываете.

...