ANEを使って常駐アプリを作る考察(AIR for Android)

By | 2012年7月31日

7/28のF-siteセミナー「Flash Professional CS6がやって来た ヤア!ヤア!ヤア!」に行ってきました。
一番のお目当てはデモ3の「Adobe AIRからネイティブの機能を使ってみよう(ANE入門)」で、Androidのアプリ開発するならAIR8割、ネイティブ2割な現状の自分には旬なネタでした。
ANEを使うと、バイブレーションや通知、端末標準のダイアログといった、その時起こる動作の実装はちょっと頑張れば実現できますが(コミケにこれを持っていこうで実装済み)、常駐系の機能を実装するのはさてどうしたものか、という状態だったので、アラームアプリを作ることを考えてみました。
※現時点で答えが出ていないので、これをもとに実験する必要があります。

●AIR開発アプリのライフサイクルの確認
Event.ACTIVE またはEvent.DEACTIVATE でアプリケーションがアクティブになった、アクティブでなくなった、が取れます。アクティブでなくなった際、何もしなければ見えないところで処理が走り続けますので、フレームレートを落としたり、描画を止めたりし、再びアクティブになった際にそれらを戻す処理を入れます。

●ANEで実装したいこと
このままでも見えない所で動いているので常駐と言えなくもないですが、非アクティブ時にアラームが鳴ってもアプリが自動起動してくれるわけではないので少し不便です。ネイティブで作られたアラームアプリでもアラーム設定後に非アクティブにすると正常に起動しなかったり、それを避けるために「この画面のままにしておいて下さい」というような文言があったりします。
これは何とかしたいところです。アラームが鳴った時にアクティブになる機能をANEで実装することになりそうです。

●アプリをアクティブにするには
※ここから先はネイティブ開発ができる人や、ANE開発の知識がある人に教えてもらった方がいいです。
色々省略しますが、Javaを使用したネイティブ開発では、アプリをアクティブにするには Intent と startActivity() を使います。

Intent intent = new Intent();
intent.setClassName(起動もとアプリ, アクティブにしたいアプリ);
//例、コミケにこれを持っていこう
//intent.setClassName("air.com.cda244.CClist", "air.com.cda244.CClist.AppEntry");
startActivity(intent);

「起動もとアプリ」は自分自身のパッケージ名、「アクティブにしたいアプリ」には、パッケージ名/AppEntry を指定します。
パッケージ名は設定を確認すれば分かりますが、google play上のURL中のid部分に相当します。AppEntry というのはAIRで開発したアプリには共通で指定される様です。

これをANE側で実行することで、アクティブにすることができますが、色々と省略しているので、本来はアクティブにする際の条件や、ディスプレイがオフだったら、電話中だったら、等々追加すべき処理があります。

●アプリを正しく常駐させるには
何も問題が起きなければ、アクティブにすることができれば一応常駐させることはできます。が、このままではメモリが不足する等の場合にOSがアプリを終了させることがあるので、非アクティブ時に何らかの処理をしておいた方が安全です。
常駐アプリを実現する際に使用するのが Service というもので、これを使用すると、OSがメモリ確保の際に行うkillの候補から外すことができます。
非アクティブ時に Service を開始し、アクティブになった時に停止させるようにすると、気がついたら切られていた、ということを防ぐ事ができます。
また、常駐していることを分かりやすくするために、Notification を使用しても良いと思います。

●おわり
これまで実験した所だと、FREFunction拡張クラス内で、例の様に自分をアクティブにしようとするとホームアプリが落ちて戻るボタンが効かなくなったり(getActivity().getApplicationActivity().startActiviti()にしたら落ちなくなりました)、Notification 実装が不十分だったりと詰め切れていないのですが、それっぽいのは実現出来そうな気がしています。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です