ホーム > デベロッパ > BREW プログラミング入門 > サスペンドとレジューム > - 1 / 2 -

サスペンドとレジューム - 1 / 2 -

BREW のサスペンドとレジューム

電話の着信など優先度の高いイベントが発生すると BREW アプリは処理を停止します。通話などのタスクが終わると、 BREW アプリは中断していた処理を再開します。

BREW アプリの処理の停止を"サスペンド"、再開を"レジューム"と呼びます。

※ サスペンド状態からもアプリは終了することがあります。サスペンド状態の BREW アプリの終了確認ダイアログで"終了"を選択したときなどです。

【 BREW アプリの状態遷移フロー 】
BREW アプリの サスペンドとレジューム

注意事項

サスペンド時は BREW のインターフェースとメモリの解放に気を付けましょう。コールバック処理はキャンセルします。

アプリの概要

BREW プログラミング入門 「HTML を取得しよう - 1 / 3 -」 で作成したアプリを、サスペンド / レジュームに対応させます。

最初に、"Push Select Key... " を表示します。
セレクトキーが押されると、通信が開始します。
いつサスペンドしても正常にレジュームします。通信中の場合、サスペンド時に通信はキャンセルされます。

イベントハンドリング

サスペンドやレジュームのタイミングで、アプリは EVT_APP_SUSPEND と EVT_APP_RESUME イベントを受け取ります。これらのイベントを適切に処理することで、アプリの停止と再開ができます。

static boolean SuspendApp_HandleEvent(SuspendApp* app, AEEEvent eCode,
                                          uint16 wParam, uint32 dwParam)
{ 
    switch (eCode) {
        case EVT_APP_SUSPEND:
            return OnAppSuspend(app);

        case EVT_APP_RESUME:
            return OnAppResume(app);

        // (略)
    }

    return FALSE;
}

サスペンド処理

サスペンド処理がアプリ終了処理と異なる点は、レジュームに必要なメモリを保持するくらいでその他はほぼ同じです。コールバック処理は CALLBACK_Cancel マクロ関数などでキャンセルします。

//EVT_APP_SUSPEND イベントの処理
static boolean OnAppSuspend(SuspendApp* app)
{
    // サスペンドしたことを記録
    COMMON_WriteString(&app->common, "*** suspended!\n");
    // 各種開放処理
    CALLBACK_Cancel(&app->callback);
    IWEB_Release(app->web);
    app->web = NULL;
    return TRUE;
}

レジューム処理

レジューム処理では、サスペンド時に解放したインターフェースやメモリを再取得します。キャンセルしたコールバック処理は再設定します。

最後に画面を再描画します。

//EVT_APP_RESUME イベントの処理
static boolean OnAppResume(SuspendApp* app)
{
    IShell* shell = app->a.m_pIShell;

    // レジュームしたことを記録
    COMMON_WriteString(&app->common, "*** resumed!\n");
    // 各種インスタンス作成
    app->web = NULL;
    ISHELL_CreateInstance(shell, AEECLSID_WEB, (void**)&app->web);
    if (app->web != NULL) {
        // 画面の再描画
        COMMON_Draw(&app->common);
        return TRUE;
    }
    return FALSE;
}

リソースの二重解放

終了処理ではすべてのリソースを解放します。サスペンド状態からの終了処理では、リソースの二重解放に注意してください。

//EVT_APP_STOP イベントの処理
static boolean OnAppStop(SuspendApp* app)
{
    // 各種開放処理(サスペンド時に二重に解放しないように注意)
    CALLBACK_Cancel(&app->callback);
    if (app->web != NULL) {
        IWEB_Release(app->web);
    }
    COMMON_Free(&app->common);
    return TRUE;
}

トレードオフ

サスペンド/レジューム処理での、設計上の注意点が一つあります。

レジュームに備えて退避する情報量とサスペンドの処理時間はトレードオフの関係にあり、退避する情報が多ければサスペンド完了までにそれだけ時間がかかります。

サスペンドとレジュームの再現

エミュレータでは、デバイスの読み込みやアプレットディレクトリの変更ダイアログが出るとサスペンドします。この時、処理を実行するとアプリは終了しますが、キャンセルするとアプリはレジュームします。

携帯電話では、アプリ動作中に電話呼び出しするとサスペンドします。MIF ファイルの設定で、電源ボタンの押下で中断ダイアログを表示させたときもサスペンド状態になります。