Androidスマホ起動時に自動的にサービスを起動させる

以前、Androidのフォアグラウンドサービスを使って、位置情報を常に取得するサービスを作成しました。

[Androidのフォアグラウンドサービスで位置情報を取得する]( https://qiita.com/poruruba/items/aa02207080a390e1ac85)

今回は、これをCordovaプラグインにするとともに、Androidスマホ起動時にも自動的に起動するようにします。

ちなみに、この投稿は、以下の投稿の補足です。全ソースファイルは以下を参照してください。
　[散歩ルート計画アプリを作った](https://qiita.com/poruruba/items/90d25395670f1bf5a5fe)

# AndroidManifest.xml

Androidスマホの起動時に、OSから通知されるブロードキャストを受け取ることで、起動時の処理ができるようになります。
そのために、以下のパーミッションを付けておく必要があります。

```xml:AndroidManifest.xml
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
```

次に、受け取り先のクラスを指定します。

```xml:AndroidManifest.xml
    <receiver android:name="jp.or.myhome.sample.plugin.LocationRecorder.Main$StartupReceiver" android:exported="false">
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED" />
            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </receiver>
```

受け取り先のクラスは、BroadcastReceiverを継承しておく必要があります。

```java:Main.java
    public static class StartupReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            Log.d(TAG, "StartupReceiver.onReceive");

            ・・・・・

        }
    }
```

上記のクラスは、Main.javaの中に定義したので、AndroidManifestには以下のような記載になっています。

```android:name="jp.or.myhome.sample.plugin.LocationRecorder.Main$StartupReceiver"```

# plugin.xml

結局のところ、Cordovaプラグインのplugin.xmlは以下のようになりました。

```xml:plugin.xml
<?xml version="1.0" encoding="UTF-8"?>
<plugin xmlns="http://apache.org/cordova/ns/plugins/1.0"
    id="cordova-plugin-locationrecorder" version="0.0.1">
    <name>LocationRecorderPlugin</name>
    <js-module src="www/plugin_locationrecorder.js" name="locationrecorderplugin">
        <clobbers target="locationrecorderplugin" />
    </js-module>
    <platform name="android">
        <config-file target="res/xml/config.xml" parent="/*">
            <feature name="LocationRecorderPlugin" >
                <param name="android-package" value="jp.or.myhome.sample.plugin.LocationRecorder.Main"/>
                <param name="onload" value="true" />
            </feature>
        </config-file>
        <config-file target="res/xml/config.xml" parent="/*">
            <preference name="android-minSdkVersion" value="26" />
        </config-file>
        <config-file target="AndroidManifest.xml" parent="/manifest">
            <uses-permission android:name="android.permission.INTERNET" />
            <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
            <uses-permission android:name="android.permission.FOREGROUND_SERVICE_LOCATION" />
            <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
            <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
            <uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
            <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
        </config-file>
        <config-file target="AndroidManifest.xml" parent="/manifest/application">
            <service android:name="jp.or.myhome.sample.plugin.LocationRecorder.LocationService" android:exported="false" android:foregroundServiceType="location" />
            <receiver android:name="jp.or.myhome.sample.plugin.LocationRecorder.Main$StartupReceiver" android:exported="false">
                <intent-filter>
                    <action android:name="android.intent.action.BOOT_COMPLETED" />
                    <category android:name="android.intent.category.DEFAULT" />
                </intent-filter>
            </receiver>
        </config-file>
        <source-file src="src/android/jp/or/myhome/sample/plugin/LocationRecorder/Main.java" target-dir="src/jp/or/myhome/sample/plugin/LocationRecorder" />
        <source-file src="src/android/jp/or/myhome/sample/plugin/LocationRecorder/LocationService.java" target-dir="src/jp/or/myhome/sample/plugin/LocationRecorder" />
        <source-file src="src/android/jp/or/myhome/sample/plugin/LocationRecorder/LocationDbHelper.java" target-dir="src/jp/or/myhome/sample/plugin/LocationRecorder" />
        <source-file src="src/android/jp/or/myhome/sample/plugin/LocationRecorder/HttpPostJson.java" target-dir="src/jp/or/myhome/sample/plugin/LocationRecorder" />
        <framework src="com.google.android.gms:play-services-location:21.0.1" />
    </platform>
</plugin>
```

以上