Activity のライフサイクルと WebView

Pocket

アンドロイドのWebViewを使ってウェブアプリと同じような開発手法でアプリ作ることができれば楽だなあ、ということでそれを実現するための作業を進めているが、アプリの挙動がこちらの予想の斜め上を行くため、作業が遅々として進まない。昨日は、こちらのサイトを参考に(感謝)Activity のライフサイクルと格闘した。

WebView にローカルのHTMLを表示していて、下図のように検索なんぞをしているとする。この状態でホームキーを押したり、Backキーを押したり、タスクキラーでアプリを終了したりすると、次回起動したときに真っ白な画面が表示されたり、CSSやJavascriptが効いていない丸裸のHTMLが表示されたりする。

webview

前回書いたようにonCreateでrestoreState(savedInstanceState)をしているため、表示されていた内容を復元しようとして失敗しているようである。CSSやJavascriptが効いていない丸裸のHTMLが表示されるのはZoeyを使っているからだろう。jQuery Mobileなどもそうだが、単一のHTMLファイルを分割してページ遷移効果を実現しているようなライブラリを使うと、ヘッダ部分が読み込まれないタイミングがある。ヘッダではCSSやJavascriptを定義しているので、読み込まれないと20年前のホームページみたいな表示になってしまう。

真っ白な画面が表示されて、何もできなくなる現象についてはよく分からないのだが、Backボタンを押してから再度アプリを立ち上げると、前回の画面は表示されないものの再起動はちゃんとできるのでやはりrestoreに失敗しているのだろう。ならばどうするか。いくつか試してみたが、アクティビティにstatic変数のフラグを1つ持たせ(初期値は0)、onCreateの時にこのフラグが0ならsavedInstanceStateがあってもrestoreStateをしないようにした。

public class MainActivity extends Activity {
  private static int flg = 0;
  private WebView wv;
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    wv = (WebView)findViewById(R.id.wv);
    if(savedInstanceState != null && flg != 0){
     1.restoreState(savedInstanceState);
      return;
    }
    wv.loadUrl("file:///android_asset/test.html");
    wv.getSettings().setJavaScriptEnabled(true);
    flg++;
  }
(・・・略・・・)
}

つまり、最初にActivityがlaunchされる時にflgを0にしているので、savedInstanceState があって、flgも0というのはおかしい、だからsavedInstanceStateの復元はせずに新たにローカルのファイルを読み込むようにしているのである。これで少なくとも丸裸のHTMLや真っ白な画面が表示されることはなくなる。どうしても前回の表示を再現したいのであれば、Web Storageあたりを利用して画面の状態やら何やらを保存しておき、アプリの起動時に自前で再現すればなんとかなりそうである。

  1. WebView)findViewById(R.id.wv []

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください