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

Androidアプリで端末起動時にサービスを自動開始する方法【コード例付きで解説】

はじめに

Androidアプリの中には、端末が再起動された後もバックグラウンド処理を継続したいケースがあります。本記事では、BroadcastReceiverBOOT_COMPLETEDアクションを組み合わせて、端末の起動完了時にサービスを自動的に開始する方法を、実際のコード例とともにステップごとに解説します。

この仕組みを実現するには、まずシステムから「起動完了」のブロードキャストを受け取るレシーバーを用意し、その中でActivityやServiceを起動します。以下の手順に従って実装していきましょう。

Step 1:新規プロジェクトを作成する

Android Studioを開き、「File」→「New Project」を選択して新しいプロジェクトを作成します。必要な項目(アプリ名、パッケージ名、保存先など)を入力してプロジェクトを完成させてください。

Step 2:レイアウトファイル(activity_main.xml)を編集する

res/layout/activity_main.xml に以下のコードを追加します。ここでは画面中央に「Hello World」と表示するシンプルなレイアウトを定義しています。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android"
    xmlns:tools="https://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="4dp"
    tools:context=".MainActivity">
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World"
        android:textSize="24sp"
        android:layout_centerInParent="true"
        android:textStyle="bold"/>
</RelativeLayout>

Step 3:起動完了を受け取るBroadcastReceiverを作成する

次に、新しいJavaクラス「StartAppOnBoot.java」を作成し、以下のコードを記述します。このクラスは BroadcastReceiver を継承しており、システムから ACTION_BOOT_COMPLETED(起動完了)のブロードキャストを受信すると、MainActivityを起動します。

ポイントは Intent.FLAG_ACTIVITY_NEW_TASK を指定している点です。BroadcastReceiverにはActivityのようなUIコンテキストがないため、新しいタスクでActivityを起動する必要があります。

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
public class StartAppOnBoot extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
    if (Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())) {
        Intent i = new Intent(context, MainActivity.class);
        i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(i);
        }
    }
}

Step 4:バックグラウンドで動作するServiceを作成する

続いて、新しいServiceクラス「RunServiceOnBoot.java」を作成し、以下のコードを追加します。このサービスは5秒間隔でHandlerを使って繰り返し処理を実行するシンプルな例です。

onStartCommand()START_STICKY を返すことで、システムによってサービスが強制終了された場合でも、可能な限り再起動されるようになります。

import android.content.Intent;
import android.os.Handler;
import android.os.IBinder;
import android.util.Log;
import android.widget.Toast;
public class RunServiceOnBoot extends android.app.Service {
    private static String TAG = "MyService";
    private Handler handler;
    private Runnable runnable;
    private final int runTime = 5000;
    @Override
    public void onCreate() {
        super.onCreate();
        Toast.makeText(this, "Service Started", Toast.LENGTH_SHORT).show();
        Log.i(TAG, "onCreate");
        handler = new Handler();
        runnable = new Runnable() {
            @Override
            public void run() {
                handler.postDelayed(runnable, runTime);
            }
        };
        handler.post(runnable);
    }
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }
    @Override
    public void onDestroy() {
        if (handler != null) {
            handler.removeCallbacks(runnable);
        }
        super.onDestroy();
    }
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        return START_STICKY;
    }
    @SuppressWarnings("deprecation")
    @Override
    public void onStart(Intent intent, int startId) {
        super.onStart(intent, startId);
        Log.i(TAG, "onStart");
    }
}

Step 5:MainActivityを実装する

src/MainActivity.java に以下のコードを記述します。onCreate() 内でRunServiceOnBootサービスを明示的に起動しておくことで、アプリを手動で起動した場合にもサービスが開始されます。

import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
public class MainActivity extends AppCompatActivity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Intent intent1 = new Intent(MainActivity.this, RunServiceOnBoot.class);
        startService(intent1);
    }
}

Step 6:AndroidManifest.xmlに権限とコンポーネントを登録する

最後に、androidManifest.xml に以下のコードを追加します。ここでの重要なポイントは2つあります。

  • RECEIVE_BOOT_COMPLETED権限:起動完了ブロードキャストを受信するために必須の権限です。
  • receiverのintent-filterBOOT_COMPLETED に加えて、一部のHTC端末などで使われる QUICKBOOT_POWERON も併せて指定することで、より多くの端末に対応できます。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android" package="app.com.sample">
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
    <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>
        <receiver android:name=".StartAppOnBoot" >
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
                <action android:name="android.intent.action.QUICKBOOT_POWERON" />
            </intent-filter>
        </receiver>
    <service android:name=".RunServiceOnBoot" />
</application>
</manifest>

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

それでは、実際にアプリを実行してみましょう。Android端末をPCに接続した状態で、Android Studioのツールバーにある「Run」アイコンをクリックします。実行デバイスとして自分のモバイル端末を選択してください。

アプリが起動するとデフォルト画面が表示され、同時にサービスも開始されます。その後、端末を再起動すると、起動完了時に自動的にアプリとサービスが立ち上がることを確認できます。

Androidアプリで端末起動時にサービスを自動開始する方法【コード例付きで解説】


Androidアプリで端末起動時にサービスを自動開始する方法【コード例付きで解説】


Androidアプリで端末起動時にサービスを自動開始する方法【コード例付きで解説】

まとめ

今回は、RECEIVE_BOOT_COMPLETED権限を持つBroadcastReceiverで起動完了を検知し、そこからActivityとServiceを起動する方法を紹介しました。常駐型の通知アプリや監視処理などを実装する際の基礎となるテクニックなので、ぜひ参考にしてください。なお、Android 8.0以降ではバックグラウンド制限が強化されているため、長時間の常駐処理にはフォアグラウンドサービスの利用も検討しましょう。

  1. 【Android開発】AlarmManagerを使ってサービスを起動する方法を徹底解説

    この記事では、AndroidアプリにおいてAlarmManager(アラームマネージャー)を使用してサービス(Service)を起動する方法を、サンプルコードとともにステップ形式で解説します。指定した時刻に処理を自動実行したい場合や、バックグラウンドでの定期処理を実装したい場合に役立つテクニックです。実装の全体像本チュートリアルで作成するアプリは、以下の構成になっています。「Start Service Alarm」ボタン:3秒後にサービスを起動するアラームをセット「Cancel Service」ボタン:セット済みのアラームをキャンセルそれでは、順番に実装していきましょう。ステップ1:新規プロジ

  2. 【Android】デバイス起動時にアプリを自動起動させる方法を徹底解説

    概要本記事では、Androidデバイスの電源投入・再起動が完了したタイミングで、アプリケーションを自動的に起動させる方法を解説します。BroadcastReceiverを使ってシステムが発行する「BOOT_COMPLETED」ブロードキャストを受け取り、そこからアクティビティを起動するのが基本的な仕組みです。実装手順ステップ1:新規プロジェクトの作成Android Studioを開き、File ⇒ New Project を選択します。必要な項目をすべて入力して、新しいプロジェクトを作成しましょう。ステップ2:レイアウトファイル(res/layout/activity_main.xml)の編集