狠狠撸

狠狠撸Share a Scribd company logo
学生向け勉強会
Android入門編
      リクルート

 Media Technology Labs

       黒田 樹
About Me
黒田 樹
Plz follow @i2key :-)
System Integrator


  元SIer
就活でネット系かSIerか悩んでいる人は
ニュートラルな立場で相談に乗ります。
空港で貨物を管理
するシステム
国の輸出入を管理
するシステム
Application Architect
1200人月規模
 だったり


300億円規模
人海戦术
学生向け础苍诲谤辞颈诲勉强会(入门编)
学生向け础苍诲谤辞颈诲勉强会(入门编)
学生向け础苍诲谤辞颈诲勉强会(入门编)
About MTL
Media Technology Labs.
? 技術調査研究~新規事業開発を行う
 「実証研究機関」

? ネット分野における新しいビジネスを創る

続きはWebで

http://mtl.recruit.co.jp
http://shoplier.jp
Question
Webサイトや
アプリを作ったこ
とがある人
Javaどんくらいですか?
?未経験
?HelloWorld !!!
?基礎文法だけ
?学校の授業で一通り
?Webサイト/アプリ作ったことある
?デザインパターンをいくつか語れる
Agenda
Architecture
サンプルの绍介
View
Activity
Intent
ListView
ListViewのカスタム
非同期処理
TIPS
Architecture
学生向け础苍诲谤辞颈诲勉强会(入门编)
RUNTIME


Linuxのユーザをアプリケーショ
ンベンダ毎(署名毎)に作成

他のベンダのアプリへの権限が
無い(アプリの乱立への対応)

DalvikVM(JVM)はアプリケーショ
ン毎に別プロセスで起動
学生向け础苍诲谤辞颈诲勉强会(入门编)
サンプルの绍介
SimpleListView




                                        DetailView
              詳細
              チェック無し




            詳細
            チェック有り
QueryView




                       CustomListView
学生向け础苍诲谤辞颈诲勉强会(入门编)
学生向け础苍诲谤辞颈诲勉强会(入门编)
SimpleListView




                                        DetailView
              詳細
              チェック無し




            詳細
            チェック有り
QueryView




                       CustomListView
学生向け础苍诲谤辞颈诲勉强会(入门编)
学生向け础苍诲谤辞颈诲勉强会(入门编)
学生向け础苍诲谤辞颈诲勉强会(入门编)
SimpleListView




                                        DetailView
              詳細
              チェック無し




            詳細
            チェック有り
QueryView




                       CustomListView
DLして動作確認
を!!
https://github.com/i2key/HelloWorld2.0
Activity用パッケージ


 Adapter用パッケージ

 非同期処理用パッケージ

 データクラス用パッケージ

 永続化関連用パッケージ

  Lib配下にはTwitter4Jのjar




 画面のレイアウト
ここで
18:30だと
 オンスケ
今日覚えること
View
Activity
Intent
SimpleListView




                                        DetailView
              詳細
              チェック無し




            詳細
            チェック有り
QueryView




                       CustomListView
QueryActivity                    SimpleTimeLineActivity
onCreate()     ButtonClickListener   onCreate()      onListItemClick()
  Viewの初期設定    onClick()               Intent情報取得      Toast表示
  “Send”処理定義     Intent発行              TwitterTL取得
                                       TL情報をAdapterに
View
XMLで記述されたユーザインタフェース

基本的に以下の記述形式になる

<TextView android:id = “@+id/Hoge” />



作成はEclipseに入っているエディタでド
ラック&ドロップ。直接記述の可。
R.layout.Hogeとしてアクセス可能になる
query.xml
学生向け础苍诲谤辞颈诲勉强会(入门编)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:orientation="vertical" >

 <LinearLayout
   android:id="@+id/linearLayout1"
   android:layout_width="match_parent"
   android:layout_height="wrap_content" >

   <EditText
     android:id="@+id/editText1"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:layout_weight="0.63"
     android:hint="@string/search" >
   </EditText>

   <Button
     android:id="@+id/button1"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:text="@string/send" />
 </LinearLayout>

</LinearLayout>
Activity
画面に対応した、コントローラークラス
iOS(Xcode)で言うHogeViewController

?画面表示
 Viewへ出力する情報のセット
 Viewの加工

?画面イベント処理
 画面のボタン等に対応した処理を記述し、
 実行するクラス

 例)ボタンおされたら検索
QueryActivity.java
辩耻别谤测.虫尘濒をセット
    ボタンクリック時
    の処理をセット
Activity


1つのViewに対して、1つのActivity




    query.xml   QueryActivity.java
public class ExampleActivity extends Activity {
  @Override

    public void onCreate            (Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      // The activity is being created.
    }

    @Override
    protected void onStart() {
      super.onStart();
      // The activity is about to become visible.
    }

    @Override
    protected void onResume() {
      super.onResume();
      // The activity has become visible (it is now "resumed").
    }

    @Override
    protected void onPause() {
      super.onPause();
      // Another activity is taking focus
      // (this activity is about to be "paused").
    }

    @Override
    protected void onStop() {
      super.onStop();
      // The activity is no longer visible (it is now "stopped")
    }

    @Override
    protected void onDestroy() {
      super.onDestroy();
      // The activity is about to be destroyed.
    }
}
Intent
View
                          View


                         Simple
Query
                         TimeLine
Activity
                         Activity



   Intent                     Intent

            ActivityManager
Intent

  Query                       SimpleTimeLine
  Activity                    Activity




ActivityからActivityに遷移するための仕組み
通常、画面とActivityは一対一なので、画面遷移に
用いられる。

Intent intent =
   new Intent(今のActivity,遷移先Activity);
intent.putExtra(”key”,”value”);
startActivity(intent);
QueryActivity.java
Intent intent =
   new Intent(今のActivity,遷移先Activity);
intent.putExtra(”key”,”value”);
View
                                        View

                                      Post
Query       Twitter for Androidのツイー   Activity
Activity                              (com.twitter.an
            トするためのPostActivityを       droid)
            起動することもできる
   Intent                               Intent

                ActivityManager
ListView
学生向け础苍诲谤辞颈诲勉强会(入门编)
timeline.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/a
ndroid"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:orientation="vertical" >

 <ListView
   xmlns:android=
    "http://schemas.android.com/apk/res/android"
   android:id="@id/android:list"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:clickable="true" >
 </ListView>

</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/a
ndroid"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:orientation="vertical" >

 <ListView
   xmlns:android=
    "http://schemas.android.com/apk/res/android"
   android:id="@id/android:list"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:clickable="true" >
 </ListView>

</LinearLayout>
SimpleTimeLine
Activity.java
値の取り出し



   TwitterからTL取得


   TLをList<String>
   に
ListViewにデータをセット
Activity       レコード毎にデータを
                                Hoge
               流し込んでくれる存在       Foo
                                Bar
                 ArrayAdapter



                List<String>
List<String>    ?Hoge
?Hoge           ?Foo
?Foo            ?Bar
?Bar

他には、、、
SimpleAdapter:Map型をListViewにマッピング
学生向け础苍诲谤辞颈诲勉强会(入门编)
ここまでの
まとめ
QueryActivity                    SimpleTimeLineActivity
onCreate()     ButtonClickListener   onCreate()      onListItemClick()
  Viewの初期設定    onClick()               Intent情報取得      Toast表示
  “Send”処理定義     Intent発行              TwitterTL取得
                                       TL情報をAdapterに
ここで
19:15だと
 オンスケ
ここからが本番
カコワルイ
学生向け础苍诲谤辞颈诲勉强会(入门编)
尝颈蝉迟痴颈别飞カスタマイズ

非同期ネットワークアクセス
CustomTimeLineActivity
         onCreate()                                   onListItemClick()
           Intent情報取得                                   詳細画面遷移
           TwitterTL取得(非同期)       ListView表示(データ無し)

                      onFinishTask()
                       TL情報を独自
                       Adapterにセット


                     TweetAdapter
TwitterTimeline      getView()           行
                      独自にListViewの       表示
RequestTask          レコード作成                                    選択
doInBackground()      (tweet.xmlレイアウト)
 TL情報を取得
 onFinishTask()を
コールバック               ImageDownloadTask
                      doInBackground()
           同期          Cacheを確認          画像
                       ImageをDL          表示
           非同期
尝颈蝉迟痴颈别飞カスタマイズ
timeline.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/a
ndroid"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:orientation="vertical" >

 <ListView
   xmlns:android=
    "http://schemas.android.com/apk/res/android"
   android:id="@id/android:list"
   android:layout_width="match_parent"



   Listの枠は
   android:layout_height="match_parent"
   android:clickable="true" >
 </ListView>

</LinearLayout>



   さっきのまま
ArrayAdapter

       extends
TweetAdapter
tweet.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="?android:attr/listPreferredItemHeight"
  android:padding="6dip" >

 <ImageView
   android:id="@+id/image"
   android:layout_width="40dip"
   android:layout_height="40dip" />

 <LinearLayout
   android:layout_width="0dip"
   android:layout_height="wrap_content"
   android:layout_weight="1"
   android:orientation="vertical" >

   <TextView
     android:id="@+id/screennametext"
     android:layout_width="match_parent"
     android:layout_height="0dip"
     android:layout_weight="1"
     android:focusableInTouchMode="false"
     android:gravity="center_vertical"
     android:textColor="@color/screenname_color" />

    <TextView
      android:id="@+id/tweettext"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:layout_weight="1"
      android:ellipsize="marquee"
      android:focusableInTouchMode="false"
      android:singleLine="false"
      android:textColor="@color/text_color" />
  </LinearLayout>
</LinearLayout>
TweetAdapter.java
1行分のレイアウトを迟飞别别迟.虫尘濒から生成

            tweet.xmlの
            Screennametextに
            screenNameを入れる
                tweet.xmlの
                tweettextに
                textを入れる


      tweet.xmlのimageに
      非同期に取得した画像を入れる
CustomTimeLine
   Activity.java
学生向け础苍诲谤辞颈诲勉强会(入门编)
非同期ネットワークアクセス
AsyncTask
(AsyncTaskLoaderは
今回やりません)
TwitterTimeLine
RequestTask.java
別スレッドで実行される処理




GUIスレッドで
実行される処理
引数はdoInBackgroundの戻り
値
CustomTimeLine
   Activity.java
学生向け础苍诲谤辞颈诲勉强会(入门编)
ここまでの
まとめ
CustomTimeLineActivity
         onCreate()                                   onListItemClick()
           Intent情報取得                                   詳細画面遷移
           TwitterTL取得(非同期)       ListView表示(データ無し)

                      onFinishTask()
                       TL情報を独自
                       Adapterにセット


                     TweetAdapter
TwitterTimeline      getView()           行
                      独自にListViewの       表示
RequestTask          レコード作成                                    選択
doInBackground()      (tweet.xmlレイアウト)
 TL情報を取得
 onFinishTask()を
コールバック               ImageDownloadTask
                      doInBackground()
           同期          Cacheを確認          画像
                       ImageをDL          表示
           非同期
ここで
19:45だと
 オンスケ
あと少し
学生向け础苍诲谤辞颈诲勉强会(入门编)
Tweet.java
            ?screenName
            ?text
            ?date
            ?image
            ? …etc

CustomTimeLine            TweetDetail
Activity                  Activity

            Intent
Intent
 基本的なデータ型しか送信できない。
 しかし、Parcelableインタフェースを実
 装することによって、Parcelable型で受
 け渡しが可能。

  Tweet implements Parcelable
  ?screenName
  ?text
  ?date
  ?image
  ? …etc
Tweet.java
TweetDetail
Activity.java
tweet_detail.xml
TIPS
メモリーリーク対策 その1

メモリーリークになるときに、DalvikVMに優先的に
メモリー解放させることが出来る。SoftReference以
外からの参照が無い場合に、解放。
DalvikのGCのはなし

アクティブじゃないActivityはGC対象に
なる。
状態はシリアライズされる。
アクティブになったときはそこから復
元される。
パフォーマンスアップ

オブジェクトを生成しない
?文字列操作はStringではなく、
 StringBufferでやる。
?プリミティブ型を使う。
 Integer -> int
?などなど
パフォーマンスアップ

インタフェース型を利用しない

× Map map = new HashMap();
○ HashMap map = new HashMap();
パフォーマンスアップ

ローカル変数にキャッシュする
パフォーマンスアップ

Staticメソッドを使う

オブジェクトのフィールドにアクセス
しない場合は、メソッドをStatic化して
おく。
ここにまとまってます

http://developer.android.com/guide
/practices/design/performance.html
DIしたい人
RoboGuice




http://code.google.com/p/roboguice/
課題
Twitter4jで戻している値を詳細画面に表示さ
せようー

詳細画面に発言者のNameを追加する。
(Twitter4j.Statusの中にUserクラスがあって、
そのメンバのnameをつかう。

More Related Content

学生向け础苍诲谤辞颈诲勉强会(入门编)