unoh.github.com

分かったつもりになるAndroid開発方法

Wed Sep 30 02:16:10 -0700 2009

こんばんは。うちだです。

皆さんAndroid携帯は購入しましたか?
社内ではiPhone勢が多く、Android携帯所持は私だけという悲しい現実を目の当たりにしています。

そこで以前、社内勉強会にて、Androidの素晴らしさを皆に知ってもらおうと発表した内容が今回のエントリーです。

今回のエントリーでは開発者視点で分かったつもりになる為に、広く浅く書いてます。
本気で分かるには公式ドキュメントや書籍及び参考リンクをご参照ください。

参考: Android | Official Website

特徴

環境

参考: わかった気になる気になるandroid

メリット

デメリット

開発

環境構築

参考: 開発環境を構築するには

アクティビティ

いわゆる、コントローラー。1つのウィンドウと考えてもらっても大丈夫だと思います。
Activityクラスを継承したクラスでレイアウトの設定や各種イベントを登録します。
また、インスタンスの生成から破棄までのライフサイクルが非常に重要ですので参考リンク先を参照ください。

Activityクラスの子クラスには専用の仕事をするクラスもあります。

参考: 勉強会/Android SDK WG 第1回 セッション(2008.10.25)

ウィジェット

画面を構成する部品

参考: 簡単でワクワクするAndroidウィジェット10連発!

レイアウト

画面のウィジェットの配置は基本的にxmlファイルで定義します。
そしてxmlファイルから自動で生成されるRクラスを使いコントロールします。
ちなみに、手書きだと面倒なのでDroidDrawを使うと楽(Web版は重いです)

参考: DroidDraw

リソース

文字列やアイコン等の定義ファイルです。これもxmlで記述し、Rクラスを使います
文字列はロケールによって切り替え可能。

参考: Resources and Internationalization | Android Developers

Activity、レイアウト、リソースのサンプル

// res/values/string.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="hello">Hello World, ex1Activity!</string>
    <string name="app_name">ex1</string>
</resources>

// res/layout/main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<TextView  
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="@string/hello"
    />
</LinearLayout>

// src/net.unoh.ex1/exActivity.java
package net.unoh.ex1;

import android.app.Activity;
import android.os.Bundle;

public class ex1Activity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }
}

インテント

アプリケーションからアクティビティやサービスを起動する仕組み。次の二つのタイプがある

参考: Androidの重要な機能、インテント
参考: 勉強会/インテントを発行してみよう – 日本Androidの会(日本アンドロイドの会)
参考: OpenIntents

サービス

バックグラウンド処理を実現します。
例えば、時間のかかるダウンロード処理をバックグラウンドで行う等が可能です。
また、AIDLを使う事でActivity等とのプロセス間通信が可能となります。
電源をonにしたときに起動することでcronやタスクマネージャーのように使う事もできます。

各種センサー機能はシステムサービスとして提供されています

参考: AIDLによるプロセス間通信
参考: 常駐アプリが作成できるAndroidのサービスとは
参考: Android のセンサーを活用する

このあたりまでのサンプル

// AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="net.unoh.ex1"
    android:versionCode="1"
    android:versionName="1.0">
    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".ex1Activity"
            android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <service android:name=".ex2Service" />
    </application>
    <uses-sdk android:minSdkVersion="3" />
</manifest>

// res/values/string.xm
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="hello">Hello World, ex1Activity!</string>
    <string name="app_name">ex1</string>
    <string name="btnEx2">Service</string>
    <string name="btnEx3">Intent</string>
</resources>

// res/layout/main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<TextView  
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="@string/hello"
    />
<Button
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:id="@+id/btnEx2"
    android:text="@string/btnEx2"
    />
<Button
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:id="@+id/btnEx3"
    android:text="@string/btnEx3"
    />
</LinearLayout>

// src/net.unoh.ex1.ex1Activity.java
Button btnEx2 = (Button)findViewById(R.id.btnEx2);
    btnEx2.setOnClickListener(new View.OnClickListener(){
        public void onClick(View v) {
        Intent i = new Intent(ex1Activity.this, ex2Service.class);
        Log.v("click", "start");
        startService(i);
    }
});
Button btnEx3 = (Button)findViewById(R.id.btnEx3);
    btnEx3.setOnClickListener(new View.OnClickListener(){
        public void onClick(View v) {
        Intent i = new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.unoh.net/"));)
        startActivity(i);
    }
});

// src/net.unoh.ex1.ex2Service.java
package net.unoh.ex1;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.widget.Toast;

public class ex2Service extends Service {
    @Override
    public IBinder onBind(Intent arg0) {
        return null;
    }
    @Override
    public void onStart(Intent intent, int startId) {
        Toast.makeText(this, "ex2Service", 500).show();
    }
}

コンテンツプロバイダー

アプリケーションが所有するデータを他のアプリケーションに公開する仕組み
例えば電話アプリケーションが所有する通話履歴データを取得できたりします。

また、アプリケーションがデータを永続化する方法として次のものがあります

参考: Content Provider入門
参考: Android SharedPreferences について

ネットワーク

もちろん普通にできます。
気をつける点は、デフォルトではセキュリティ上の問題で拒否されている為、許可するためにAndroidManifest.xmlのPermissionsの項目を記述しなければならない。

参考: HTTP(DefaultHttpClient/HttpHost/HttpGet/HttpResponse/HttpEntity)
参考: HT-03A その9

tips

参考: XmlPullParser(XML解析(パース))
参考: JSON形式のデータにアクセス
参考: AndroidでListView
参考: サーフェイスビュー
参考: OpenGL
参考: Android 開発情報
参考: 逆引きAndroid入門

ただでさえ消費電力が多いので省電力プログラミングがとても重要です

参考: AndroidのappWidget作成時に行っておくべき消費電力対策についてのまとめ

アプリケーションの配信

Androidマーケット

参考: 開発者登録するには

野良アプリ

これから必要なこと

おしまい