Androidのバックグラウンド音楽サービスとは?Serviceを使った音楽再生の実装方法を解説
Androidのバックグラウンド音楽サービス(Music Service)とは?
Androidアプリ開発では、UIと直接やり取りすることなくバックグラウンドで処理を続けるための仕組みとして「Service(サービス)」が用意されています。Serviceはアクティビティ(Activity)が破棄された後も動作を続けられるため、音楽再生のように長時間にわたるタスクに最適なコンポーネントです。
本記事では、実際のコード例を交えながら、Androidでバックグラウンド音楽サービスを実装する手順をステップごとに解説します。
ステップ1:Android Studioで新規プロジェクトを作成する
まず、Android Studioを開き、「File」→「New Project」から新しいプロジェクトを作成します。プロジェクト名やパッケージ名など、必要な項目を入力して進めてください。
ステップ2:activity_main.xmlにコードを追加する
次に、res/layout/activity_main.xmlに以下のコードを追加します。
<?xml version = "1.0" encoding = "utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android = "https://schemas.android.com/apk/res/android"
xmlns:app = "https://schemas.android.com/apk/res-auto"
xmlns:tools = "https://schemas.android.com/tools"
android:layout_width = "match_parent"
android:layout_height = "match_parent"
tools:context = ".MainActivity">
<TextView
android:id = "@+id/text"
android:layout_width = "wrap_content"
android:layout_height = "wrap_content"
android:text = "Start Service"
android:textSize = "25sp"
app:layout_constraintBottom_toBottomOf = "parent"
app:layout_constraintLeft_toLeftOf = "parent"
app:layout_constraintRight_toRightOf = "parent"
app:layout_constraintTop_toTopOf = "parent" />
</android.support.constraint.ConstraintLayout>
このコードでは、画面中央にTextViewを1つ配置しています。ユーザーがこのTextViewをタップすると、音楽サービスの開始/停止が切り替わる仕組みです。
ステップ3:MainActivity.javaにコードを追加する
続いて、src/MainActivity.javaに以下のコードを追加します。
package com.example.andy.myapplication;
import android.app.ActivityManager;
import android.content.Context;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final TextView text = findViewById(R.id.text);
text.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (isMyServiceRunning(service.class)) {
text.setText("Stoped");
stopService(new Intent(MainActivity.this, service.class));
} else {
text.setText("Started");
startService(new Intent(MainActivity.this, service.class));
}
}
});
}
private boolean isMyServiceRunning(Class<?> serviceClass) {
ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
for (ActivityManager.RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
if (serviceClass.getName().equals(service.service.getClassName())) {
return true;
}
}
return false;
}
}
このコードでは、Intentを使ってコンテキストとサービスクラスを渡すことで、サービスの開始(startService)と停止(stopService)を制御しています。isMyServiceRunning()メソッドは、対象のサービスがすでに起動中かどうかを判定するために使用されます。
次に、パッケージフォルダ内にserviceクラスを作成し、以下のコードを追加します。
package com.example.andy.myapplication;
import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.IBinder;
import android.widget.Toast;
public class service extends Service {
MediaPlayer musicPlayer;
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
musicPlayer = MediaPlayer.create(this, R.raw.abc);
musicPlayer.setLooping(false);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Toast.makeText(this, "Music Service started by user.", Toast.LENGTH_LONG).show();
musicPlayer.start();
return START_STICKY;
}
@Override
public void onDestroy() {
super.onDestroy();
musicPlayer.stop();
Toast.makeText(this, "Music Service destroyed by user.", Toast.LENGTH_LONG).show();
}
}
ここでのポイントは、MediaPlayerクラスを使って音楽の再生と停止を管理している点です。該当する処理を抜粋すると、以下のようになっています。
@Override
public void onCreate() {
super.onCreate();
musicPlayer = MediaPlayer.create(this, R.raw.abc);
musicPlayer.setLooping(false);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Toast.makeText(this, "Music Service started by user.", Toast.LENGTH_LONG).show();
musicPlayer.start();
return START_STICKY;
}
@Override
public void onDestroy() {
super.onDestroy();
musicPlayer.stop();
Toast.makeText(this, "Music Service destroyed by user.", Toast.LENGTH_LONG).show();
}
各ライフサイクルメソッドの役割:
- onCreate():rawフォルダに配置した音声ファイル(R.raw.abc)を読み込み、MediaPlayerインスタンスを生成します。
- onStartCommand():サービス開始時に呼ばれ、音楽の再生を開始します。
START_STICKYを返すことで、システムに強制終了された場合もサービスが再作成されるようになります。 - onDestroy():サービス破棄時に呼ばれ、音楽の再生を停止します。
ステップ4:manifest.xmlにコードを追加する
最後に、manifest.xmlに以下のようにサービスを宣言します。
<?xml version = "1.0" encoding = "utf-8"?>
<manifest xmlns:android = "https://schemas.android.com/apk/res/android"
package = "com.example.andy.myapplication">
<application
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 = ".MainActivity">
<intent-filter>
<action android:name = "android.intent.action.MAIN" />
<category android:name = "android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service android:name = ".service"/>
</application>
</manifest>
マニフェストへのサービス登録を忘れると、アプリ実行時にクラッシュするので注意してください。
アプリケーションを実行して動作を確認する
それでは、アプリケーションを実行してみましょう。実際のAndroid端末をPCに接続した状態を前提とします。Android Studioからアプリを起動するには、プロジェクト内のアクティビティファイルを開き、ツールバーの「Run」アイコンをクリックしてください。実行デバイスとして接続したスマートフォンを選択すると、端末に以下の初期画面が表示されます。

この初期画面でTextViewをタップすると、以下のように音楽サービスが開始され、トーストで通知が表示されます。

さらに、サービス起動中にもう一度TextViewをタップすると、以下のように音楽サービスが停止します。

まとめ
本記事では、AndroidのServiceとMediaPlayerを組み合わせて、アクティビティに依存しないバックグラウンド音楽再生を実装する方法を紹介しました。なお、getRunningServices()は新しいAndroidバージョンでは非推奨(Deprecated)となっているため、最新のプロジェクトではサービスの状態管理に別の手法を採用することをおすすめします。音楽プレイヤーアプリや通知音の再生など、さまざまな場面で応用できる基礎技術なので、ぜひ実際に手を動かして試してみてください。
-
サービスパックとは?仕組みからWindowsの「ビルド」への移行まで徹底解説
サービスパックとは? サービスパック(SP)とは、オペレーティングシステム(OS)やアプリケーション向けの一連の更新プログラムをひとつにまとめたソフトウェアパッケージのことです。小規模な個別の更新は「パッチ」や「ソフトウェア更新」と呼ばれますが、開発元が多数の更新を蓄積すると、それらを統合してサービスパックとしてリリースします。サービスパックの目的はユーザーの生産性向上にあり、旧バージョンで発生していた問題の解消に加え、新機能の追加、既存機能の改良、セキュリティ上の欠陥(脆弱性)の修正なども含まれています。 サービスパックが必要な理由 なぜ企業は定期的にサービスパックをリリースするのでしょう
-
Windows 10の「Bonjourサービス」とは?正体と無効化・アンインストール方法を徹底解説
タスクマネージャーでリソースを消費しているプロセスを確認していた際、「Bonjour Service」という見慣れない名前を目にしたことがある方は少なくないでしょう。しかし、そのサービスが何者なのか、日々のPC利用においてどのような役割を果たしているのかを理解している人はさらに少数です。 まず最初にお伝えしたいのは、Bonjourサービスはウイルスではないという点です。これはAppleが開発した正規のソフトウェアであり、2002年からiOSやmacOSといった同社のオペレーティングシステムに搭載されています。このアプリケーションはAppleエコシステムに深く統合されており、全体的なユーザー体験