Activity Groupのサブactivity応答backイベントの順序の問題

3757 ワード

昨日、Activity Groupでマルチactivityジャンプを実現したとき、ユーザーがbackキーを押してサブactivityからアプリケーションを直接終了し、activitygroupのonkeydownイベントに応答しなかったという問題が発見されました.実際には、各サブactivityでonkeydownイベントを上書きするポップアップ終了アプリケーションのプロンプトを表示することができるが、サブactivityでbackを押すと、メインactivitygroupのonkeydownイベントに応答せずに直接終了する理由を明らかにしたい.応答できるなら、メインactivityGroupに終了プロンプトボックスを書けばいいです.これでコードを節約できるのではないでしょうか.その後、サブactivityがlistviewであることが判明すると、中のデータが変化すると、まず自分のonkeydownイベントに応答し、サブactivityが非listviewである場合、メインactivityGroupのonkeydownイベントに直接応答することができる.(ここでは各サブactivityがonkeydownイベントを上書きしないことを前提とするがactivityGroupのみがこのイベントを実現する)後に資料実験を調べてlistviewにonkeydownイベントを上書きするがfalseに戻る.これにより、イベントをプライマリactivityGroupに伝達して応答することができる.要するにサブactivityでonkeydonwイベントを上書きするよりも論理的なコードが少ない.サブlistviewは次のように書くことができます.
 @Override
 public boolean onKeyDown(int keyCode, KeyEvent event) {
  if (keyCode == KeyEvent.KEYCODE_BACK) {
   return false;
  } else {
   return super.onKeyDown(keyCode, event);
  }
 }

プライマリacitivtyGroupは次のように書くことができます.
@Override
 public boolean onKeyDown(int keyCode, KeyEvent event) {
  if (keyCode == KeyEvent.KEYCODE_BACK) {
   quit();// , .
   return true;
  } else {
   return super.onKeyDown(keyCode, event);
  }
 }

以下は私が調べた資料で、とても役に立ちます.
キーボードイベントは、現在フォーカスを取得しているViewにのみ送信されます.このKeyEventは、最上位レベルのフォーカスウィンドウのactivityとviewでのみ取得できます.一般的にこれらのイベントは上から倒れて適切な受け入れコンポーネントを探し、ViewGroupのchildViewのonKeyDown()メソッドreturn trueは、このメソッドが今回のイベントを消費したことを示し、このときViewGroupのonKeyDown()メソッドには渡されず、onKeyDown()メソッドreturn falseであれば、このメソッドが完全に処理されていないことを示し、このイベントは依然として何らかの方法で伝達されて処理を待つ必要があることを示します.このときActivity GroupのonKeyDown()メソッドに渡す.でもKEYCODE_MENUはActivity Groupには渡されません.
1つのActivity Groupのキーボードイベント処理がキーを押すと、まずActivity Group dispatchKeyEvent(event.getAction()=KeyEventを実行する.ACTION_DOWN)を実行し、Activity Group onUserInteractionを実行し、最後にActivity Group onKeyDownを実行します.
キーを離すと、まずActivity Group dispatchKeyEvent(event.getAction()=KeyEventを実行します.ACTION_UP)そしてActivity Group onUserInteractionを実行最後にActivity Group onKeyDownを実行
childViewがlistViewである場合、リストを上下キーで選択する際のイベント実行フローがキーを押すとまずActivity Group dispatchKeyEvent(event.getAction()=KeyEvent.ACTION_DOWN)そしてActivity Group onUserInteractionを実行しchildActivity dispatchKeyEvent(event.getAction()=KeyEventを実行する.ACTION_DOWN)が実行するchildActivity onUserInteractionキーを離すと、まずActivity Group dispatchKeyEvent(event.getAction()=KeyEventが実行される.ACTION_UP)そしてActivity Group onUserInteractionを実行しchildActivity dispatchKeyEvent(event.getAction()=KeyEventを実行する.ACTION_UP)その後childActivity onUserInteractionを実行しchildActivity onKeyUpを実行最後にActivity Group onKeyUpを実行
childViewのlistViewにフォーカスしている場合、Menuキーを押したイベントは、まずActivity Group dispatchKeyEvent(event.getAction()=KeyEventを実行する.ACTION_DOWN)そしてActivity Group onUserInteractionを実行しchildActivity dispatchKeyEvent(event.getAction()=KeyEventを実行する.ACTION_DOWN)が実行するchildActivity onUserInteractionが実行され、最後にchildActivity onKeyDownのキー解除が実行されると、まずActivity Group dispatchKeyEvent(event.getAction()=KeyEventが実行する.ACTION_UP)そしてActivity Group onUserInteractionを実行しchildActivity dispatchKeyEvent(event.getAction()=KeyEventを実行する.ACTION_UP)その後childActivity onUserInteractionを実行しchildActivity onKeyUpを実行
childViewのlistViewにフォーカスしている場合、Backキーを押すイベントは、まずActivity Group dispatchKeyEvent(event.getAction()=KeyEventを実行する.ACTION_DOWN)そしてActivity Group onUserInteractionを実行しchildActivity dispatchKeyEvent(event.getAction()=KeyEventを実行する.ACTION_DOWN)その後childActivity onUserInteractionを実行しchildActivity onKeyDownを実行最後にActivity Group onKeyDownを実行
  Activity.dispatchKeyEvent-これにより、ウィンドウに配布する前にすべてのキーボードイベントをキャプチャできます.以上より、childViewのlistViewに焦点を当てると、Activity Group onKeyDownは実行されず、Activity Groupを実行するdispatchKeyEventがあるため、Activity GroupのdispatchKeyEventでchildActivityのMenuキーイベントをキャプチャすることができる