Android/other

Last-modified: 2010-10-21 (木) 14:48:21

外部ツール系

Processing for Android

 Processingというのは、グラフィック機能に特化した
 プログラミング言語およびIDE。
 
 2010年の4月11日の時点で「まだ不安定」とする情報もあり、
 比較的最近の技術のようだ。参考資料も少なめ。

DroidDraw

 AndroidのビューをWYSIWYGに設定可能な外部ソフト「DroidDraw」を発見
 http://code.google.com/p/droiddraw/downloads/list
  ※eclipseにも、簡易的なGUIエディタが付属するが、使い勝手が悪い

設定・コンフィグ関連

Google MapがターゲットがAndroid 1.1でなければエラーが出る場合の対処法

  ⇒GoogleのAPIを使用するための証明書の設定法が原因。
   Windowsでは、SDK1.1からSDK1.5になったときに、
   証明書のパスが変更になっている。(URLの中段を参照)
  http://www.android-group.jp/index.php?%CA%D9%B6%AF%B2%F1%2FGoogleMap2

 SDK1.1
  C:\Users\%USERNAME%\AppData\Local\Android\debug.keystore
 SDK1.5
  C:\Users\%USERNAME%\.android\debug.keystore

間違えると、パッケージのimportに失敗する。
古い文献でGoogle Mapでエラーができたら、こいつを疑え。

WebViewクラスのloadURLメソッドで、web page not availableが表示される 

 ⇒AndroidManifest.xmlに
  <uses-permission android:name="android.permission.INTERNET">
  </uses-permission>の追加が必要

実機転送・アプリ公開

実機へのアプリ転送およびアプリ配布方法について調査

  http://www.syuhari.jp/blog/archives/1585

<実機への転送方法>

  1. 実機を USB ケーブルで PC に接続する
  2. Eclipse からアプリケーションを実行する
  3. 実機が接続されているとここで実行する端末を選択する画面が出ます。
   実機を選択して「OK」をクリック

<アプリの配布方法>

  ☆一般ユーザーにAndroidアプリを配布するにはAndroidマーケットという
   Googleが提供するサービスを利用
  ☆Androidマーケットにアプリを公開するには、開発者の登録が必要
  ☆開発者の登録には25ドルが必要
  ☆登録はこちらからhttp://market.android.com/publish/signup

アニメーション系

Androidのアニメーション

 (移動・点滅・回転・スケール変更とそれらの組み合わせなど)

 http://www.adamrocker.com/blog/181/android_animation.html(プログラム)
 http://android.roof-balcony.com/resource/animation/(リソース)

Interpolator

 さらに、interpolator要素によりアニメーションの様子を変更することも可能

 <accelerateInterpolator>
  徐々に速くなる
 <decelerateInterpolator>
  徐々に遅くなる
 <accelerateDecelerateInterpolator>
  徐々に速くなり、徐々に遅くなる
 <overshootInterpolator>
  移動後目的地を少し通り過ぎたのち、目的地へ戻る
 <anticipateInterpolator>
  一度反対方向へ少し動いたのち、目的地へ移動する
 <anticipateOvershootInterpolator>
  一度反対方向へ少し動いたのち、目的地へ移動
  目的地を少し通り過ぎたのち、目的地へ戻る
 <bounceInterpolator>
  ボールが跳ねるように目的地でバウンドする
 <cycleInterpolator>
  繰り返し移動する
 <linearInterpolator>
  等速で移動する

 詳細はAndroidDevelopersにて
 
http://developer.android.com/intl/ja/guide/topics/resources/animation-resource.html

画面(アクティビティ)のスライド

  http://www.adamrocker.com/blog/289/activity_open_close_animation.html

 同ページにアニメーションは、
 HOMEメニューの[設定]-[サウンド&画面設定]-[アニメーション表示]を
 ONにしておかないと、このエフェクトは動作しませんとあるので注意。

通信系

Androidのソケット通信

 http://www.saturn.dti.ne.jp/~npaka/android/SocketEx/index.html

サーバーはスレッドを使え

 サーバーはスレッドを作成して、
 すぐに次のクライアントを待ち受けできる状態にする。
 スレッドを用いる。接続した相手はArrayListで保持しておくとよい。

試しに、サーバープログラムをPC側で動作し、Androidのシミュレータから

 クライアントプログラムで接続したところ、おかしな挙動を発見

 Android側でアプリをホームボタンやバックボタンなどで終了させても、
 サーバー側には接続状態が残ってしまう状態が確認された。
 ⇒実際には、アプリが終了していないため(後述)。
  これをやると、すぐにサーバー側のソケットを圧迫してしまう。

状態遷移関連

Androidのボタン操作による状態遷移時に呼ばれるメソッド

 http://www.atmarkit.co.jp/fjava/rensai4/android02/android02_2.html

 また、このサイトのonLowMemory()に関する説明から、
 Androidは、iPhoneと違い、ガベージコレクションが実行されることがわかる。
 (Javaにはreleaseに相当するものがないのだから当然か)

Androidのアプリ終了法

 android アプリは、画面が破棄されてユーザーには終了されたように見えても、
 実は裏側ではプロセスがまだ動いており、タスク管理系のアプリを
 使用しなければプロセスを終了する事はできない。
 
 今のところ、実機から終了させる方法はなく
 タスクマネージャ的なアプリをインストールすることで、
 タスクを終了させるしかないようだ。
 
 また、待ち受けでホームボタン長押しで現れるマルチタスクっぽい画面は単なる最近使ったアプリの履歴とのこと。
 つまりAndroidでは手動でアプリの終了ができず、開けば開くほどアプリが 溜まっていく。
 ただしバックグラウンド上のアプリは自動でスリープされるので、
 体感上、処理を重く感じることはないというところのようだ。
 http://d.hatena.ne.jp/itokoichi/20090713/p11
 
 メモリが足りなくなるとバックグラウンドのアプリを自動終了する仕組みになっている様子。
 http://ameblo.jp/makotok1/entry-10632699537.html

アプリがバックグラウンドで動作することによる弊害の例

 アプリ起動時に日付、時間を取得して、それに合わせたイベントを
 発生させようとしたとき、以前起動した状態が残っていると、
 その取得をさせるときにワンクッションが必要となってくる。
 (たとえばプレイヤーがリフレッシュボタンを押す、など)

アプリケーション上で起動しているActivityをすべて終了する方法

 ActivityMangerがうまくやってくれるとのこと。

 ActivityManager activityManager = (ActivityManager)
 getSystemService(Context.ACTIVITY_SERVICE);
 activityManager.restartPackage(getPackageName());

 http://www.bpsinc.jp/blog/archives/1707

 しかし、上記ソースを呼んでみたが、強制終了が発生した。
 (アプリは終了するが、実行エラーのようなダイアログが表示される)
 原因調査中

終了の際にプロセスも同時に終了させるコード

 System.exit(RESULT_OK);

 http://jp-shibax.air-nifty.com/blog/2010/05/android-e2dd.html

 上記コマンドを入れたところ、確かに終了することを確認した。

 ただ、どのタイミングでこれを呼ぶのか、が難しい
 (onDestroy だと、画面の縦横切り替え時にも呼ばれてしまう)

 Portrait (縦) 表示のみのアプリだとonDestroyへの記述で
 System.exit(...) が通常通り使えるが。。。

各種イベントの動作タイミング

 イベントごとに呼ばれるメソッドについて、シミュレータで実験したところ、
 以下のタイミングで動作することがわかった。

 ・戻るボタンで終了させたとき ⇒onPause, onStop
 ・ホームボタンで終了させたとき⇒onSaveInstanceState, onPause, onStop
 ・回転させたとき       ⇒onSaveInstanceState, onPause, onStop,
                 onStart, onRestoreInstanceState, onResume

 
 回転させたときは、「再度アプリが初めから始まる」という感じである
 (たとえば、ソケットで接続するアプリで実機を回転させると、
  ソケットをクローズしなかった場合、サーバーには、同じソケットにたくさんの接続要求が来てしまう)

以上を考慮すると、ソケットプログラミングでは、

 onPauseか、onStopにソケットのクローズ処理を記述しておくのが
 良いと考えられる(裏は取れていないが・・・)

回転対応

Androidアプリ 縦・横回転に対応する方法

 http://androside.com/page_contents/page_android_screenRotation.html

Handler・タイマ

Androidで一定の間隔をおいて定期的に処理を実行する方法

 1.Handler#postDelayed()を使う方法
 2.Handler#sendMessageDelayed()を使う方法
 3.Threadを使う方法
 http://magpad.jugem.jp/?eid=108

AndroidのHandlerとは何か

  http://www.adamrocker.com/blog/261/what-is-the-handler-in-android.html

 Androidはシングル・スレッド モデルを採用しているため、
 単純にマルチスレッドにしてUIの操作をしてしまうと、
 CalledFromWrongThreadExceptionでアプリがダウンしてしまう

 これを回避する仕組みがHandler。

 たとえば、以下のような処理は実行エラーになってしまう。

 public void onClick(View v) {
  new Thread(new Runnable() { //新規スレッドを作成
  public void run() {
  Bitmap b = loadImageFromNetwork(); //ネットワーク上から画像をダウンロード
  mImageView.setImageBitmap(b); //画像をImageViewに設定
(CalledFromWrongThreadException)
  }
 }).start();
 }

 具体的なHandlerの使用方法は明日、調査予定