2010年2月7日日曜日

AdobeAIRで常駐アプリを作る

FriendFeed,Twitter,RSSのクライアントとして作成中の空うさぎですが、どこから皆さん見つけてきているのかが分からないのですが、新しいバージョンのダウンロード数が336件になりましたー。
有り難うございまっす。

んで、前から要望のあった常駐化対応をやっている最中です。

やりたい動きとしては
- メイン画面を閉じてもアプリは終了せず常駐する
- Windowsの場合はタスクトレイ、Macの場合はDocを表示し、アイコンをクリックしたらメイン画面を復帰

メイン画面を閉じてもアプリは終了せず常駐する

画面の×ボタンを押されたタイミングで画面のvisibleをfalseにすればよさそう。
mx:WindowedApplication の closingのタイミングで以下のコードを書く。

/* WindowをCloseするタイミングでの処理 */
public function onWindowClosing(e:Event):void {
visible = false;
e.preventDefault();
}

closingのタイミングであれば、処理をキャンセルすることができるので、e.preventDefault(); で画面終了処理をキャンセルしてます。

Windowsの場合はタスクトレイ、Macの場合はDocを表示し、アイコンをクリックしたらメイン画面を復帰


if (NativeApplication.supportsMenu) {
// Mac用のDocを作成する処理
} else {
// Windows用のタスクトレイを作成する処理
}

でまずは処理を切替。

/* DocIconの設定 */
private function setDockIcon(menu:NativeMenu):void {
var doc:DockIcon = NativeApplication.nativeApplication.icon as DockIcon;
doc.bitmaps = [new icon128x128()];
doc.menu = menu;
NativeApplication.nativeApplication.addEventListener(InvokeEvent.INVOKE, systemTrayIconClickHandler);
}

/* SystemTrayの設定 */
private function setSystemTrayIcon(menu:NativeMenu):void {
var tray:SystemTrayIcon = NativeApplication.nativeApplication.icon as SystemTrayIcon;
tray.bitmaps = [new icon32x32(), new icon16x16()];
tray.menu = menu;
tray.tooltip = applicationName;
tray.addEventListener(MouseEvent.CLICK, systemTrayIconClickHandler);
}

/* タスクトレイ、Docをクリックした時の処理 */
private function systemTrayIconClickHandler(event:Event) :void {
if (!mainWindow.visible || mainWindow.nativeWindow.displayState == NativeWindowDisplayState.MINIMIZED) {
if (!mainWindow.nativeWindow.visible) {
mainWindow.nativeWindow.visible = true;
}
mainWindow.nativeWindow.restore();
mainWindow.activate();
mainWindow.setFocus();
}
}

で、Docとシステムトレイを作成します。

クリックのタイミングを拾うには、Windowsではタスクトレイに対して addEventListener(MouseEvent.CLICK, handler); をすれば拾えるっぽいのですが、MacのDocは拾えないみたい。
Docの場合は、マウスをクリックすると、NativeApplication.nativeApplication.addEventListener(InvokeEvent.INVOKE, handler); が呼ばれるようなので、これで対応。

これで今の所、動いている感じ。。
• • •