코딩스토리

[Android/안드로이드] Service를 이용한 백그라운드 음악플레이어 기능 본문

Android/유용한 기술

[Android/안드로이드] Service를 이용한 백그라운드 음악플레이어 기능

라크라꾸 2020. 9. 27. 13:56

음악 앱을 사용할 때는 앱을 실행했을 때 말고도 다른 앱을 실행하거나 휴대폰을 잠금화면으로 전환해도 음악이 재생되도록 구현되어있습니다. 이렇게 인터페이스가 없어도 백그라운드에서 실행되는 동작을 안드로이드에서는 Service(서비스)를 통해서 제공해줍니다.

 

우선 서비스를 구현하기 위한 기본적인 순서는 다음과 같습니다.

1. Service 클래스 생성

2. Androidmanifest.xml에 Service를 등록

3, Service를 시작하도록 호출

 

Service 클래스 생성

MusicService.java

	
    package com.lakue.servicemusicsample;
	
	import android.app.Service;
	import android.content.Intent;
	import android.media.MediaPlayer;
	import android.os.IBinder;
	
	import androidx.annotation.Nullable;
	
	public class MusicService extends Service {
	
	    MediaPlayer mediaPlayer; //음악 재생을 위한 객체
	
	    @Nullable
	    @Override
	    public IBinder onBind(Intent intent) {
	        //Service객체와 Activity사이에서 통신을 할 때 사용되는 메서드
	        //데이터 전달이 필요 없으면 null
	        return null;
	    }
	
	    @Override
	    public void onCreate() {
	        //서비스에서 가장 먼저 호출(최초한번)
	        mediaPlayer = MediaPlayer.create(this, R.raw.music);
	        mediaPlayer.setLooping(false); // 반복재생
	        super.onCreate();
	    }
	
	    @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();
	    }
	}
	

R.raw.music부분에서 에러가 날 수 있는데, res에서 raw폴더를 생성 해 재생시킬 음악을 넣어준 뒤, 그에 맞는 파일명을 넣어주면 됩니다.

 

 

Androidmanifest.xml에 Service를 등록
	
    <?xml version="1.0" encoding="utf-8"?>
	<manifest xmlns:android="http://schemas.android.com/apk/res/android"
	    package="com.lakue.servicemusicsample">
	
	    <application
	        ...
	        <activity android:name=".MainActivity">
	            ...
	        </activity>
	
	        <service android:name=".MusicService" />	//서비스 등록
	    </application>
	</manifest>
	

application 태그 안에 <service android:name=".MusicService" />를 통해 서비스를 등록해줍니다.

 

Service를 시작하도록 호출

activity_main.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:gravity="center"
	    android:orientation="vertical"
	    tools:context=".MainActivity">
	
	    <Button
	        android:id="@+id/btn_music_start"
	        android:layout_width="wrap_content"
	        android:layout_height="wrap_content"
	        android:text="음악 재생" />
	
	
	    <Button
	        android:id="@+id/btn_music_stop"
	        android:layout_width="wrap_content"
	        android:layout_height="wrap_content"
	        android:text="음악 종료" />
	
	</LinearLayout>
	

우선 서비스를 실행 할 레이아웃을 만들어줍니다.

 

MainActivity.java

	
    package com.lakue.servicemusicsample;
	
	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_music_start, btn_music_stop;
	    @Override
	    protected void onCreate(Bundle savedInstanceState) {
	        super.onCreate(savedInstanceState);
	        setContentView(R.layout.activity_main);
	
	        btn_music_start = findViewById(R.id.btn_music_start);
	        btn_music_stop = findViewById(R.id.btn_music_stop);
	
	        btn_music_start.setOnClickListener(new View.OnClickListener() {
	            @Override
	            public void onClick(View v) {
	                Intent intent = new Intent(getApplicationContext(), MusicService.class);
	                startService(intent);
	            }
	        });
	
	        btn_music_stop.setOnClickListener(new View.OnClickListener() {
	            @Override
	            public void onClick(View v) {
	                Intent intent = new Intent(getApplicationContext(), MusicService.class);
	                stopService(intent);
	            }
	        });
	
	    }
	}
	

음악 실행 버튼을 누르면 서비스를 실행하도록 하고, 음악종료 버튼을 누르면 서비스를 종료하도록 기능을 설정합니다.

 

이렇게 백그라운드에서도 음악이 재생될 수 있는 서비스를 구현해 보았습니다.

Comments