WebChromeClient.onProgressChanged

onProgressChangedは、ロードの進捗の変化があった時に発生するハンドラ・・・。

WebChromeClient | Android Developers

今回はプログレスバーで進捗を表示する・・・。

activity_main.xmlに、

ProgressBarを追加・・・。

CustomWebViewClient.javaで、

コンストラクタで、progressBarを取得して、最大値100、進捗を0、非表示の状態に・・・。

ロード開始で進捗を0にセットして表示・・・。

完了したら100で非表示に・・・。

CustomWebChromeClient.javaでは、

こっちでも取得しておいて、

onProgressChangedに来るたびにnewProgressをprogressBar.setProgressでプログレスバーにセットする・・・。

f:id:BG1:20170301112500p:plain

ロードしてないとこうだが、

f:id:BG1:20170301112517p:plain

ロード中はプログレスバーが進んでいく・・・。

Sample/android/WebChromeClient/onProgressChanged/src/WebChromeClient at master · bg1bgst333/Sample · GitHub

WebViewClient.onPageFinished

onPageFinishedは、ページのロードが終了した時のハンドラ・・・。

WebViewClient | Android Developers

これまで、TextViewのprogressTextViewで進捗を表示していたが、ロードしていない時は非表示、ロードを開始してからは表示状態にして、ロードが完了したらまた非表示になるようにする・・・。

CustomWebViewClient.javaで、

CustomWebViewClientからもprogressTextViewを使えるように・・・。

progressTextView.setVisibilityで最初はINVISIBLE(非表示)に・・・。

onPageStartedに来たら、VISIBLE(表示)に切り替える・・・。

onPageFinishedに来たら、INVISIBLE(非表示)に戻す・・・。

f:id:BG1:20170228180439p:plain

ロードしてない時は非表示・・・。

f:id:BG1:20170228180456p:plain

ロード中は進捗が表示される・・・。

f:id:BG1:20170228180514p:plain

終わると、また消える・・・。

Sample/android/WebViewClient/onPageFinished/src/WebViewClient at master · bg1bgst333/Sample · GitHub

WebViewClient.onPageStarted

onPageStartedは、ページのロードが開始された時のハンドラ・・・。

WebViewClient | Android Developers

shouldOverrideUrlLoadingだと、バックキーで戻って来た時に呼ばれないことがあるので、こちらでURLの更新をする・・・。

CustomWebViewClient.javaで、

shouldOverrideUrlLoadingにあったurlBar.setTextをonPageStartedに移動・・・。

f:id:BG1:20170228152446p:plain

Yahoo!トップ・・・。

f:id:BG1:20170228152509p:plain

スポナビトップ・・・。

f:id:BG1:20170228152526p:plain

野球・・・。
ここでバックキーを押すと、

f:id:BG1:20170228152552p:plain

URLもスポナビトップに変わっている・・・。
さらに戻ると・・・。

f:id:BG1:20170228152609p:plain

ページもURLもYahoo!トップに戻った・・・。

Sample/android/WebViewClient/onPageStarted/src/WebViewClient at master · bg1bgst333/Sample · GitHub

Activity.onBackPressed

バックキーでもgoBackで戻れるようにしたいが、そのためにはバックキーが押された時の動作を変えないといけない・・・。

Activity | Android Developers

onBackPressedをオーバーライドして、バックキーの動作を変える・・・。

MainActivity.javaで、

canGoBackがtrueならgoBack、falseなら既定の動作super.onBackPressedに任せる・・・。
(この場合の既定の動作はアクティビティを閉じる・・・。)
こうすることで、2ページ目以上なら戻るし、1ページ目ならアクティビティを閉じる・・・。

ついでに、

メニューもcanGoBackでfalseなら閉じるようにした・・・。

f:id:BG1:20170228132836p:plain

Yahoo!トップ・・・。

f:id:BG1:20170228132905p:plain

スポナビトップ・・・。

f:id:BG1:20170228132930p:plain

野球・・・。
そこからバックキーを押すと、

f:id:BG1:20170228132957p:plain

スポナビトップ・・・。
さらにバックして、

f:id:BG1:20170228133025p:plain

Yahoo!トップ・・・。
ここでバックすると、

f:id:BG1:20170228133124p:plain

onBackPressed既定の動作により、アクティビティを閉じる・・・。

Sample/android/Activity/onBackPressed/src/Activity at master · bg1bgst333/Sample · GitHub

WebView.canGoBack

canGoBackは、goBackで前のページに戻れるかどうかをチェックする・・・。

WebView | Android Developers

当然、1つ目のページからさらに前に戻ることはできないので、トーストで"戻れません!"と表示してみる・・・。

MainActivity.javaで、

webView.canGoBackがtrueなら、webView.goBackで戻る・・・。
falseなら、Toastで"戻れません!"と表示・・・。

f:id:BG1:20170228120616p:plain

Yahoo!トップから、

f:id:BG1:20170228120632p:plain

スポナビトップ・・・。

f:id:BG1:20170228120824p:plain

GoBackすると、

f:id:BG1:20170228120844p:plain

Yahoo!トップに戻るが、

f:id:BG1:20170228120908p:plain

ここでGoBackを押しても、

f:id:BG1:20170228120924p:plain

"戻れません!"

Sample/android/WebView/canGoBack/src/WebView at master · bg1bgst333/Sample · GitHub

WebView.goBack

goBackで一つ前のページに戻ることができる・・・。

WebView | Android Developers

resの下にmenuフォルダつくって、その下にmain.xmlを用意し、

今回はメニューにgoBackのアイテムを追加・・・。

strings.xmlは、

"GoBack"と表示されるアイテム・・・。

MainActivity.javaで、

メニューの準備・・・。
R.id.menu_gobackだったら、webView.goBackで戻る・・・。

f:id:BG1:20170228105130p:plain

Yahoo!トップから、

f:id:BG1:20170228105153p:plain

スポナビトップ、

f:id:BG1:20170228105213p:plain

野球・・・。
ここで、

f:id:BG1:20170228105233p:plain

メニューのGoBackを押すと、

f:id:BG1:20170228105255p:plain

スポナビトップに戻るので、

f:id:BG1:20170228105411p:plain

もう一回押すと、

f:id:BG1:20170228105523p:plain

トップに戻る・・・。
ただし、URLバーは変わらない・・・。
shouldOverrideUrlLoadingには来ないようだ・・・。

Sample/android/WebView/goBack/src/WebView at master · bg1bgst333/Sample · GitHub

pipe

pipeは、プロセス間通信に使う名前なしパイプを生成するシステムコール・・・。

Man page of PIPE

引数には要素数2のint型配列を渡す・・・。0番目が読み込み用、1番目が書き込み用に使われる・・・。
主に、親プロセスと子プロセスの間でのプロセス間通信に使う・・・。
今回は、親プロセスも子プロセスも読み書き両方するので、これをさらに2つ用意する・・・。

pipe.cで、

pipe1は親が書き込むパイプ(子は読み込む)、pipe2は子が書き込むパイプ(親は読み込む)・・・。

fork前に自分のプロセスIDを取得・・・。

pipeでpipe1とpipe2を作成・・・。

forkします・・・。
失敗した場合はすべてのパイプを閉じて終了・・・。

forkした後の、親の処理・・・。
親子のプロセスIDを出力したら、3秒後にpipe1[1]に書き込み・・・。
"parent written!~"という感じで、~を書き込んだことを出力・・・。
で9秒待つ・・・。
その後、pipe2[0]を読み込む・・・。
"parent read!~"の後に、子が書き込んだ文字列が入っているはず・・・。
読み込んだ文字列を出力したら、子が終るまでwaitで待つ・・・。
で子のプロセスID、親のプロセスIDを出力・・・。

子はプロセスIDを出力したら、6秒後にpipe1[0]を読み込む・・・。
"child read!~"で、親からの書き込み文字列が見える・・・。
その3秒後にpipe2[1]に書き込んで、
"child written!~"で書き込んだ文字列を見せる・・・。
で5秒待って子は終了・・・。

実行すると、

$ gcc pipe.c -o pipe
$ ./pipe
pid = 14378
I am parent!, getpid = 14378, child = 14379
I am child!, getpid = 14379

最初はこうで、3秒後に、

parent written!, I am parent! Are you child?

また3秒後に、

child read!, I am parent! Are you child?

また3秒後に、

child written!, I am child! Are you parent?

また3秒後に、

parent read!, I am child! Are you parent?

で最後は、

14379 finished!
getpid() = 14378
$

こんな感じ・・・。
親が書き込んだ文字列が子供側で読めているし、子が書いた文字列も親が読めてるので、プロセス間通信になってる・・・。

Sample/unixsyscall/pipe/pipe/src/pipe at master · bg1bgst333/Sample · GitHub