안녕하세요..

늘 관련된 자료를 찾는데 많은 도움이 되고 있습니다...

제가 Android App. 개발 중 어려운( ? ) 문제로 진행이 안되고 있어서 문의드립니다...

두 개의 Application을 만드는데요... AIDL을 이용해서 데이터를 전달하려고 합니다..

일단 동작을 확인하기 위해 간단한 테스트를 해보려 했는데...

그것부터가 안되고 있네요...

일단 코드는 다음과 같습니다...

======================================
1. Service를 extends하여 만든 클래스.( ListenerService.java )

package com.example.test.listener;

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

public class ListenerService extends Service {

    private static final String DBG_TAG = "ListenerService";
   
    @Override
    public IBinder onBind(Intent intent) {
        // TODO Auto-generated method stub
        return mListenerService;
    }

    private IListenerService.Stub mListenerService = new IListenerService.Stub( ) {
        public void subscribe( String cid ) throws RemoteException {
            Log.d( DBG_TAG, cid ); // LogCat을 통해 확인...
        }
       
        public int send_data( String data ) throws RemoteException {
            Log.d( DBG_TAG, data ); // LogCat을 통해 확인...
            return 0;
        }
    };
}

====================================
2. AIDL 정의 파일 ( ILisenerService.aidl )

package com.example.test.listener;

interface IListenerService {
    void subscribe( String cid );
    int    send_data( String data );
}

====================================
3. ListenerService Manifest 파일

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.example.test.listener"
      android:versionCode="1"
      android:versionName="1.0">
    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <service android:enabled="true"
                 android:name=".ListenerService" >
            <intent-filter>
                <action android:name="com.example.test.listener.IListenerService" />
            </intent-filter>
        </service>

    </application>
    <uses-sdk android:minSdkVersion="5" />
</manifest>

====================================
4. Activity를 extends하여 만든 클래스.( DataPublisher.java )

package com.example.test.publisher;


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.util.Log;

import com.example.test.listener.IListenerService;

public class DataPublisher extends Activity {
   
    private static final String DBG_TAG = "DataPublisher";
    private IListenerService mService;
   
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
       
           //Intent i = new Intent( this, HelloService.class );
        Intent i = new Intent( IListenerService.class.getName( ) );
        boolean ret = bindService( i, mConnection, Context.BIND_AUTO_CREATE );
        if( ret == false ) {
            Log.e( DBG_TAG, "bindService ERROR" );
            return;
        }
        Log.e( DBG_TAG, "bindService SUCCES" );
    }
   
    private ServiceConnection mConnection = new ServiceConnection( ) {

        public void onServiceConnected( ComponentName name, IBinder service ) {
            // TODO Auto-generated method stub
            Log.i( DBG_TAG, "Connected." );
            mService = IListenerService.Stub.asInterface( service );
            Subscribe_Module( );
        }

        public void onServiceDisconnected( ComponentName name ) {
            // TODO Auto-generated method stub
            Log.i( DBG_TAG, "Disconnected." );
            mService = null;
        }
       
    };
   
    private void Subscribe_Module( ) {
        if( mService != null ) {
            try {
                mService.subscribe( "DATA_PUBLISHER_ACTIVITY" );
            }
            catch( RemoteException e ) {
                Log.e( DBG_TAG, "SUBSCRIPTION ERROR" );
            }
            try {
                mService.send_data( "CAN YOU COPY THIS??" );
            }
            catch( RemoteException e ) {
                Log.e( DBG_TAG, "SEND_DATA ERROR" );
            }
        }
        else {
            Log.e( DBG_TAG, "Listener Service Interface is NULL" );
        }   
    }
}
======================================

Activity가 onCreate하는 시점에 bind를 수행하도록 하였는데요...

onServiceConnected에서 String  테스트 데이터를 보내보려 했구요...

실행하면

“DataPublisher 응용프로그램(com.example.test.publisher 프로세스) 에서 예상치 않게 중지되었습니다.
 다시 시도해 주세요”

라는 오류메시지가 나오구요..

LogCat 메시지에

Could note find method com.example.test.listener.IListenerService.subscribe, referenced form (....)
VFY: unable to resolve interface method 7: Lcom/example/test/listener/IListenerService;.subscribe (.... )

라는 메시지가 나오네요...

하나의 Application에서 Service와 Activity를 만들었을 때에는 동작하는 것을 보았는데요...

두 개의 Application으로 분리하니 문제가 되네요..

서로 다른 프로세스간 데이터르 주고 받기 위해 AIDL을 사용할 수 있다고 알고 있었는데...

어느 부분이 잘못되었는지 잘 모르겠습니다...

많은 개발자 여러분들의 도움을 부탁드립니다...

감사합니다.....