본문 바로가기

Development/Android Studio

(Android Studio) Chapter9. Service(Background Music play)

1. Service

  1) 기능

    - 백그라운드에서 미디어를 재생할 수 있는 기능

  2) 빌드 프로세스

    - 레이아웃 설정(버튼, 텍스트 등) > MainActivity에 버튼 구현 - 별도의 클래스 설정을 위한 파일 생성(ex. MusicService.java) > 서비스 시작, 초기화, 서비스 종료 선언 > 재생할 음악 리소스파일에 추가(raw 디렉토리 생성 후 파일 넣기, 전체 소문자, 특수문자와 띄어쓰기 포함 불가) > 직전단계에서 노래 불러오기 > AndroideManifest에 서비스 추가

 

  3) 코드 예시

    - 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:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/btn_start"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="서비스 시작"/>

    <Button
        android:id="@+id/btn_stop"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="서비스 종료"/>

</LinearLayout>

    - MainActivity

package com.example.serviceexample;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {


    Button btn_start, btn_stop;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        btn_start = (Button)findViewById(R.id.btn_start);
        btn_stop = (Button)findViewById(R.id.btn_stop);

        btn_start.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startService(new Intent(getApplicationContext(), MusicService.class));
            }
        });

        btn_stop.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                stopService(new Intent(getApplicationContext(), MusicService.class));
            }
        });


    }
}

     - MusicServic.java

package com.example.serviceexample;

import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.IBinder;

import androidx.annotation.Nullable;

import java.security.Provider;

public class MusicService extends Service {
    MediaPlayer mediaPlayer;

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }


    @Override   // 서비스 시작
    public void onCreate() {
        super.onCreate();
        // 음악파일 생성
        mediaPlayer = MediaPlayer.create(this, R.raw.iceandfire); //노래파일 불러오기 
        mediaPlayer.setLooping(false);  //반복 여부
    }

    @Override  // 초기화
    public int onStartCommand(Intent intent, int flags, int startId) {

        mediaPlayer.start(); // 음악 시작
        return super.onStartCommand(intent, flags, startId);
    }

    @Override  // 서비스 종료
    public void onDestroy() {

        mediaPlayer.stop(); // 음악 끄기

        super.onDestroy();
    }
}

    - AndroidManifest(추가 위치 참고)

    </activity>

    <service android:name=".MusicService"/>

</application>

  4) 강의 문제점

    - 이전 카메라 불러오기 강의에서 엑세스 권한 받아오는 방식의 변화로 최근과 코드가 다름

    - 메소드나 클래스가 마이그레이션 된 것은 아니라 큰 문제는 없어보이나 권한의 문제가 발생할 여지가 있어보임(확인 필요)

 

2. 참고 사이트

https://developer.android.com/reference/android/app/Service#WhatIsAService

 

Service  |  Android Developers

 

developer.android.com