2012-07-04 3 views
0

У меня есть два приложения, между которыми я хочу обмен данными. Поскольку они работают в разных процессах, поэтому я использую AIDL для связи между ними. Теперь все происходит очень хорошо в одном направлении (скажем, мои приложения A и B), то есть данные отправляются с A на B, но теперь мне нужно отправить некоторые данные от B до A.Двусторонняя связь AIDL (обновлено с кодом)

Я заметил, что мы необходимо включить приложение с AIDL в путь сборки приложения, где будет вызван метод AIDL. Поэтому в моем случае A включает B в свой путь сборки. Для того, чтобы B мог послать что-то A, по этой логике B понадобится A в своем пути сборки. Это создаст цикл.

Я застрял в этом пункте. И я не могу придумать работу вокруг этого цикла.

---- EDIT ----

Итак, я по совету упомянутого в одной из приведенных ниже комментариев, я следующий код В проекте IPCAIDL файл AIDL находится, его содержание

package ipc.android.aidl; 
interface Iaidl{ 
     boolean pushBoolean(boolean flag); 
} 

Этот проект используется как библиотека как в IPCServer, так и в IPC-клиенте.

Проект IPCServer имеет службу, которая определяет, что происходит с методом AIDL. Файл booleanService.java

package ipc.android.server; 

import ipc.android.aidl.Iaidl; 
import android.app.Service; 
import android.content.Intent; 
import android.os.IBinder; 
import android.os.RemoteException; 
import android.util.Log; 

    public class booleanService extends Service { 

@Override 
public IBinder onBind(Intent intent) { 
    return new Iaidl.Stub() { 

     @Override 
     public boolean pushBoolean(boolean arg0) throws RemoteException { 
      Log.i("SERVER(IPC AIDL)", "Truth Value:"+arg0); 
      return arg0; 
     } 
    }; 
    } 

    } 

IPCClient файл, который вызывает этот метод

package ipc.android.client2; 

    import ipc.android.aidl.Iaidl; 
    import android.app.Activity; 
    import android.content.ComponentName; 
    import android.content.Context; 
    import android.content.Intent; 
    import android.content.ServiceConnection; 
    import android.os.Bundle; 
    import android.os.IBinder; 
    import android.os.RemoteException; 
    import android.view.View; 
    import android.widget.Button; 

    public class IPCClient2Activity extends Activity { 

Button b1; 
Iaidl iAIDL; 
boolean k = false; 
/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    bindService(new Intent("ipc.android.server.booleanService"), conn, Context.BIND_AUTO_CREATE); 
    startService(new Intent("ipc.android.server.booleanService")); 

    b1 = (Button) findViewById(R.id.button1); 

    b1.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      if(k){ 
       k = false; 
      } 
      else{ 
       k = true; 
      } 
      try { 
       iAIDL.pushBoolean(k); 
      } catch (RemoteException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      }    
     } 
    }); 
} 

private ServiceConnection conn = new ServiceConnection() { 

    @Override 
    public void onServiceDisconnected(ComponentName name) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void onServiceConnected(ComponentName name, IBinder service) { 
     iAIDL = Iaidl.Stub.asInterface(service); 
    } 
}; 
    } 

файл манифеста для IPCServer включает в себя декларацию службы. Файл манифеста ниже

<?xml version="1.0" encoding="utf-8"?> 
    <manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="ipc.android.server" 
    android:versionCode="1" 
    android:versionName="1.0" > 

    <uses-sdk android:minSdkVersion="15" /> 

    <application 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" > 
     <activity 
      android:name=".IPCServerActivity" 
      android:label="@string/app_name" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 

     <service android:name=".booleanService"> 
      <intent-filter> 
       <action android:name="ipc.android.server.booleanService"> 
       </action> 
      </intent-filter> 
      </service> 
    </application> 

    </manifest> 
+0

Либо поместите файлы AIDL в проект библиотеки и включите его в оба проекта, либо просто выполните _duplicate_ it. AIDL - это просто описание интерфейса, которое приводит к генерации кода - помещается в папку 'gen'. – Jens

+0

спасибо! Я попробую это и дам вам знать, если это сработало! – sshasan

+0

@Jens Я попробовал это с помощью односторонней связи. Я создал проект и поместил в него файл AIDL. Изменен проект в библиотеке (отметьте флажок «Библиотека»). Включено это как на сервер IPC, так и на ссылку библиотеки клиента IPC. Во время компиляции приложение выходит из исключения NullPointerException. Если вы хотите, я могу опубликовать код. – sshasan

ответ

0

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

+0

спасибо! позвольте мне попробовать это, и я вернусь к тому, что произошло. :) – sshasan

+0

не могли бы вы объяснить, как добавить каталог в качестве исходного каталога. Собирается ли это на свойства проекта -> Java Build PAth -> вкладка «Источник», а затем добавить папку? – sshasan

Смежные вопросы