안드로이드 개발 서비스(Service) 컴포넌트 예제 구현하는 방법 |
환경: Android Studio |
안드로이드에는 크게 4개의 컴포넌트로 나눕니다. 그 중 하나가 서비스(Service) 입니다. 서비스는 안드로이드 OS 에서 백그라운드로 돌아가는 객체 입니다. 실행과 종료는 Activity 에서 하겠죠. 주로 주기적인 관찰과 피드백이 필요한 기능에 사용합니다. 안드로이드 사용량 모니터링이나 브로드캐스트 서버로부터 수신한 데이터를 알리는 등의 기능을 수행합니다. 자신의 스마트폰을 열어서 애플리케이션 관리자로 들어가 보세요. 실행중인 앱들은 전부 서비스 기능을 수행하고 있는 것입니다.
▼ 먼저 자신이 사용할 서비스 클래스를 만들어야 합니다. 상속은 Service 클래스를 받습니다. 기본적으로 4개의 함수를 구현해야 합니다. 함수의 이름을 통해서 어떤 역할을 하는지 짐작이 갈 겁니다. Activity 에서 서비스를 실행하는 onStartCommand(), 종료하면 onDestory() 함수가 실행됩니다. 이것은 가장 기본적인 형태입니다.
public class PhoneCallService extends Service { @Override public IBinder onBind(Intent intent) { // Service 객체와 화면 Activity 사이에서 데이터를 주고받을 때 // 데이터를 전달할 필요가 없으면 return null; return null; } @Override public void onCreate() { super.onCreate(); } @Override public int onStartCommand(Intent intent, int flags, int startId) { Log.d(TAG, "서비스 시작"); return super.onStartCommand(intent, flags, startId); } @Override public void onDestroy() { Log.d(TAG, "서비스 종료"); super.onDestroy(); } }
▼ Activity 에서 서비스 실행과 종료를 위한 버튼을 두 개 만들었습니다. 서비스를 실행하는 startService(), 종료할 때 stopService() 함수를 호출합니다. 두 함수 모두 Context 를 상속받아 만든 ContextWrapper 에 포함되어 있습니다. 그림처럼 Activity 는 ContextWrapper 를 상속받아 만들었기 때문에 함수를 바로 사용할 수 있습니다.
public class PhoneCallActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_phone_call); Button btnStart = (Button) findViewById(R.id.btn_service_start); Button btnEnd = (Button) findViewById(R.id.btn_service_end); btnStart.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { // 서비스 시작하기 Intent intent = new Intent( getApplicationContext(),// Activiey Context PhoneCallService.class); // 이동할 서비스 객체 startService(intent); // 서비스 시작 } }); btnEnd.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { // 서비스 종료하기 Intent intent = new Intent( getApplicationContext(),// Activiey Context PhoneCallService.class); // 이동할 서비스 객체 stopService(intent); // 서비스 종료 } }); } }
activity_phone_call.xml : 화면을 구성하는 XML 입니다.
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <Button android:id="@+id/btn_service_start" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="서비스 시작" /> <Button android:id="@+id/btn_service_end" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="서비스 종료" /> </LinearLayout>
▼ 다음은 AndroidManifest.xml 에 Service 를 등록해야 합니다. 위치는 <application> 태그 안입니다.
<application android:name=".CustomApplication" android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".PhoneCallActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <service android:name=".PhoneCallService" /> </application>
▼ Activity 를 실행해서 서비스 시작과 종료 버튼을 클릭해 보세요. 서비스 내부에 추가한 콘솔 출력 함수인 Log.d() 를 통해서 이상 없이 수행되고 있음을 알 수 있습니다. 다음 포스팅에서는 Service Bind 구현해 보겠습니다. Bind 는 Activity 와 Service 간에 데이터를 주고 받을 수 있는 인터페이스 입니다. 백그라운드에서 돌아가는 Service 를 제어하고 결과값을 받아 처리하기 위해서는 반드시 알아야 할 기능입니다.
'안드로이드 개발' 카테고리의 다른 글
안드로이드 개발 서비스 바인딩 (Service Bind) 예제 구현하는 방법 (0) | 2018.01.18 |
---|---|
안드로이드 개발 레이아웃 인플레이션(LayoutInflater)으로 화면 구성하는 방법 (0) | 2018.01.04 |
안드로이드 개발 setId() 에러 Expected resource of type id 해결하는 방법 (0) | 2018.01.02 |
안드로이드 개발 Activity 호출하고 결과값을 받는 onActivityForResult 사용하는 방법 (0) | 2017.12.30 |
안드로이드 개발 생성자 추가하는 방법, There is no default constructor available in (0) | 2017.12.23 |
안드로이드 개발 RelativeLayout 화면을 Java 소스에서 구현하는 방법 (0) | 2017.12.17 |
안드로이드 개발 No orientation specified, and the default is horizontal. This is a common source of bugs when children are added dynamically. 에러 해결 (0) | 2017.12.06 |
안드로이드 개발 Android WebView 로컬 HTML 파일 표현하는 방법 (0) | 2017.12.04 |