Androidの概念
https://gyazo.com/80af2ddd1d5ebf84d820879ce4560295
manifest.xml
Androidアプリケーションの振る舞いや機能を定義(宣言)するためのファイル
code: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 >
permission、application、activity、intentについては追って説明していく
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
文字列を送信する例
code: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を開く例
code: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()内で初期化処理をする事が多いので知っておいて損はない
code: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をまとめることで、ひとつの画面を構成する
https://gyazo.com/5fbd28f1a459a8e220b1a0e0e369da3f
code: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の断片となる概念。
https://gyazo.com/59116ca997b1e008ada2324dcd7f0e94
Fragmentは、常に特定のActivityインスタンス内に存在する子要素である
ActivityはIntentを受け取れるが、Fragmentは常にActivityの子要素であり、Intentを受け取れない
FragmentManagerで表示するFragmentを入れ替えることで、簡単な画面遷移を実現できる
基本的には、ひとつのActivity内でFragmentをコロコロ切り替えればアプリの画面遷移は作れてしまう
その画面が独立したステートマシンを持つような場合は、別のActivityになっていたほうが良さそうyuiseki.icon
Intentをやり取りしたくなった場合には、別のActivityに切り出すのが良さそうyuiseki.icon
https://gyazo.com/08b0bcb242607c794ecd2bf76d173e12
FragmentManager
レイアウトXML
AndroidではXMLでActivityやFragmentのレイアウトを定義する。
Canvas
View
code: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
上下左右中央など、画面の相対的な位置に子要素を配置することができるレイアウト