Android の cookie 管理と CookieManager と flush()
Android アプリケーションで cookie を管理する際、デフォルトの動作はアプリとは非同期で揮発性のメモリに展開された値を最大数分(?)程度の遅れで不揮発な領域に書き込みに行くようです。
この辺り、過去のバージョンの情報などが錯綜していて分かりにくかったのですが、実装自体は記事執筆現在でも変化していない様子。
何がまずいのか
普通にアプリケーションを動作させている分には
CookieManager cookieManager = CookieManager.getInstance(); cookieManager.setCookie(url, val);
などで揮発性メモリの値は書き換えられているのですが、例えば WebView からのログインを cookie で制御している場合。
session[:user_id] = user.id
のような処理は実際には cookie に {user_id: 1} のような値を書き込むわけですが、それが不揮発性メモリと同期される前にアプリケーションを即時に終了させると、次回実行時に(cookie の expire が実行時より後に設定されていようと)不揮発性メモリに残った値を参照してアプリの状態を復元するため、今行ったログイン処理がなかったことにされてしまう可能性が存在する、ということです。
どうすればいいのか
CookieManager には flush() というメソッドが用意されているので、これを用います。
CookieManager cookieManager = CookieManager.getInstance(); cookieManager.setCookie(url, val); cookieManager.flush();
この書き込み処理自体にもコストはかかるため、なるべく必要な箇所のみ flush() を用いるように制御するべきとは思いますが、これでアプリケーションを強制終了した場合でも実際の操作の範囲では問題なくなったはずです。