2011年10月9日日曜日

・ ウィジェットの情報更新。

ウィジェットの情報をJava側から書き換える方法。

RemoteViewsクラスとAppWidgetManagerクラスを使います。
実際に更新するのがAppWidgetManagerクラスの

updateWidgetApp()です。
が、残念なことに、こいつは本当に更新するだけのクラスです。
何を、どうする、という情報を直接書き換えることができません。

そのパイプとして存在するのが、RemoteViewsクラスです。
使い方を紹介します。


  RemoteViews remoteViews = new RemoteViews(getPackageName(), R.layout.appwidget);
   
インスタンス生成はこのように行います。
どのパッケージ内にある、どのレイアウトを変更するか
というものを指定します。
どのレイアウト、というのはリソースのレイアウトフォルダ内にある
xmlの名前を示します。

RemoteViewsはたいがいの物なら更新できます。
    
    remoteViews.setImageViewResource(R.id.ImageView01, R.drawable.img_01);
      
みたいな。
これは、xmlにImageViewがあると想定したパターンです。
そのViewにid[ImageView01]をセットします。
RemoteViewsではそのIDを取得することによって、値の変更が可能となります。
上の例はImageの変更ですが


他にもこんなにいろいろあります。
RemoteViewsで変更したいところを、いろいろセットし終えたら


        ComponentName thisWidget = new ComponentName(context, widget.class);
        appWidgetManager.updateAppWidget(thisWidget, remoteViews);

みたいな感じで終わりです。
ComponentNameクラスは、Androidがこいつはどんなコンポーネントなんだ??
と判断するために用意されてるクラスらしいです。
コンポーネントって??

Activity, Service, BroadcastReceiverなどなど・・・。
まぁ、種類の判断なんでしょうね。
どこまで細かく見るのかはわかりませんが。





2011年9月24日土曜日

・ Junitとお自動さん?

ネットで面白そうなツールが転がってたので
使ってみることに。
それが何かと言いますと、「おじどうくん(http://park.ruru.ne.jp/ando/work/autoUt/index_ja.html)」
単体テスト項目の自動生成ツールらしいです。
落としてみるとperlで書かれてました。
でもperlなんか使ったことないから、とりあえず使い方がわからない!!

と思ってはいたけど、まずはPerlをインストール。
http://www.activestate.com/downloads

インストールが完了したら、コマンドプロンプトで
『perl -v』って打ったらなんかでます。
















インストールができたら、動くかどうかをテストするために
対象となるプログラムを作りました。
SuperHelloWorld!
数を入力するとHelloWorldがその数だけくっついて出力されるというもの。


HelloWorld.java


package hoge;

public class HelloWorld {

    public String getSuperHelloWorld(int times) {

        String word = "HelloWorld ";
        StringBuffer resultWord = new StringBuffer();

        for(int i = 0; i < times; i++) {

            resultWord.append(word);
        }

        return resultWord.toString();
    }
}


んで、コマンドプロンプトから落としてきたファイルを実行してみる。

『perl ut4.pl HelloWorkd.java』
じゃあ、cannot get active execel! 
と言うエラーが。
じゃあExcel出したるやんけー、って思ってExcelを起動した状態でやったら















こんなんできました!
まぁ、この程度のプログラムなら十分でしょう。
網羅率を見るには条件文の中に入るかどうかを見るだけで十分ですもんね。

じゃあ、次はテストをしてみよう。
今回利用することにしたのはEclipseに入ってるJUnit。
単体試験ツールです。

対象となるプログラムを右クリックして、新規のJUnitテストケースを選択。
んでこんな感じ。
































じゃあこんなんができたはず。


package hoge;

import org.junit.Test;

import junit.framework.TestCase;

public class HelloWorldTest extends TestCase {

    @Test
    public void testGetSupereHlloWorkd() {
        fail("まだ実装されていません");
    }
}

ここのTestをオーバーライドしてるメソッドにテストケースを追加します。
与える値と、その期待値です。
今回は5を与えて、HelloWorldが5回出力されるのを期待値とします。

package hoge;


import org.junit.Test;

import junit.framework.TestCase;

public class HelloWorldTest extends TestCase {

    @Test
    public void testGetSupereHlloWorkd() {

        HelloWorld hello = new HelloWorld();
        int arg1 = 5;
        String result = "HelloWorld HelloWorld HelloWorld HelloWorld HelloWorld ";
        String wrongResult = "Hello!!!!";

        assertEquals(result, hello.getSuperHelloWorld(arg1));
        assertEquals(wrongResult, hello.getSuperHelloWorld(arg1));
    }
}

こんな感じ。
assertEquals()は見ての通り、期待値と結果の比較です。
今回はわざと誤った解答がでるのも作りました。

実行したらこんな感じ。




















左側に失敗があればちゃんと出てくれます。
画像ミスったな。
一応行数とか出てくれてて、19行目がおかしいって言ってくれます。


と言うテストツール。


この比較メソッドは他に


assertTrue()

assertFalse()

assertNotNull()

assertNull()

assertSame(Object1, Object2)

assertNotSame(Object1, Object2)

assertNotSame(String, Object1, Object2)

fail(String)

なんかがあるみたいです。
以上!

2011年9月20日火曜日

・ adbコマンド

最近利用してるADBのコマンドをちょっとメモ。

の前にちょっと説明。

ADB(Android Debug Bridge)
一言で言うならAndroidのデバッグツールです。
その集合体っていうかね??
その機能の殆どがコマンドから実行できるので
そのまとめです。


そ ばかっりやな…。


==========================


adb start-server 起動
adb kill-server   終了
adb devices    接続されてるデバイス(端末)一覧表示
adb logcat     LogCatの表示、通常はパイプとか繋げて使うみたい
adb shell      シェルにログイン
adb install <アプリ名> アプリのインストール
adb uninstall <アプリ名> アプリのアンインストール
adb puch <転送したいファイル> <端末の転送先> ファイルを端末に転送
adb pull   <取得したいファイル> <転送先>     ファイルを端末から取得
adb shell input keyevent <キーイベント>  キーイベントを与える
adb shell input text <文字列>                 文字列を与える

adb shell am start -a <Action>  アクションを与える

最後のんはなかなか便利で、インテントを送信することもできます。

電話かける
adb shell am start -a android.intent.action.CALL tel:xxx-xxxx-xxxx


設定開く
adb shell am start -a android.settings.SETTINGS


メール
adb.exe shell am start -a android.intent.action.SENDTO -d "メールアドレス"
--es android.intent.extra.SUBJECT "タイトル"
--es android.intent.extra.TEXT "メッセージ"



ブロードキャストインテント
adb shell  am broadcast -a android.intent.action.BATTERY_LOW





2011年9月12日月曜日

・ 日本Androidの会 堺支部 勉強会

9月9日の金曜日に堺で勉強会がありました。
今回はコーディングっていうか技術系の話は
殆どなしで、クラウドに関してのお話でした。

「データセンタが構築するクラウドプラットホーム」
世の中クラウド化が進んでます。

これは、TCO削減やグリーンITにも繋がり、これからは
まさにこの時代が来ることでしょう。


そもそもクラウドとは

http://ja.wikipedia.org/wiki/%E3%82%AF%E3%83%A9%E3%82%A6%E3%83%89%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0

wikiに任せてしまったw
要は、必要なソフトウェアは全てネットワークを通じた
サーバー上にあって、端末はネットワークさえ繋がっていれば
どこからでも、いつでもそのソフトウェア(アプリケーション)を実行できる
というものです。
これは、いつでもどこでもだれでもと言うユビキタスの時代はこの技術によって
やってくるんだろーなーと思います。

ネットワークで繋がったサーバーにはサービスで分類して、
・SaaS(アプリケーション)
・PaaS(MW、OS)
・IaaS (ハードウェア、ファシリティ)
があります。
アプリケーションは一般的に言われているクラウドです。
PaaSは例えば、自分のPCにWindowsしか入ってないとして、
そのPCでLinuxを立ち上げたい・・・となった時に、そのPCに
Linuxをインストールするのももちろんありですが、他のサーバーに
LinuxOSをインストールしておけば、自分のPCから仮想化と言う技術を
用いてLinuxを起動させることができます。
自分のPCにLinuxはインストールされてないわけですから、これはクラウドです。

IaaSの面では最近オンラインストレージとかってよくありますよね。
WEBを経由してデータをサーバーに保存する・・・ってなやつです。
もっといえばGmailとかもそうですよね。
メールのデータは自分のPCにはありません。
これもクラウドです。

もうひとつ、プラットフォームで分類してみると、
グリッド技術を用いたクラウドと仮想化技術を用いたクラウドがあります。
前者はしょぼーいコンピュータサーバを大量にくっつけて
一つのスーパーコンピュータみたいにする技術です。
後者のものは1台のハイスペックなコンピュータをバラバラの
バーチャルサーバーに分けて利用する方法です。
従来のものと同様に扱えます。

と言うクラウドの紹介でしたw

最後にメリットを。
・所有から利用へ。
必要な時にだけりようできる。
・即効性
新規サーバを数分で構築できる。
・旧OSの延命
サポートが終了したようなOSも最新のハードで動かせる。
・高可用性
物理マシンが故障してもダウンしない。

などなど。
もっと調べればいろいろわかるんやろーな。

↓以下は堺支部のHP。

https://sites.google.com/site/jposakasakai/

2011年9月7日水曜日

・ BroadcastIntent

Activity間でデータの受け渡しをしたり、
Activityの遷移先を指定したりする仕組みを
『Intent』と言いますが、そのIntentにも種類があります。

そのひとつがBroadcastIntent。
でも、全然理解できてないので、今日は探してきた情報のメモ。


ステム全体に影響を与える様な事項についてはそれらの情報を必要とするシステムにあるアプリケーション全てに対して通知が必要がある。それの実装手段がブロードキャストのintentとなる。逆に言えばブロードキャスト的なintentを受け取ることを宣言することによって、システムの監視ができることになる。


ContextクラスのregisterReceiverメソッドでBroadCastReceiverインターフェースを継承したハンドラと受け取るアクション等を定義したIntentFilterクラスのインスタンスを登録する。そしてブロードキャスト的なintentが発生するとハンドラのonReceive関数が起動される。


http://www.xn--rhq6sw9f0w7aevaf9ak89m.jp/android/androidLecture/Intent2/Intent2.html


Context.broadcastIntent()を使うことによって、そのアプリケーション独自のインテントを他のインテントレシーバーにブロードキャストすることもできます。


http://www29.atwiki.jp/android/?cmd=word&word=broadcastIntent%20startActivity&type=normal&page=%E3%83%89%E3%82%AD%E3%83%A5%E3%83%A1%E3%83%B3%E3%83%88%2FAndroid%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E8%A7%A3%E4%BD%93%E6%96%B0%E6%9B%B8




private IntentReceiver mDataReceiver = new IntentReceiver(){
       @Override public void onReceiveIntent(Context context, Intent intent){
           Log.d("hogeRecv","onReceiveIntent: "+intent);
       }
   };
   private void registerDataReceiver(){
       String action = "hogefuga";
       IntentFilter filter = new IntentFilter(action);
       Log.d("hogeRecv","filter="+filter);
       this.registerReceiver(mDataReceiver,filter);
   }
   private void unregisterDataReceiver(){
       unregisterReceiver(mDataReceiver);
   }



Intent iMessage = new Intent(action);
   iMessage.putExtra("message","loop="+loop);
   Log.d("hogeSend",iMessage.toString());
   broadcastIntent(iMessage);

http://www29.atwiki.jp/android/pages/35.html




これが生成??(送信)

      Intent broadcastIntent = new Intent();
      broadcastIntent.putExtra(
        "message", "Hello, BroadCast!");
      broadcastIntent.setAction("MY_ACTION");
      getBaseContext().sendBroadcast(broadcastIntent);

受信。
receiver = new MyBroadcastReceiver();
      intentFilter = new IntentFilter();
      intentFilter.addAction("MY_ACTION");
      registerReceiver(receiver, intentFilter);

 PendingIntentは基本的に、IntentとstartActivity()broadcastIntent()などのターゲットアクションを組み合わせたラッパーオブジェクトです。

http://marulec.cloud-market.jp/archive/2007/20080314/20080314_4.pdf

2011年9月4日日曜日

・ 非同期処理②

前回の続き・・・やけどその前に訂正。

スレッドはAndroidの仕組みや!!
みたいに書きましたが、全然Javaそのものの機能です。
今日はさらにそのスレッドからUIをいじるお話です。

前回、UIスレッド以外でUIをいじる事が出来ないといいました。
これは、シングルスレッドモデルを採用しているAndroidにとって、
UIはUIスレッドが持っているものであり、それ以外のスレッドから
操作される事は、そのモデルに反しているからです。

それを解決する方法のひとつにHandlerという物があります。
これが何かというと、疑似マルチスレッドモデルを生成するもので、
具体的に何をしているかと言うと、UIスレッドのキューに別スレッドで
実行しようとしている処理を追加しています。
要するに、処理をメインのお尻にくっつけちゃうんですね。

や、全然要するにになってないか。


実装は

Handler handle = new Handler(); 

public void OnClick(View v) { 
    new Thread(new Runnable() { 
        public void run() { 
            handle.post(new Runnable() { 
                public void run() { 
                    /* 処理を書く */ 
                }  
            }); 
        }); 

ハンドラクラスを生成して、それをメソッド内に実装する。
handle.post()で実際に処理を投げます。
注意点はHandlerの生成位置で、もしもメソッド内部で生成すると、それは
違うスレッドを示すことになってしまい、エラーが起きます。
必ずフィールドに宣言しましょう。
これで実際にUIをいじることができるんですけど、とても見にくいですね。
ちなみに、これもJavaの標準クラスの一つなんですよ。

Androidはこれらの処理をもっと視覚的にわかりやすく書きなおせるクラスがあります。
内部処理はほとんど一緒なんで、書きなおすだけです。

それが、AsyncTaskクラスです。
ちなみに、Androidの昔のバージョンにはないそうですが、名前が違うだけで、
Android1.0と1.1ではUserTaskって名前のクラスらしいです。

さて、このAsyncTaskの使い方、ですがHandlerよりも当然簡単です。
が、ちょっと面倒なのは、クラスを作ったほうが良いということでしょうか。

public class Test extends AsyncTask<params, progress, result> {

    protected result doInBackground(params) {
        /* 非同期で行う処理 */
    }

    protected void onPostExecute(result) {
        /* バックグラウンドでの処理が終わってからUIで実行する処理 */
    }
}

こんなんを作成して、メインの方で

Test test = new Test();
test.execute();
でもしてくれたら大丈夫です。

extendsの横の<>に囲まれてるの。
あれはジェネリックスと言って、この型だけ!ってするもんです。
すいません、実はまだ理解が浅いので、ここはもっかい勉強します。

その中に表わしているのは、ひとつめparamsはどInBackgroundの引数で、
resultはその返り値、またonPostExecuteの引数の型を指定します。
これだけで、非同期処理が実装完了です!
以上。

2011年9月3日土曜日

・ 日本Androidの会 関西支部 勉強会

今日は堂島で行われた、勉強会に参加してきました。
友達がいないので一人で行ったのですが←
会社の先輩に会いました。
3名ほど。

そんなことはさておき、今日はその様子をちょこっと書きます。
台風の影響もあり、予定人数の半分くらいしか集まっていなかった
印象を受けましたが、勉強会そのものは予定通り開催されました。

1 ANR ふろむ InputDispacher ~ANRはどこからくるの~

最初に発表したのはなんと、会社の先輩でした!
うちの現場で最もAndroidができる・・・と言われている人です。
少し憧れです。

ANRというのは、Application Not Respondingの略で、
アプリが反応していない、処理に時間がかかりすぎることを
表示するものです。
この原因として、
・Broadcast Reciver
・Service
・Activity
がありますが、今回はActivityについてお話してくださいました。

ActivityでANRが発生するのはどんな時でしょうか。
処理待ちの状態になるためにはアクションが必要ですよね。
だから、そのトリガーとなるKeyイベントについて掘り下げていきました。

Keyが押されると、それがどんなKeyであるかをチェックします。
そして、それがどのキーか特定した後、今フォーカスが当たっている
アプリを調べます。
Androidでは、この処理に関しては何秒待つ・・・と言うのが決まっています。
アプリの種類と、Keyを照らし合わし、何秒待つかを決定。
もしも、その時間内に反応がなければANRが発生する・・・。
ということでした。

勉強不足で詳しくはわかりませんが、FroYoの時はJava側で
イベント配信をしていたのですが、GingerではNativeで行ってるそうです。
ここは意味がわからんので、勉強しなおします。


2 デザイナー女子から見たAndroidのセカイ

発表者は主にWEBデザインを手がけている女性でした。
開発者とは違う目線から見たAndroidデザインに関するものでした。

まとめると、AndroidはiPhoneに比べてオシャレじゃない!
だそうです。
デザイナーさんをもっと有効に使おう!
と言うことで3つのアドバイスをいただきました。

①仕様をざっくり伝えないで。
②参考にする何かを教えてもらえると伝わりやすい。
③組み込んだものを途中で見せてくれるとうれしい。

デザイナーが仕様書全部を理解できるわけじゃないけど、
あまりにざっくりだと、流れがわからず、イメージがわきにくいと。
そのイメージをさらに膨らませるには、参考にする何かがあれば、
デザイナーと開発者側でのギャップが解消しやすい。
で、途中で見せてもらえたら、もっとイメージわく!
との事でした。
リアルな声のような気がします(笑)

上のはデザイナーと一緒に仕事をする場合です。
もしも、自分でデザインするなら以下の事を抑えるとましになるよ!
ってのは

①近接
関連するものは近づけて、関連の薄いものは離す。

②整列 
配列は揃える。

③反復
繰り返すことによって統一感を出す。

④コントラスト
色の濃淡や、フォントの種類や大きさなどでの要素の違うものは
差を明確に付ける。(メリハリ)

だそうです!
何事にも、やりすぎはよくないのがポイントでした。


3 Nexus SにNFCキーガード機能を搭載する

海外版のNexusSにはもうNFCが対応しています。
その機能を利用して、ロック機能を付ける、というお話でした。
簡単にいえば、Felica等のカードを端末に登録しておけば、
それがキーとなり、端末のロックを解除できるようにするというもので、
アプリケーションの作成と言うよりかは、フレームワークの変更と言う、
もっと内部的なお話でした。

前知識はほぼ皆無だったので一番難しいお話でしたが、
とりあえず、実装してました。

http://www.youtube.com/watch?v=z2DnR4W2mpk

こんなのです。
すいません、解説できないです・・・。


4 AndroidとGAE

最後に、「GoogleAppEngine」を使ってみた、というお話です。
これは、WEBアプリケーションのサーバーとCBを同時に提供
してくれるもの・・・と今は認識しています。
発表者の方も使ったことがなかったので、今回は使ってみて
その感想を述べるというものでした。

実行環境はEclipseにプラグインを入れるだけで作れるそうです。
久しぶりにServletとか見て、WEBアプリ作りたいなぁってなりました。

感想としては、リソースは圧倒的だということ。
個人レベルのサーバとは訳が違うので、でっかい処理だって可能だと。
ただ、バッテリーに大きな不安があります。
もう一つは、マルチプラットフォームで今回はAndroidからの実行していましたが
WEBからでも大丈夫ですし、iPhone等でも大丈夫な、かなり汎用的な
サービスだなぁ。と言っていました。



こんな感じです!!!
この後に、LTがあり、面白い話もありましたが、またそれは別の機会に。