마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

AIDL callback붙여도 에러가 비슷합니다 부탁드려요..

0 추천

해결이 잘 안되서 다시 질문을 드립니다..

MainActivity.java

public class MainActivity extends AppCompatActivity {

    private static final String SERVER_PACKAGE = "lite.bluelight.jdk.com.aidlservice";

    private static final String SERVER_ACTION = "lite.bluelight.jdk.com.aidlservice";

    private IRemoteService mRemoteService;
    private IRemoteServiceCallback mRemoteServiceCallback;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Intent serviceIntent = new Intent(SERVER_ACTION);
        serviceIntent.setPackage(SERVER_PACKAGE);
        getApplication().bindService(serviceIntent, serviceConnection, Context.BIND_AUTO_CREATE);
        startService(serviceIntent);

        Button button = (Button) findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                try {
                    int sum = mRemoteService.sum(2, 5);
                    Toast.makeText(getApplicationContext(), String.valueOf(sum), Toast.LENGTH_SHORT).show();
                } catch (RemoteException e) {
                    e.printStackTrace();
                }
            }
        });
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        unbindService(serviceConnection);
    }

    public ServiceConnection serviceConnection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            Log.e("DDDD", "Service has unexpectedly onServiceConnected");
            if(service != null) {
                try {
                    mRemoteService = IRemoteService.Stub.asInterface(service);
                    mRemoteServiceCallback.registerCallback(mRemoteService);
                }catch (Exception e){
                    e.printStackTrace();
                }
            }
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            Log.e("DDDD", "Service has unexpectedly onServiceDisconnected");
            if(mRemoteServiceCallback != null) {
                try {
                    mRemoteServiceCallback.unregisterCallback(mRemoteService);
                }catch (Exception e){
                    e.printStackTrace();
                }
            }
        }
    };
}

 

ServerService.java

public class ServerService extends Service {

    @Override
    public IBinder onBind(Intent intent) {
        return new IRemoteServiceImpl();
    }

    private class IRemoteServiceImpl extends IRemoteService.Stub {

        @Override
        public int sum(int a, int b) throws RemoteException {
            Log.e("DDDD", "DDDDDDDDDDDDDDDDD");
            return a + b;
        }

    }


    //-------------------------------------------------------------------------------
    final RemoteCallbackList callbacks = new RemoteCallbackList();

    private final IRemoteServiceCallback.Stub mBinder = new IRemoteServiceCallback.Stub() {

        @Override
        public boolean unregisterCallback(IRemoteService callback) throws RemoteException{
            boolean flag = false;

            if(callback != null){
                flag = callbacks.register(callback);
            }

            return flag;
        }

        @Override
        public boolean registerCallback(IRemoteService callback) throws RemoteException{
            boolean flag = false;

            if(callback != null){
                flag = unregisterCallback(callback);
            }

            return flag;
        }
    };

}

 

IRemoteServiceCallBack.aidl (service파일은 이미 있어서 Callback으로 추가했습니다)

package lite.bluelight.jdk.com.aidl;

import lite.bluelight.jdk.com.aidl.IRemoteService;

interface IRemoteServiceCallback {
   boolean registerCallback(IRemoteService callback);
   boolean unregisterCallback(IRemoteService callback);
}

 

IRemoteService.aidl

// IRemoteService.aidl
package lite.bluelight.jdk.com.aidl;

// Declare any non-default types here with import statements

interface IRemoteService {

    int sum(int a, int b);

}

 

 

에러는 저번과 비슷합니다..

08-11 15:16:20.838 22203-22203/lite.bluelight.jdk.com.aidlservice E/AndroidRuntime: FATAL EXCEPTION: main
Process: lite.bluelight.jdk.com.aidlservice, PID: 22203
java.lang.NullPointerException: Attempt to invoke interface method 'int lite.bluelight.jdk.com.aidl.IRemoteService.sum(int, int)' on a null object reference

 

아예

Log.e("DDDD", "Service has unexpectedly onServiceConnected");

와 같은 로그가 찍히지 안습니다. serviceConnection이 활성화가 되지도 않은거 같습니다..

 

부디.. 제가 AIDL에 관한 샘플을 만들 수 있게 도움부탁드립니다..

감사합니다..

 

 

 

 

 

 

 

 

 

aidl interface 님이 2017년 8월 11일 질문

1개의 답변

0 추천

IRemoteServiceCallBack.aidl, IRemoteService.aidl 은 패키지명을 

package lite.bluelight.jdk.com.aidl; 로 선언 하시고선.

정작 호출 시엔 

   private static final String SERVER_PACKAGE = "lite.bluelight.jdk.com.aidlservice";

    private static final String SERVER_ACTION = "lite.bluelight.jdk.com.aidlservice";

로 호출하시다보니, 패키지를 못 찾아  bind 가 안 되어 있는 상태에서 동작 시키다보니, 

 NullPointerException이 발생한듯 합니다.패키지명을 맞춰 보세요

익명사용자 님이 2017년 8월 11일 답변
아쉽지만 잘되지 안습니다..
안녕하세요 답변주셔서 감사드립니다..
Intent serviceIntent = new Intent(MainActivity.this, ServerService.class);
        serviceIntent.setPackage("lite.bluelight.jdk.com.aidl");
        getApplication().bindService(serviceIntent, serviceConnection, Context.BIND_AUTO_CREATE);
        startService(serviceIntent);

말씀해주신건 MainActivity에서 이렇게 고쳐도 같은 오류가 나옵니다.

잘부탁드립니다.
AndroidManifest.xml 에 선언된 service 태그가 제대로 되어 있는지 확인 해 보세요.
아님 링크의 예제를 참조 해 보세요..

 http://arabiannight.tistory.com/entry/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9CAndroid-Service-%EC%98%88%EC%A0%9C
...