androidでバックグラウンドでも動作する
タイマーのアプリを作成しようと思って、
manifest xmlに serviceを追加してみたのですが、
タグの位置は下記のようなものでよろしいでしょうか?
それと、
serviceの属性のうち
android:foregroundServiceType="timer"
の箇所で
can not resolve flag というエラーが表示されるのですが、
これは build.gradleかなにかと関係があるのでしょうか?
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
<application
android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.TimerServiceTest01"
tools:targetApi="31">
<service
android:name=".MyTimerService"
android:foregroundServiceType="timer"
android:exported="false"/>
<activity
android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
↓
### 回答:
#### 1. **タグの位置**
問題ありません。
`<service>` タグは
`<application>` 内に記述するのが正しいので、
現在の配置で大丈夫です。
---
#### 2. **`android:foregroundServiceType="timer"` のエラー**
`can not resolve flag` というエラーが出る理由は、
`timer` という値が `android:foregroundServiceType` に
対応していない可能性が高いです。
この属性には
**Android 10 (API 29) から導入された特定のサービス種別**
を指定できますが、
公式ドキュメントを確認すると `timer` は **存在しません**。
✅ **解決策**:
- `foregroundServiceType="timer"` ではなく、
`foregroundServiceType="mediaPlayback"` や
`foregroundServiceType="systemExempted"` など、
適切なものに変更する。
- **または** `android:foregroundServiceType` を
**削除** する。
📌 **Androidで利用可能な
`foregroundServiceType` の一覧(APIレベル29以降)**
| 値 | 説明 |
|----|----|
| `dataSync` | データの同期 |
| `mediaPlayback` | メディアの再生 |
| `mediaProjection` | 画面キャプチャや録画 |
| `phoneCall` | 通話 |
| `remoteMessaging` | メッセージングアプリのバックグラウンド動作 |
| `systemExempted` | システムで許可された例外 |
| `location` | GPSなどの位置情報 |
| `connectedDevice` | BluetoothやUSB接続 |
| `health` | 健康管理アプリ |
| `specialUse` | 特別な用途 |
「タイマー」として実装する場合、
**本当にForeground Serviceが必要か?** を確認しつつ、
`mediaPlayback` などを使うのも一案です。
---
#### 3. **`build.gradle` の設定**
通常 `android:foregroundServiceType` で
`can not resolve flag` エラーが出る原因として
**APIレベルが古い** 可能性も考えられます。
✅ **対策: `compileSdk` を最新にする**
```gradle
android {
compileSdk 34 // 最新のAPIレベルに変更
}
```
古いAPIレベルだと、
`foregroundServiceType` のオプションが
適用されていないことがあります。
---
### **まとめ**
1. **`android:foregroundServiceType="timer"` は
無効なので削除するか、適切な値に変更する。**
2. **APIレベルが低い場合は `compileSdk` を更新する。**
3. **Manifestのタグ配置は問題なし。**
💡 **アドバイス**
そもそも「タイマー」はバックグラウンドで動作する必要があるなら、
`Handler` や `WorkManager` を使うのもアリです。
`ForegroundService` にする必要があるのは、
**アプリが閉じられてもタイマーを動かし続ける** 場合だけなので、
`WorkManager` の `PeriodicWorkRequest` なども検討してください。
コメント
コメントを投稿