generated at
Androidの概念


manifest.xml
Androidアプリケーションの振る舞いや機能を定義(宣言)するためのファイル
xml
<manifest ... > <uses-permission android:name="android.permission.INTERNET" /> <application android:name=".HogeApplication" ... > <activity android:name=".HogeActivity" ... > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".HugaActivity" ...> <intent-filter> <action android:name="android.intent.action.SEND" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="text/plain" /> </intent-filter> </activity> </application> </manifest >
permissionapplicationactivityintentについては追って説明していく



Permission
Androidのセキュリティで保護された機能を使うための許可のこと
Manifestに書くことで使える機能と、初回使用時ユーザーにダイアログで許可を得ないと使えない機能がある


Intent
Androidアプリケーションにおいてもっとも中心的かつ特徴的な概念
Intentとは、任意のActivity等に、引数となるデータをセットして、呼び出し(起動)することができる機能
Activityを呼び出したあと、結果を受け取ることもできる
同一アプリケーション内のActivity間でIntentを送受信することができる
他のアプリケーション内のActivity等を呼び出すこともできる
Activityを指定しなくても、曖昧に対応するアプリのActivityを呼び出すことができる(暗黙的Intent
特定のActivityを指定して呼び出すこともできる(明示的Intent
ひとつではなく対応するすべてのアプリを呼び出すこともできる(Broadcast intent
Intentを構成する要素
Action
Category
Type
Extra
Intentを送受信できるクラス
Activity
startActivity()
startActivityForResult()
Service
startService()
BroadcastReceiver
sendBroadcast()
sendOrderedBroadcast
暗黙的Intent
クラス名を指定しない曖昧なIntent
文字列を送信する例
java
Intent sendIntent = new Intent(Intent.ACTION_SEND); sendIntent.setType("text/plain"); sendIntent.putExtra(Intent.EXTRA_TEXT, "text"); sendIntent.putExtra(Intent.EXTRA_SUBJECT, "subject"); sendIntent(shareIntent);
これを実行すると、Androidデバイスにインストールされているテキスト送信が可能なすべてのアプリケーションの一覧が選択肢として表示される
WebブラウザでURLを開く例
java
Uri uri = Uri.parse(url); Intent intent = new Intent(Intent.ACTION_VIEW, uri); startActivity(intent);
これを実行すると、Androidデバイスにインストールされているブラウザアプリケーションの一覧が選択肢として表示される
明示的Intent
クラス名を指定するIntent
Broadcast Intent
対応する全アプリケーションを呼び出すIntent
システム関係の状態変化イベントなどもBroadcast Intentとして発射されているので、システムの状態に応じてアプリの挙動を変えたい場合には受信できるように実装する必要がある
通信方式が4Gになった、Wi-Fiになった、無になった
画面がONになった、OFFになった
バッテリーが非常に少ない、充電開始された
BluetoothがONになった、OFFになった



Application
Applicationクラスは1つのアプリにつき1つだけ定義できる
どのActivityを起動するかは、manifest.xmlに従ってAndroid OSによって決定されるので、Applicationクラスは関与しない
独自のApplicationクラスを書くことができる
独自のApplicationクラスを書かない場合は <application>...</application> でOK
アプリがフォアグラウンドかバックグラウンドかを判定するためには、結局実装するハメになる
ライブラリ等を使う際にも、このApplicationクラスのonCreate()内で初期化処理をする事が多いので知っておいて損はない
java
public class HogeApplication extends Application { private AppStatus mAppStatus = AppStatus.FOREGROUND; @Override public void onCreate() { super.onCreate(); registerActivityLifecycleCallbacks(new MyActivityLifecycleCallbacks()); } @Override public void onTerminate() { super.onTerminate(); } public AppStatus getAppStatus() { return mAppStatus; } public enum AppStatus { BACKGROUND, RETURNED_TO_FOREGROUND, FOREGROUND; } public class MyActivityLifecycleCallbacks implements ActivityLifecycleCallbacks { private int running = 0; @Override public void onActivityStarted(Activity activity) { if (++running == 1) { mAppStatus = AppStatus.RETURNED_TO_FOREGROUND; } else if (running > 1) { mAppStatus = AppStatus.FOREGROUND; } } @Override public void onActivityStopped(Activity activity) { if (--running == 0) { mAppStatus = AppStatus.BACKGROUND; } } } }


Activity
Activityとは、Androidアプリにおいて、ひとつの役割をこなす画面の単位のこと
Androidアプリは、1つ以上のActivityから構成されている
各Activityは、Intentでデータをやり取りして呼び出すことができる
後述するFragmentManagerを用いて、1つ以上のFragmentをまとめることで、ひとつの画面を構成する
java
public class HogeActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_hoge); if (savedInstanceState == null) { MainFragment fragment = new MainFragment(); FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); transaction.add(R.id.container, fragment); transaction.commit(); } } }


Service



BroadcastReceiver







Fragment
Fragmentは、AndroidアプリケーションにおけるUIの断片となる概念。
Fragmentは、常に特定のActivityインスタンス内に存在する子要素である
ActivityはIntentを受け取れるが、Fragmentは常にActivityの子要素であり、Intentを受け取れない
FragmentManagerで表示するFragmentを入れ替えることで、簡単な画面遷移を実現できる
基本的には、ひとつのActivity内でFragmentをコロコロ切り替えればアプリの画面遷移は作れてしまう
その画面が独立したステートマシンを持つような場合は、別のActivityになっていたほうが良さそうyuiseki
Intentをやり取りしたくなった場合には、別のActivityに切り出すのが良さそうyuiseki


FragmentManager



レイアウトXML
AndroidではXMLでActivityやFragmentのレイアウトを定義する。


Canvas


View
java
public class HogeView extends View { public HogeView(Context context) { super(context); } public HogeView(Context context, AttributeSet attrs) { super(context, attrs); } public HogeView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } @Override public void onDraw(Canvas canvas){ super.onDraw(canvas); } }


ViewGroup
入れ子にすることができるView
ScrollView
子要素をスクロールできるようにするView
FrameLayout
Fragmentをはめ込むのに使うもっとも基本的なレイアウト
LinearLayout
水平もしくは垂直に子要素を並べることができるレイアウト
RelativeLayout
上下左右中央など、画面の相対的な位置に子要素を配置することができるレイアウト