Android
 Computer >> コンピューター >  >> プログラミング >> Android

Androidでバックグラウンドサービスを作成する方法をステップごとに解説

Androidのサービス(Service)とは?

本題に入る前に、Androidにおける「サービス」とは何かを簡単に確認しておきましょう。サービスとは、UI(ユーザーインターフェース)と直接やり取りすることなく、バックグラウンドで処理を実行するためのアプリコンポーネントです。最大の特徴は、アクティビティが破棄された後も処理を続けられる点にあります。

この記事では、実際のコード例を使いながら、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 = "サービスを開始"
        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>

このレイアウトでは、画面中央に1つのTextViewを配置しています。ユーザーがこのTextViewをタップするたびに、サービスの開始と停止が切り替わる仕組みです。

ステップ3:MainActivity.javaを実装する

src/MainActivity.java に以下のコードを追加します。

package com.example.andy.myapplication;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
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 (text.getText().toString().equals("実行中")) {
                    text.setText("停止中");
                    stopService(new Intent(MainActivity.this, service.class));
                } else {
                    text.setText("実行中");
                    startService(new Intent(MainActivity.this, service.class));
                }
            }
        });
    }
}

このコードでは、Intentを使ってサービスを開始・停止しています。startService() メソッドと stopService() メソッドに対して、Context(ここでは MainActivity.this)と対象のサービスクラスを渡すのが基本形です。TextViewに表示されているテキストの内容によって、現在の状態を判定して処理を分岐させている点もポイントです。

サービスクラスを作成する

続いて、パッケージフォルダ内に service.java という名前でサービスクラスを作成し、以下のコードを追加します。

package com.example.andy.myapplication;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.widget.Toast;
public class service extends Service {
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Toast.makeText(this, "サービスを開始しました", Toast.LENGTH_LONG).show();
        return START_STICKY;
    }
    @Override
    public void onDestroy() {
        super.onDestroy();
        Toast.makeText(this, "サービスを停止しました", Toast.LENGTH_LONG).show();
    }
}

onStartCommand() はサービスが開始されるたびに呼び出されるメソッドで、ここではToastで開始を通知しています。戻り値を START_STICKY に設定すると、システムに強制終了された場合でもサービスが自動的に再生成されます。また、onDestroy() はサービスが破棄されるタイミングで呼び出されるメソッドです。

ステップ4:AndroidManifest.xmlにサービスを宣言する

manifest.xml に以下のコードを追加します。Serviceクラスはマニフェストへの宣言が必須なので、忘れずに登録しましょう。

<?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>

特に重要なのは <service android:name = ".service"/> の部分です。application 要素の中で、作成したサービスクラスを宣言しています。

アプリを実行して動作を確認する

それでは、実際にアプリを実行してみましょう。ここでは、実機のAndroidスマートフォンがPCに接続されているものとします。Android Studioでプロジェクト内のアクティビティファイルを開き、ツールバーの「Run」アイコンをクリックします。実行デバイスとして自分のスマートフォンを選択すると、端末に以下のような初期画面が表示されます。

Androidでバックグラウンドサービスを作成する方法をステップごとに解説

上の画像が初期画面です。TextViewをタップすると、次のようにサービスが起動します。

Androidでバックグラウンドサービスを作成する方法をステップごとに解説

サービスが起動した状態で、もう一度TextViewをタップすると、以下のようにサービスが停止します。

Androidでバックグラウンドサービスを作成する方法をステップごとに解説

まとめ

Androidのバックグラウンドサービスは、UIを持たずに継続的な処理を実行できる強力なコンポーネントです。今回は最小構成のサンプルとして、TextViewのタップでサービスを開始・停止する方法を紹介しました。実際の開発では、位置情報の取得や音楽再生など、UIに依存しない処理を実装する際にサービスが活用されます。

  1. AndroidアプリでTextToSpeech(音声読み上げ)機能を実装する方法をわかりやすく解説

    このチュートリアルでは、AndroidアプリにTextToSpeech(音声合成・TTS)機能を実装し、入力したテキストを音声で読み上げる方法を解説します。サンプルでは、シークバーを使って音声のピッチ(声の高さ)とスピード(話す速さ)を調整できる、実用的な構成になっています。 手順1:Android Studioで新規プロジェクトを作成 Android Studioを起動し、メニューから File ⇒ New Project を選択します。必要な項目をすべて入力して、新しいプロジェクトを作成しましょう。 手順2:レイアウトファイル(activity_main.xml)を編集 res/layou

  2. FacebookでAndroidアプリを作成する方法|開発者サイトでの設定手順を徹底解説

    この記事では、FacebookでAndroidアプリを作成する方法について詳しく解説します。AndroidアプリとFacebookを連携させるには、Facebook開発者サイトでFacebookアプリを作成し、Facebook App IDを取得する必要があります。以下の手順に従って、順番に進めていきましょう。 準備:Facebook開発者サイトで新しいアプリを追加する まず、https://developers.facebook.com/ にアクセスし、「新しいアプリを追加」をクリックしてアプリの作成を開始します。 ステップ1:アプリ名とメールアドレスを入力する 指定されたフィールドに、作