2011년 9월 7일 수요일

p1) aidl 만들기.

Iaidl.aidl을 만든다.

package com.hello;

interface Iaidl {

int add(int a,int b);

}



gen에 Iaidl.java가 자동 생성된다. 

안되면,

Alt + P, N 하면 리소스 다시 만들면서

Iaidl.java가 gen 폴더에 만들어 진다.





 

 
서비스를 만든다.
 
 
AidlService.java
 
 
 
package com.hello;




import android.app.Service;

import android.content.Intent;

import android.os.IBinder;

import android.os.RemoteException;



public class AidlService extends Service {



public void onCreate() {

super.onCreate();

}

@Override

public IBinder onBind(Intent arg0) {

// TODO Auto-generated method stub

// if (aidl.class.getName().equals(arg0.getAction())) {

return mBinder;  // 주석들을 풀어야 한다. 이해되면.

// }

// return null;

}



private Iaidl.Stub mBinder = new Iaidl.Stub() {

@Override

public int add(int a, int b) throws RemoteException {

return a+b; // 서비스에서 aidl 스텁 함수의 본체가 있다.

}

};

}

 
 
즉, aidl에서 뭘 쓰겠다 라고 선언한 것의 함수 본체는 서비스에 있다고 보면 된다.
 
service 실행을 위해서는 androidmanifest에
 



































 
요렇게 서비스가 들어가야 한다. 아님 다른 곳에서 계속 실행 시키고 있던가.
 
 
AidlDEMO.java 는 이렇다.
 
 
package com.hello;


import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.os.RemoteException;
import android.widget.Toast;

import com.hello.Iaidl;

public class AidlDEMO extends Activity {

Iaidl maidl=null;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

Intent intent = new Intent(this, AidlService.class);
bindService(intent, srvConn, BIND_AUTO_CREATE);

// TODO Auto-generated catch block
}


ServiceConnection srvConn = new ServiceConnection() {

@Override
public void onServiceConnected(ComponentName arg0, IBinder arg1) {
// TODO Auto-generated method stub
maidl = Iaidl.Stub.asInterface(arg1);

Integer d = null;

try {
d = maidl.add(1, 2);
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

Toast.makeText(AidlDEMO.this, d.toString(), Toast.LENGTH_SHORT).show();
}

@Override
public void onServiceDisconnected(ComponentName arg0) {
// TODO Auto-generated method stub
maidl = null;
}
};

}
 
 
 이렇게 쓴다는 정도만. 포스팅.

간단히 정리하면

1. aidl에서 쓸 함수 인터페이스 정의하고 -> 그럼 더비 stub 함수가 만들어짐.

2. AIDL이름.stub mBiner = new AIDL이름.stub() {
 aidl안에 있는 함수 애들
}
로 본체를 정의해 주면 된다.
stub함수 쓸 때 이클립스의 Ctrl+1 기능을 활용하면 aidl참고해서 자동으로 만들어 준다.


3. 서비스에서는 onBind에 return값을 Strub 함수의 binder 값으로 정한다.


사용법은
http://www.kandroid.org/guide/developing/tools/aidl.html
에 나와있다.

getApplicationContext().bindService(intent, svcConn, BIND_AUTO_CREATE);

처럼 해주면 되는데
위 링크에서 찾아 보면 intent는 서비스 이름이고
svcConn은 ServiceConnection로 서비스에 연결되거나 끊겼을 때 xxx.Stub.asInterface로 해당 인터페이스를 땡겨오는 핵심 부분이 들어 있다.

나머지는 연습해야 한다. 개삽질을 통해서 내것으로 만들자.

ㅠㅠ

백문이 불여일타.

1. AIDL을 통해 다른 process에서 service와 통신
http://jusung.springnote.com/pages/5626531

2.Stub
http://terms.co.kr/stub.htm

3.Intent filter(승현)
http://androidhuman.tistory.com/entry/%EB%82%B4%EA%B0%80-%EB%88%84%EA%B5%B0%EC%A7%80-%EB%A7%90%ED%95%B4%EC%A4%98-%EC%9D%B8%ED%85%90%ED%8A%B8-%ED%95%84%ED%84%B0-Intent-Filter


4.안드로이드 AIDL 을 통해 서로 다른 Process에서 Service 와 통신 하기
http://huewu.blog.me/110083320332?Redirect=Log

5.서비스에 대한 고찰
http://cancle-ysj.tistory.com/54

6.서비스, 스레드 설명
http://www.androidpub.com/102370

7.remote service 만들기 순서
http://blog.daum.net/urlover/17049886

8.AIDL 이란?
http://linux.springnote.com/pages/5939095

9.AIDL 공식 홈피
http://www.kandroid.org/guide/developing/tools/aidl.html

10 서로 다른 앱 (보안)
http://www.ibm.com/developerworks/kr/library/x-androidsecurity/index.html


댓글 없음:

댓글 쓰기

국정원의 댓글 공작을 지탄합니다.

UPBIT is a South Korean company, and people died of suicide cause of coin investment.

 UPBIT is a South Korean company, and people died of suicide cause of coin. The company helps the people who control the market price manipu...