# ライブアクティビティ

Android Live Activity 通知は、 [iOS Live Activities](/pushly-ja/integration/implementation-steps/android/sdk-kotlin-java/raibuakutibiti.md) と同様の機能セットと体験を Android プラットフォーム上で提供し、プッシュ通知を通じてリアルタイムに更新されたコンテンツを配信できます。

PushSDK は、開発者が Live Activity のハンドラーを登録・管理できるようにすることで、Live Activity の登録と更新を効率化します。登録されたハンドラーは、当社のサーバー API 経由で更新できます。

## 前提条件

SDKにLive Activitiesを統合する前に、以下の要件を満たしている必要があります:

* Firebase Sender ID と Server API Key、または Service Account を使用して設定された Android Send Integration。
* Android アプリ。
* Google Play Store Services がインストールされた API 19 以上（Android 4.4）を実行するデバイスまたはエミュレーター。
* Live Activities をサポートする PushSDK リリース（下のバージョンサポート表を参照）。

## ステップ 1: Android SDK のセットアップ

アプリケーションが **まだ** PushSDKを使用していない場合は、ネイティブアプリのPushセットアップガイドを参照してください。 [Android](#step-1-android-sdk-setup).

すでにPushSDKを使用しているアプリケーションでは、Live Activity対応を含む後のバージョンへのアップグレードが必要になる場合があります。以下の表を使って、インストールのアップグレードが必要かどうかを確認してください。

<table><thead><tr><th width="190">SDK</th><th>Live Activitiesを含む最初のバージョン</th></tr></thead><tbody><tr><td><a href="/pages/cbbabfb7e991b5a65c383dd6c30fcd59e4fcb016">Kotlin / Java</a></td><td>1.3.0+</td></tr></tbody></table>

{% tabs %}
{% tab title="app/build.gradle" %}

```gradle
dependencies {
    ...
    implementation 'com.pushly.android:pushsdk:[1.3, 2.0['
}
```

{% endtab %}
{% endtabs %}

## ステップ 2: Live Activity 更新用ハンドラーの作成

更新を処理して表示するには、 `PNLiveActivityHandler` クラスを実装する必要があります。このハンドラーには、 `name` この種のアクティビティを一意に識別し、プッシュ経由で開始するためのものです。任意の通知 `channelId` も指定でき、Live Activity 通知を専用チャネルにまとめられます。カスタム channel ID が指定されない場合、PushSDK はデフォルトのチャネルを使用します。

1つの `onUpdate` メソッドを実装する必要があり、受信したすべての Live Activity イベント（開始、更新、終了）を処理します。このメソッドを使って、更新内容の表示方法をカスタマイズしてください。

{% tabs %}
{% tab title="Kotlin" %}

```kotlin
class MyActivityHandler : PNLiveActivityHandler(
    name = "game_updates",
    channelId = "sports_channel"
) {
    override fun onUpdate(context: Context, contentState: ContentState): PNLiveActivityUpdateResult {
        // 通知ビルダーを作成
        val builder = Notification.Builder(context, channelId)
            .setSmallIcon(R.drawable.ic_notification)
            .setContentTitle("Game Update")
            .setContentText("${contentState.getString("home_team")} vs ${contentState.getString("away_team")}")
        
        // 結果とともにビルダーを返す
        return PNLiveActivityUpdateResult.Ok(builder)
    }
}
```

{% endtab %}

{% tab title="Java" %}

```java
class MyActivityHandler extends PNLiveActivityHandler {
    public MyActivityHandler() {
        super("game_updates", "sports_channel");
    }

    @Override
    public @NonNull PNLiveActivityUpdateResult onUpdate(@NonNull Context context, @NonNull ContentState contentState) {
        String homeTeam = contentState.getStringOrDefault("home_team", "Home Team");
        String awayTeam = contentState.getStringOrDefault("away_team", "Away Team");

        // 通知ビルダーを作成
        NotificationCompat.Builder builder = new NotificationCompat.Builder(context, this.getChannelId())
                .setSmallIcon(R.drawable.ic_notification)
                .setContentTitle("Game Update")
                .setContentText(String.format("%s, vs %s", homeTeam, awayTeam));

        // 結果とともにビルダーを返す
        return new PNLiveActivityUpdateResult.Ok(builder);
    }
}
```

{% endtab %}
{% endtabs %}

### ハンドラーの登録

ハンドラーを実装したら、PushSDK に登録する必要があります。以下のコードスニペットは、ハンドラーの登録方法を示しています。

{% tabs %}
{% tab title="Kotlin" %}

```kotlin
class MainApplication : Application() {
    override fun onCreate() {
        super.onCreate()
        
        // ... PushSDK の設定コード

        PushSDK.LiveActivities.register(MyActivityHandler())
    }
}
```

{% endtab %}

{% tab title="Java" %}

```java
class MainApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        
        // ... PushSDK の設定コード

        PushSDK.LiveActivities.register(new MyActivityHandler());
    }
}
```

{% endtab %}
{% endtabs %}

## ステップ 3: Live Activity の開始

### アプリ内から開始する

以下のコードスニペットでは、一意の `activityId` 、 `handler` 名、以前に登録したハンドラークラスに対応する名前、およびアクティビティの初期 `contentState` を指定して Live Activity の開始を要求します。このシナリオでは、 `PNLiveActivityHandler` クラスを次の名前で登録して使用します: `game_updates`.

{% tabs %}
{% tab title="Kotlin" %}
{% code fullWidth="false" %}

```kotlin
class MainActivity : AppCompatActivity() {
    public fun startLiveActivity() {
        PushSDK.LiveActivities.start(
            activityId = "my_activity_id",
            handler = "game_updates", // 登録済みハンドラー名と一致する必要があります
            contentState = contentStateOf(
                "home_team" to "Chiefs",
                "home_team_score" to 0,
                "away_team" to "Chargers",
                "away_team_score" to 0
            )
        )
    }
}
```

{% endcode %}
{% endtab %}

{% tab title="Java" %}

```java
class MainActivity extends AppCompatActivity {
    public void startLiveActivity() {
        PushSDK.LiveActivities.start(
            "my_activity_id",
            "game_updates", // 登録済みハンドラー名と一致する必要があります
            ContentState.builder()
                .put("home_team", "Chiefs")
                .put("home_team_score", 0)
                .put("away_team", "Chargers")
                .put("away_team_score", 0)
                .build()
        );
    }
}
```

{% endtab %}
{% endtabs %}

#### コンテンツ状態

`ContentState` は、Live Activities にデータを渡すために使用されます。便利なメソッド `contentStateOf()`:

{% tabs %}
{% tab title="Kotlin" %}
{% code fullWidth="false" %}

```kotlin
val state = contentStateOf(
    "key1" to "value1",
    "key2" to 42,
    "key3" to null
)
```

{% endcode %}
{% endtab %}

{% tab title="Java" %}

```java
ContentState state = ContentState.builder()
    .put("key1", "value1")
    .put("key2", 1)
    .put("key3", null)
    .build();
```

{% endtab %}
{% endtabs %}

`ContentState` は、次の値の型をサポートしています: String、Int、Long、Float、Double、Boolean、null。

### プッシュ経由で開始

ハンドラーを PushSDK に登録したら、当社の [Live Activity APIドキュメント](https://developers.pushly.com/reference/management-update-live-activity) を使用して、対応するハンドラー名を `activity.android.data.handler_name` プロパティに指定し、リクエストパスに関連付けられた一意のアクティビティ識別子を渡すことで、開始イベントを送信できます。このシナリオでは、 `my_activity_id` に設定して使用しました。これは後続の更新イベントで使用できます。

{% tabs %}
{% tab title="開始リクエストの例" %}

```json
POSTリクエスト先:
https://api.pushly.com/domains/{domain_id}/live-activities/my_activity_id
{
    "name": "my-request-event-name",
    "event": "start",
    "activity": {
        "android": {
            "data": {
                "handler_name": "game_updates",
                "content_state": {
                    "home_team": "Chiefs",
                    "home_team_score": 0,
                    "away_team": "Chargers",
                    "away_team_score": 0
                },
                "notification": {
                    "title": "The Game Has Begun",
                    "body": "今後の更新をお待ちください！"
                }
            }
        }
    }
}
```

{% endtab %}
{% endtabs %}

## ステップ 4: Live Activity を更新する

Live Activity がローカルまたはプッシュ経由で開始されたら、当社の [Live Activity APIドキュメント](https://developers.pushly.com/reference/management-update-live-activity) を使って、単一のリクエストで登録済みのすべてのLive Activityに更新を送信できます。

{% tabs %}
{% tab title="更新イベントの例" %}
{% code fullWidth="false" %}

```json
POSTリクエスト先:
https://api.pushly.com/domains/{domain_id}/live-activities/my_activity_id
{
    "name": "my-request-event-name",
    "event": "update",
    "activity": {
        "android": {
            "data": {
                "content_state": {
                    "home_team": "Chiefs",
                    "home_team_score": 7,
                    "away_team": "Chargers",
                    "away_team_score": 0
                }
            }
        }
    }
}
```

{% endcode %}
{% endtab %}
{% endtabs %}

## ステップ 5: Live Activities の削除

iOS Live Activities の仕組みと同様に、Android Live Activity 通知は開始から 12 時間後に自動的に終了し、クリーンアップされます。ただし、その時間制限に達する前にアクティビティをクリーンアップしたい場合もあるでしょう。そのような場合は、次のメソッドで単一のアクティビティを削除するか、すべてのアクティブなアクティビティを削除できます。

### 特定のアクティビティを削除

{% tabs %}
{% tab title="Kotlin" %}
{% code fullWidth="false" %}

```kotlin
PushSDK.LiveActivities.remove(activityId = "my_activity_id")
```

{% endcode %}
{% endtab %}

{% tab title="Java" %}

```java
PushSDK.LiveActivities.remove("my_activity_id");
```

{% endtab %}
{% endtabs %}

### すべてのアクティビティを削除

{% tabs %}
{% tab title="Kotlin" %}
{% code fullWidth="false" %}

```kotlin
PushSDK.LiveActivities.removeAll()
```

{% endcode %}
{% endtab %}

{% tab title="Java" %}

```java
PushSDK.LiveActivities.removeAll();
```

{% endtab %}
{% endtabs %}

## ベストプラクティス

1. アプリケーションの `onCreate` メソッドで常にハンドラーを登録し、適切に初期化してください。
2. 適切に設定された `Notification.Builder` をハンドラーの `onUpdate` メソッド内に追加します。
3. 一貫したアクティビティ ID を使用して、特定のアクティビティを正しく追跡・更新してください。
4. ハンドラーの `onUpdate` メソッド内に追加します。
5. すべての可能な状態を処理してください。
6. 目的を反映した意味のあるハンドラー名を使用してください。
7. 不要になったアクティビティは、を使用して、または手動でいずれかの削除メソッドを呼び出してクリーンアップしてください。 `end` イベント


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://documentation.pushly.com/pushly-ja/integration/implementation-steps/android/sdk-kotlin-java/raibuakutibiti.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
