AndroidでBackキー押したときにActivityが終了してアプリが切り替わる部分を調べた

ゴールデンウィークで暇だったので、AndroidでBackキーを押したときにActivityが終了してアプリが切り替わる部分を調べてみる。
仕事でこのあたりいじって独自処理を埋め込むことになりそうなので。

Androidのバージョンは5/2時点のAOSP master。まぁLollipopの間はがっつり変わる部分では無いでしょう。

スタート地点はActivity.javaのonkeyDown。
onKeyDownの中でonBackPressed呼んでますね。

onBackPressedもActivityで実装されています。
mFragmentsでBackStackが無ければfinishAfterTransitionですね。

ActivityTransitionStateは終了時のアニメーションですかね。
中は見ていないですが、アニメーションが無ければ即finishと言うところでしょうか。

finishは次のような感じ。
mParentは親となるActivityですね。ActivityGroupでActivityの中にActivityを埋め込んだ時のかな。
ActivityManagerServiceのfinishActivityを呼んでいますね。

ここからはSystemServiceのプロセスです。
ActivityManagerServiceのコード量は多いので、一部分だけ抜粋。
ActivityManagerService.finishActivityです。
finishTaskがtrueかつ終了するActivityがルートであれば、removeTaskByIdLockedでタスクを終了しています。
そうでなければ、ActivityStackのrequestFinishActivityLockedを呼んでいます。
同一タスク内でのActivity終了によるActivity切替は深く追いかけませんが、この後いろいろあってActivityStack.finishCurrentActivityLockedあたりで終了処理をしています。

removeTaskByIdLockedの中身です。
removeTaskActivitiesLockedはperformClearTaskAtIndexLocked(0)が呼ばれ、すべてのActivityがfinishされます。finishの処理はActivityStack.finishActivityLockedですね。この中身は後で見ています。

cleanUpRemovedTaskLockedの中身です。
killProcessは今回falseなので、プロセスをkillする前にreturnします。mRecentTasksは最近使ったアプリ一覧です。TaskRecord.removedFromRecentsはサムネイルの削除などの後始末をしています。

ActivityStack.finishActivityLockedの中身を見てみます。
長いので一部省略しています。
終了処理をしたり、キーのディスパッチを停止したりしていますね。
Activityがなくなった場合はendTaskがtrueになり、mWindowManager.prepareAppTransitionしてmWindowManager.setAppVisibilityでVisibilityをfalseにしています。

WindowManagerService.setAppVisibilityを見てみます。
長いので省略・・・。
wtokenはAppWindowTokenです。
wtoken.hiddenRequestedがtrueになり、WindowManagerServiceのmClosingAppsにwtokenがaddされています。
mClosingAppsに追加されたAppWindowTokenが実際に処理される場所はどこでしょう。
handleAppTransitionReadyLockedかな?

とりあえずアプリ切替はWindowManagerServiceのsetAppVisibilityをfalseとする事で実現されているようです。
このあたりをゴニョゴニョしたらホニャホニャできそうです。

なお、この調査はコードを追いかけただけで、実際にログを仕込んで確認したわけでは無いのであしからず・・・。

No Comments

Post a Comment

コメントを投稿するには、下の計算の答えを入力する必要があります。答えは半角数字で入力してください。 *