본문 바로가기
안드로이드

[안드로이드] RemoteService 기본 연습하기 (Service/Client)

by 호군 2011. 6. 2.
반응형

링크 : http://cafe.naver.com/aphone.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=6853&social=1

위의 링크에는 소스코드를 다운로드 할 수 있습니다. 저 역시 이 소스를 보고 따라 구현을 해보았습니다. 소스의 내용은 차이가 없지만, 추가적으로 작성한 글이 도움이 되었으면 합니다. 또한 실행을 해보면 좀 더 보기가 쉬울 것 이라고 생각이 들어서 링크를 겁니다.



안드로이드에서는 프로세스간에는 RPC통신을 한다고 합니다. App과 Service사이에서 통신을 하려면 RPC통신을 하도록 해야겠죠? 그래서 안드로이드에서 지원하는 aidl 툴을 이용하면 서비스를 쉽게 구현 할 수 있습니다. 이 툴은 서비스 스텁(stub)과 서비스 프록시(proxy) 클래스를 자동으로 생성해줍니다.

실습 순서를 간단하게 나열하자면,
① HelloService 프로젝트를 생성합니다.
② IMyService.adil를 작성합니다. (인터페이스)
③ MyService.java를 작성합니다. (서비스)
④ AndroidManifest.xml에서 service를 등록합니다.
⑤ 실행하여 에뮬레이터에 올립니다.
⑥ HelloServiceClient 프로젝트를 생성합니다. 
⑦ HelloService의 IMyService 파일을 복사합니다.
⑧ HelloServiceClient의 Activity 클래스에서 서비스를 연결합니다.
⑨ 실행하여 에뮬레이터에 올리면 서비스와 통신하는 것을 알 수 있습니다.

저희 개발환경은 Eclipse를 사용하였고, Android 2.2 SDK를 사용하였습니다.
이제 aidl을 연습해보겠습니다.

○ HelloService 프로젝트
 1. HelloService 프로젝트 생성
   - 안드로이드 프로젝트를 생성하세요. 
     MyService를 작성 할 때 Activity를 Service로 수정 할 것입니다.     
 2. IMyService.adil 파일을 추가합니다. (따로 package를 만들어서 추가해도 가능합니다)
 3. IMyService.adil 파일을 작성합니다.
package com.dhna.service.hello;

interface IMyService {
    void test();
    int getSize(in String name);
}

 4. MyService.java 파일을 작성합니다.

package com.dhna.service.hello;

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

import com.birdland.service.hello.IMyService.Stub;

public class MyService extends Service {
    public static String TAG = "MyService";
 
    @Override
    public IBinder onBind(Intent intent) {
        Log.i(TAG, "## onBind ##");
        if(IMyService.class.getName().equals(intent.getAction())) {
            Log.i(TAG, "## return " + mBinder);
            return mBinder;
        }
        Log.i(TAG, "## return null ##");
        return null;
    }
 
    IMyService.Stub mBinder = new IMyService.Stub() {  
        @Override
        public void test() throws RemoteException {
            Log.d("MyService", "text() call");
        }
  
        @Override
        public int getSize(String name) throws RemoteException {
            return name.length();
        }
    };
}

 5. AndroidManifest.xml 파일을 수정 합니다.


<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.birdland.service.hello"
      android:versionCode="1"
      android:versionName="1.0">
    <uses-sdk android:minSdkVersion="8" />

    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <service android:name="MyService"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="com.dhna.service.hello.IMyService" />
            </intent-filter>
        </service>
    </application>
</manifest>

 6. 실행하여 apk파일을 에뮬레이터에 올립니다.


○ HelloServiceClient 프로젝트
 1. HelloServiceClient 프로젝트를 생성합니다.
   - HelloService와 동일
 2. HelloService의 IMyService.aidl 파일을 복사합니다.
 3. HelloServiceClientActivity.java 파일을 구현합니다.

package com.dhna.app.hello;

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;
import android.widget.Toast;

import com.birdland.service.hello.IMyService;

public class HelloServiceClientActivity extends Activity {
    IMyService mMyService;
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
       
        bindService(new Intent("com.birdland.service.hello.IMyService"), mMyConnection, Context.BIND_AUTO_CREATE);
       
        Button button = (Button)findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
   @Override
   public void onClick(View v) {
    try {
     int length = mMyService.getSize("hello");
     Toast.makeText(HelloServiceClientActivity.this, "string length : " + length, Toast.LENGTH_LONG).show();
    } catch (RemoteException e) {
     e.printStackTrace();
    }
   }
  });
    }
   
    ServiceConnection mMyConnection = new ServiceConnection() {
  @Override
  public void onServiceConnected(ComponentName name, IBinder service) {
   mMyService = IMyService.Stub.asInterface(service);
   Toast.makeText(HelloServiceClientActivity.this, "service connected!", Toast.LENGTH_LONG).show();
  }

  @Override
  public void onServiceDisconnected(ComponentName name) {
   Toast.makeText(HelloServiceClientActivity.this, "service disconnected!", Toast.LENGTH_LONG).show();
  }
     
    };
}

 4. 실행하여 apk파일을 에뮬레이터에 올립니다. Service와 통신하는 것을 알 수 있습니다. 

반응형