Flex で構築したモバイルアプリケーションでは、ユーザーによってモバイルデバイスのハードウェアキーが押されたことを検出できます。例えば、Android デバイスで、ホームボタン、戻るボタンまたはメニューボタンが押されたことを検出できます。
ハードウェアキーが押されたことを検出するには、KEY_UP または KEY_DOWN イベントのイベントハンドラーを作成します。通常、イベントハンドラーは、Application、ViewNavigatorApplication または TabbedViewNavigatorApplication コンテナで定義されているアプリケーションオブジェクトに追加します。
Stage オブジェクトでは、アプリケーションの描画領域を定義します。各アプリケーションには、Stage オブジェクトが 1 つあります。したがって、アプリケーションコンテナは、実際には Stage オブジェクトの子コンテナになります。
Stage.focus プロパティは、現在キーボードフォーカスが設定されているコンポーネントを示します。どのコンポーネントにもフォーカスが設定されていない場合は null になります。キーボードフォーカスが設定されているコンポーネントとは、ユーザーがキーボードを操作したときに、イベントの通知を受け取るコンポーネントです。そのため、Stage.focus がアプリケーションオブジェクトに設定されている場合は、アプリケーションオブジェクトのイベントハンドラーが呼び出されます。
モバイルデバイスでは、別のアプリケーションによってアプリケーションが中断されることがあります。例えば、モバイルデバイスでアプリケーションを実行しているときに電話がかかってきたり、ユーザーによって別のアプリケーションに切り替えられたりすることがあります。ユーザーがアプリケーションの切り替えを戻したときには、Stage.focus プロパティに null が設定されます。そのため、アプリケーションオブジェクトに割り当てられたイベントハンドラーは、キーボードに反応しません。
モバイルアプリケーションでは Stage.focus プロパティが null になる可能性があるので、Stage オブジェクト自体でキーボードイベントをリスニングして、必ずアプリケーションでイベントが認識されるようにしてください。次の例は、キーボードイベントハンドラーを Stage オブジェクトに割り当てています。
<?xml version="1.0" encoding="utf-8"?>
<!-- containers\mobile\SparkHWEventHandler.mxml -->
<s:ViewNavigatorApplication xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
firstView="views.SparkHWEventhandlerHomeView"
applicationComplete="appCompleteHandler(event);">
<fx:Script>
<![CDATA[
import mx.events.FlexEvent;
// Add the hardware key event handlers to the stage.
protected function appCompleteHandler(event:FlexEvent):void {
stage.addEventListener("keyDown", handleButtons, false,1);
stage.addEventListener("keyUp", handleButtons, false, 1);
}
// Event handler to handle hardware keyboard keys.
protected function handleButtons(event:KeyboardEvent):void
{
if (event.keyCode == Keyboard.HOME) {
// Handle Home button.
}
else if (event.keyCode == Keyboard.BACK) {
// Hanlde back button.
}
}
]]>
</fx:Script>
</s:ViewNavigatorApplication>