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
댓글 없음:
댓글 쓰기
국정원의 댓글 공작을 지탄합니다.