상세 컨텐츠

본문 제목

[Android]서비스 - 01

Android 개발

by mobile 2013. 9. 20. 03:28

본문

반응형

안드로이드에서 제공하는 서비스는 다음과 같은 특징을 갖고 있다.

- 서비스는 독립된 컴포넌트로 실행 시킬 수 없다.

: 여기서 독립이라는 의미는 사용자가 인위적으로 서비스만을 실행시킬 수 없다는 의미이다. 즉 액티비티를 통해서 또는 다른 안드로이드 컴포넌트에 의해 실행 된다.

- 서비스는 메인 스레드에서 실행된다.

: 서비스는 일반 스레드로 실행할 수 없으며 액티비티와 동등하게 메인 스레드에서 실행된다. 필요에 따라 독립된 프로세스의 메인 스레드로 동작할 수 있다. 이 경우 액티비티가 속한 프로세스가 메모리에서 삭제되거나 종료되더라도 아무 관계 없이 독립적으로 작동하게 된다.


서비스는 시작하는 과정에 따라 다음 두가지 형태로 구분된다. 이렇게 구분하는 이유는 각각 별도의 생명주기를 작기 때문이다.

- 스타드 서비스 : 액티비티를 호출하는 방법과 유사하게 startService() 메서드를 사용하여 실행 시킨다. 스타트 서비스로 실행된 서비스는 호출한 컴포넌트와 독립적으로 작동한다. 만약 종료를 원한다면 stopService() 메서드를 사용하여 서비스를 종료 시킨다.

- 바인드 서비스 : 다른 컴포넌트에서 bindService() 메서드를 호출하여 서비스를 실행 시킨다. 이 실행 방법은 서비스의 메서드를 마치 컴포넌트 내부에 존재하는 메서드를 호출하는 방법과 유사한 기능을 제공한다.


스타트 서비스 모드는 public int onStartCommand(Intent intent, int flags, int startId) 메서드의 반환값으로 파악된다.

- START_STICKY : 음악과 같이 사용자의 분명한 의도가 있는 서비스를 말한다. 서비스 시작을 요청하였지만 서비스가 정상 시작되지 못한다면 안드로이드 시스템은 지속적으로 서비스를 시작시키게 된다.

- START_NOT_STICKY 또는 START_REDELIVER_INTENT : 인터넷 다운로드와 같이 서버의 문제가 있어 서비스가 정상적으로 시작되지 못했다면, 사용자에 의한 서비스 재요청이 있을때까지 서비스 시작을 중지하게 된다.


onStartCommand() 메서드의 startId 매개변수는 서비스 구분자로 stopSelfResult(int startId) 메서드에서 서비스를 종료할 때 사용하게 된다. 참고로 onStartCommand()는 안드로이드 버전 2.0이상 부터 지원한다.


// MainActivity.java

package com.example.helloservice;


import android.app.Activity;

import android.content.DialogInterface;

import android.content.Intent;

import android.os.Bundle;

import android.view.Menu;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;


public class MainActivity extends Activity {


@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

Button startbutton = (Button)findViewById(R.id.startservice);

Button stopbutton = (Button)findViewById(R.id.stopservice);

startbutton.setOnClickListener(mStartListener);

stopbutton.setOnClickListener(mStopListener);

}

private final OnClickListener mStartListener = new OnClickListener() {

@Override

public void onClick(View v) {

// TODO Auto-generated method stub

Intent intent = new Intent(MainActivity.this, HelloService.class);

startService(intent);

}

};

private final OnClickListener mStopListener = new OnClickListener() {

@Override

public void onClick(View v) {

// TODO Auto-generated method stub

Intent intent = new Intent(MainActivity.this, HelloService.class);

stopService(intent);

}

};

@Override

public boolean onCreateOptionsMenu(Menu menu) {

// Inflate the menu; this adds items to the action bar if it is present.

getMenuInflater().inflate(R.menu.main, menu);

return true;

}


}


// HelloService.java

package com.example.helloservice;


import android.app.Service;

import android.content.Intent;

import android.os.IBinder;

import android.widget.Toast;


public class HelloService extends Service {

@Override

public void onCreate() {

// TODO Auto-generated method stub

//super.onCreate();

Toast.makeText(this, "service call onCreate() 메서드", Toast.LENGTH_SHORT).show();

}

@Override

public int onStartCommand(Intent intent, int flags, int startId) {

// TODO Auto-generated method stub

//return super.onStartCommand(intent, flags, startId);

Toast.makeText(this, "service onStartCommand", Toast.LENGTH_SHORT).show();

return START_STICKY;

}


@Override

public IBinder onBind(Intent arg0) {

// TODO Auto-generated method stub

return null;

}


@Override

public void onDestroy() {

// TODO Auto-generated method stub

//super.onDestroy();

//thread.quit();

Toast.makeText(this, "service done", Toast.LENGTH_SHORT).show();

}

}


// 서비스 등록 AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

    package="com.example.helloservice"

    android:versionCode="1"

    android:versionName="1.0" >


    <uses-sdk

        android:minSdkVersion="8"

        android:targetSdkVersion="9" />


    <application

        android:allowBackup="true"

        android:icon="@drawable/ic_launcher"

        android:label="@string/app_name"

        android:theme="@style/AppTheme" >

        <activity

            android:name="com.example.helloservice.MainActivity"

            android:label="@string/app_name" >

            <intent-filter>

                <action android:name="android.intent.action.MAIN" />


                <category android:name="android.intent.category.LAUNCHER" />

            </intent-filter>

        </activity>

        <service android:name="com.example.helloservice.HelloService" />

    </application>


</manifest>


서비스는 메인스레드로 작동한다.

서비스는 자신이 원하는 작업이 완료되었다면 액티비티와 관계없이 종료시킬 수 있다. 이때 사용하는 메서드가 stopSelfResult(int startId) 이다.

stopSelfResult(int startId) 메서드를 넣으면 마치 사용자가 종료버튼을 누른 것처럼 onDestory() 메서드가 호출되는 것을 확인 할 수 있다.


만약 서비스를 별도 프로세스를 실행시키고자 한다면 아래와 같이 프로세스를 명시해 주어야한다.

<service android:name="HelloService" android:process=":remote" />


반응형

관련글 더보기

댓글 영역