iOSとandroidアプリケーション作成時の対照表
動機
わたしはiOSからはじめたので、AndroidSDKやJavaの使い方に慣れていないため、iOSとandroid双方でアプリケーション作成した際の対照表を作ってみました。
対応すべきバージョン更新履歴
随時更新
その他項目更新履歴
2020.7.15更新
2018.8.20更新
2018.7.27更新 Kotlinスコープ関数(let run apply by lazy also with 拡張関数)はいったい何が異なるのか
2018.7.22更新 Swiftとkotlinの⁉(optional型、nullable)の考察
2018.7.20更新 Swift, Objc, Java, Kotlinの比較
2017.11.07更新
2017.09.14更新
2017.04.28更新
2016.06.08更新
2016.03.31更新
2014.05.26作成
iOSとandroidアプリケーション作成時の対照表
| iOS (Cocoa Touch framework on Xcode) |
android (android SDK, NDK on Android Studio) |
|
| 開発者 | Apple inc. | Alphabet inc. |
| 開発言語 | Modern Objective-C, C++, C, Swift SwiftとObjcとの対照表 |
Java, C, C++(JNI), Kotolin KotlinとJavaとの対照表 |
| 標準開発環境 (IDE) |
Xcode (Apple) | Android Studio (Google) |
| コンパイラ/ビルドシステム | Apple LLVM | Gradle(makeみたいなもの) コンパイラは Javac と Eclipse Compiler for Java on JavaDevelopmentTools から選べる |
| プロジェクトのフォルダ構成 | フォルダはどんな名称でどこに作ってもOK | Androidではプロジェクトのフォルダ構成が細かく決まっている
resファイルに属性を指定する方法 * 多言語化 : (フォルダ名)-(国コード) 例:values-ja * 解像度 : (フォルダ名)-(解像度レベル) 例:mipmap-xxhdpi * androidバージョン : (フォルダ名)-(バージョン) 例:values-v21 * 画面横サイズ : (フォルダ名)-(サイズ) 例:values-w820dp |
| アプリケーション内課金 | inAppPurchase | inAppBuilling |
| アプリケーションストア | App Store | Google Play |
| デベロッパー登録(アプリケーションストアに掲載するために必要) | 年間登録料 99米国ドル( Apple Developer Program - Membership for one year 電話またはメールでのサポート2回付き |
登録料 25米国ドル(約2,500円+税) |
| 販売手数料 | アプリケーション価格、アプリケーション内課金価格の30% | アプリケーション価格、アプリケーション内課金価格の30% |
| サブスクリプション(購読単位)アプリケーション内課金 | 1週間、1、2、3か月、6か月、1年 | 1か月、1年 |
| アプリケーション販売申請からストア公開まで |
2日ほどの審査期間、問題なければ公開される(2016年後半から審査が早くなった) 1回だけ Expedited review(特急審査)をリクエストすることができる。 |
審査なし、1~2時間後に公開される |
| ストア掲載申請時に必要な情報 | App StoreへiOSアプリケーション申請時に必要な掲載情報一覧 | GooglePlayへandroidアプリケーション申請時に必要な掲載情報一覧 |
| アプリケーション設定 | Info.plist(Build設定に定義されたファイル名) 最初に起動する nibファイル(StoryBoard)を定義する |
AndroidManifest.xml 最初に起動するActivityを定義する IntentするActivityはここですべて定義しなければならない |
| 画面定義 | nib (.xib) storybord (.storyboard) |
layout/.xml |
| 国際化 | Localizable.strings 文字列 localize.xib 画面 localize.storyboard 画面群 localize.png 画像 *Xcodeの右ペインで国際化指定すると自動的にフォルダ分けされる |
res/values-ja/strings.xml 文字列
|
| プロジェクトで使用する画像 | xxx.png *どのフォルダに置いても良い |
drawable/xxx.png |
| アプリケーション配布形式 | .ipa(appStore, adHoc, enterprise) .xcarchive(Xcodeでインストール)
|
.apk |
| アプリケーションサイズ上限 | 3G4G接続でダウンロード上限:100MB WiFi接続でダウンロード上限:4GB |
android4.0以上 android4.0未満 3G4G接続でダウンロード上限:150MB(内apk本体50MB) |
| ファイルタイプ | .m .mm .cpp .c |
.java .cpp (JNI) .c (JNI) |
| デバイス画面サイズ(dp) | 画面フラグメント:4 *フルHDで再生表示できるのはiPhone(6(S),7,8)PlusとiPhoneXとiPadのみ |
画面フラグメント:1 * 格安スマートフォン以外はすべてフルHDに対応した。 |
iPhone
*以降、およそ2.2:1の画面 |
Phone
|
|
iPad |
Tablet
|
|
| デバイス機能 | iPhone (2007)
iPhone 7 (2016)
|
機種によりまちまちで統一されていない HTC Dream (2008) 前面ハードウェアボタンはほとんどの機種で実装していない (2015)
android5からほぼiPhoneと使いやすさが並んだと言ってよい。 |
市場シェアデータ |
||
| 世界シェア |
15% (2017) |
|
| 日本国内シェア *ここ数年はずっとこんな感じ |
60% (2009 - 2014まで) 50% (2015 - 2017)
|
40% |
国内メーカ別シェア(スマートフォン、2017年) *ここ数年はずっとこんな感じ |
Apple iPhoneシリーズ 50%
*なぜか広い世界で日本でだけSamsungのシェアは圧倒的に低い。 |
|
| 国内出荷台数 (スマートフォン、2015年) |
3,650万台 出典:MM総研調査 |
|
| 対応すべきバージョン (2021年10月現在) |
X iOS3 (2009) 0% *iOSは新OS配布開始から3ヶ月で導入率7割になるが、ここ最近は配布初期のOS不具合が頻繁に発生することから、徐々にフラグメントが広がりつつある。 *iOSのバージョンによるフラグメントは2つだが、画面サイズのフラグメントが4つもある。 *現状ではandroidよりiOSのフラグメントが高く開発しにくい。しかしメーカによるフラグメントは全くない。 |
X android2 (2010) 0%
日本国内に限定すると(2021 10 13) 日本国内に限定するとandroid9、10が30%、8、7が20%づつのシェア(2020 07 15) <詳細>*更新していない 20200715 *一般的な用途のアプリケーションの場合は、API 28以降に対応する必要がある。 *API別で3フラグメント、バージョン別で3フラグメントしている。 *画面サイズのフラグメントはない。 *iOSに比べandroidのほうが開発しやすい状態なのだが、メーカによる隠れたフラグメントが大きい。 |
| スプラッシュスクリーン | Storyboardで定義する場合
|
res/values/style.xml (AppTheme) res/drawable/splash.xml res/drawable/splash_image.png を作って MainActivityのonCreateメソッドでsuper呼んだ直後に setTheme(R.style.AppTheme);する 画像サイズ hdpi 540x960 xhdpi 720x1280 xxhdpi 1080x1920 xxxhdpi 1440x2560 |
| アプリケーションデリゲート(メインアクティビティ) | AppDelegate |
|
| 最初に実行されるviewController (Activity) | plistで指定したMainStoryboardで Is Initial ViewController をチェックしたViewController Storyboardを使わないとき applicationDelegateのdidFinishLaunchingWithOptions:メソッドで[window setRootViewController:viewController];したViewController |
|
| provider | Androidmanifestに宣言したproviderクラスは最初に起動されるActivityよりも前にonCreateされる。 | |
| ビューコントローラー(アクティビティ、フラグメント) | ViewController | Activity Fragments *ActivityGroupがdeprecateされ、Activity + Fragmentsで複数のアクティビティを実現する。 |
| ビュー | UIView (EagleViewなどに継承されて使用) |
View (GLSurfaceViewなどに継承されて使用) widget (Spinner, TextView, ImageView, EditText) 実際はViewを継承してるクラスだけど、通称でwidgetと呼ばれてる |
| viewController (Activity)に表示するview指定方法 | nibでviewを定義する or viewControllerのviewDidLoadメソッドでviewをalloc initしてaddSubviewする |
setContentView(R.layout.xmlFileName); |
| インスタンス生成 (ビュー、ウィジェット、コントローラ、クラスなど) |
|
|
| C++ | // スタック上に生成(メソッド内でのみ有効) ViewClassName obj; // ヒープ上に生成 ViewClassName *obj = new ViewClassName(); |
Javaではヒープ上にインスタンスが生成される |
| (Sub)View表示 | [view addSubView:subView]; | ViewGroup#addView(subView); *ViewGroup(LayoutView)だけaddViewできる Activity#addContentView() *R.layoutをinflateしてaddContentViewする |
| (Sub)Viewを非表示にする | [subView removeFromSuperview]; *Viewのvisible属性をfalseしてもOK |
ViewGroup viewParent = (ViewGroup)this.subView.getParent(); viewParent.removeView(this.subView); *Viewのvisible属性をfalseしてもOK view.setVisibility(View.GONE); |
| クラス名は大文字始まり | クラス名は大文字始まり | |
| 変数名は小文字始まり | 変数名は小文字始まり | |
| フレームワークで定義されているクラス名 | cocoaフレームワークで定義されているクラス名はプレフィックスがついていて何に使うクラスなのかが一目瞭然(ex. UIView, NSData) | Android SDKで定義されているクラス名にプレフィックスが全くないので調べないと何に使うクラスなのかわからない(ex. View, Data) |
| リソースファイル名 | パソコンで使えるファイル名ならOK | 小文字と数字だけ。大文字が使えない |
| [UIColor whiteColor] | Color.WHITE 又は R.color.white |
|
| 文字定数の国際化 | |
|
| @“文字定数” | “文字定数” | |
| nibでもコードでも画面作れる | xmlでもコードでも画面作れる | |
| application:didFinishLaunchingWithOptions: | onCreate() | |
| メソッドスコープ | .hの@interface class に定義 | public type methodName() |
| .mの@interface class (private)に定義 | private type methodName() | |
| 変数スコープ | .hの@interface className にプロパティ定義 @property (assign, readwrite) type varName; これによりセッター、ゲッター、インスタンス変数(_varName)を生成する |
public type varName; |
| .mの@implementation className {}内にインスタンス変数定義 type _varName; |
private type varName; | |
| C++ | public: private: |
|
| クラスメソッド | + (type)methodName | public static type methodName() |
| インスタンスメソッド | - (type)methodName | private type methodName() |
| C++ | クラスメソッド static type methodName() インスタンスメソッド type methodName() |
|
| [instanceVariable methodName] | instanceVariable.methodName() | |
| self.instanceVariable | this.instanceVariable *this.はつけてもつけないくても同じ意味 |
|
| [array objectAtIndex:0] | array.get(0) | |
| NSInteger, int | int | |
|
|
|
| 定数 |
|
static final (定数、継承しないメソッド、クラス) |
|
|
|
|
|
|
| クラス名はプロジェクトで一意 | .javaでpackage名を定義すると同じクラス名でもOK、別スコープとなる | |
| ライフサイクル | AppDelegateとviewControllerライフサイクル | ActivityとFragmentライフサイクル |
| didFinishLaunchingWithOptions(appDelegate) | onCreate | |
| applicationDidBecomeActive(appDelegate) | onStart | |
| applicationWillEnterForground(appDelegate) | onResume | |
| applicationDidEnterBackground(appDelegate) | onPause | |
| applicationWillTerminate(appDelegate) | onStop | |
| applicationDidBecomeActive(appDelegate) | onRestart | |
| dealloc | onDestroy | |
| バンドル情報(パッケージ情報)取得 | productName-Info.plist で定義した値 |
AndroidManifest.xml で定義した値 PackageInfo #packageName etc. |
| keyValue persistentストア(アプリケーション内共通preference)に保存・読み出し | preferenceファイルは1つ |
|
| スマートフォン設定情報取得(ネットワーク接続) | |
|
| 画面の向きを固定する | plistのUISupportedInterfaceOrientations | AndroidManifestのscreenOrientation |
| アプリケーション設定情報(Setting)の取得 *iOSは設定アプリケーション、androidはアプリケーション内のActionBarButtonから設定した値 |
設定アプリケーションに設定項目を設定する |
|
| データベース | SQLiteが使える CoreDataを使う *結果をUITableViewと連動する場合はCoreDataを使ったほうがよいです。 FMDBなどのthird party libraryもある |
SQLiteが使える |
| フェッチ機構 | NSFetchedResultController | LoaderManager CursorAdapter (SimpleCursorAdapter) |
| DBインタフェース | NSManagedObjectContext | ContentResolver |
| データ管理 | NSManagedObject | Cursor |
| テーブルビューコントローラー(ListActivity)とデータベースの連携 | <UITableViewDelegate, NSFetchedResultControllerDelegate> を宣言して UITableViewController に NSFetchedResultController で取得した値をテーブルセルに-tableView:cellForRowAtIndexPath:で表示する ↓ NSManagedObjectContext ↓ NSEntityDescription ↓ CoreData(Data Modelでスキーマ定義 = SQLite) |
implements LoaderManager.LoaderCallbacks<Cursor> を宣言して ListActivity(or ListFragment) に CursorAdapter(Loaderを使うときCursorは定義しない=null) *リスト行表示レイアウト、取得するDBカラム、表示するレイアウトフィールドを指定する を連携させてリストに表示する *非同期でデータ取得する場合はCursorLoaderと連携する *配列のデータをリスト表示するときはArrayAdapter<T>を使う CursorLoader(Cursorを定義する) で別スレッドでコンテントプロバイダをとおしてデータベースアクセスして、アダプターに完了通知する *コンテントプロバイダの指定、取得するDBカラム、抽出条件(sql文のwhere句)を指定する ↓ Content Provider(コンテントプロバイダ) Androidmanifest.xmlにprovider定義しておく ↓ SQLiteDatabase |
| 画面遷移(画面表示) | pushViewController, presentModalViewController | startActivity() |
| viewController間の値の受け渡し | allocしたインスタンスのインスタンス変数に値をセットしてから表示(pushViewController etc.)する。 protocol定義のdelegateメソッド引数にセットして呼び出す。 |
Intentのdata,extrasにセットしてstartActivity()する。 |
| 画面閉じる(非表示) | dismissModalViewController dismissPopOver とか |
Activity#finish() |
| Controller - NSManagedObjectContext - CoreDataModel | Controller -> Bean -> DTO <- DAO (sql)-> DB(Entity定義) *Bean:画面UIのためのデータを扱う DTO : テーブル操作のためのデータを扱う |
|
| クラス定義(継承) | .h |
.java |
| クラス実装 | .m |
定義と実装は同じファイル(.java)で行う |
| クラス規約定義 (クラスが持つべき型みたいなもの) |
@protocol protocolName <NSObject> | interface interfaceName |
| C++ | .h クラス定義 |
accessLevelはsuperクラスのpublicメンバの扱いを定義する |
| コールバック | Delegate (デリゲート) | Interface (インタフェース) Listener (リスナー) |
| デリゲート(リスナー)機能実装 | |
インターフェースを宣言して
コールバッククラスを定義して
クラスにメソッドを実装する |
インナークラスで実装することもできる *インターフェース宣言(implements)はしなくてよい *1箇所への記述だけでよいため手軽だが分かりにくくなる恐れあり |
||
| クラスのインスタンスが持つ変数 | インスタンス変数 | プロパティ、フィールド、メンバ変数 などいろんな呼称がある |
| インスタンス変数の初期化 | initとかのコンストラクタで行う | クラス定義で初期値を設定できる |
| インスタンス変数使用方法 | _iVarName = someOne; // setterは走らない // retainカウント増えない self.iVarName = someOne; // setterが実行される // retainカウント増える |
iVarName = someOne; this.iVarName = someOne; // 全く同じ意味 |
| ObjectiveCの@property指定方法 | 何も指定しないと、 クラス変数デフォルト(atomic, strong) プリミティブ変数(intなど)のデフォルト(atomic, assign) strong // このクラスで管理するインスタンス変数 weak // 他クラスで管理しているインスタンスを参照するためのインスタンス変数 nonatomic // 非スレッドセーフ(通常この指定) |
|
| デバッグ時だけログ出力 | #ifdef DEBUG |
|
| クラス変数 | クラス変数なし *クラスメソッドを経由してクラス変数のように扱いたい変数を操作する |
static type variableName |
| コンストラクタ | |
クラス名と同じ名前のメソッド |
| デストラクタ | |
Javaの言語としてのデストラクタはない androidライフサイクルとしてのデストラクタ |
| C++ | |
|
|
||
| 定数(literal) | |
|
|
|
|
| 変数(valiable) | aValiable | aVariable |
| クラスのインスタンス変数 | |
|
| アクセスレベル(スコープ)デフォルト | 継承クラス内(protected) | パッケージ内 |
| C++ | クラス内(private) | |
| アプリケーション間連携(カスタムURLスキーマ、カスタムアクション) | カスタムURLスキーマ
ドキュメントを受け渡し
|
カスタムアクションで暗黙的Intent(外部インテント) を発行 <渡すほうのアプリケーション> <受取るほうのアプリケーション> manifestでactivityのintent-filterでカスタムアクションを定義する |
| メール連携 | アプリケーション内からメールの編集送信ができる MFMailComposeViewController |
アプリケーション内でのメール送信はできないのでメールソフトを起動する 暗黙的Intentを発行 |
| SNS連携(Twitter, Facebook) | twitter iOS6以降 Social Framework iOS5 Twitter Framework facebook sdk *twitter,facebookとも設定アプリケーションからログインできる |
twitter Google+のためか、twitterからもGoogleからもsdkは出ていない サードパティのTwitter4Jライブラリを使ってtwitterWebAPIを利用する facebook sdk |
| サーバからアプリケーションへのプッシュ通知(リモート通知) | RemoteNotification 証明書と鍵をサーバーに置く→アプリケーションがデバイストークンを取得→アプリケーションからデバイストークンをサーバに送信→サーバは(APNS)Apple Push Notification Serviceに通知をプッシュ→APNSからアプリケーション(デバイス)に通知送信 文字列で通知する 通知形式は設定アプリケーションでユーザが決定する |
GCM(Google Cloud Messaging for Android) 通知形式はアプリケーションが決定する |
| ローカル通知(アプリケーションがローカルデバイスに対して通知する) | UILocalNotification 通知はOSが受け取り表示する 文字列で通知する 通知形式は設定アプリケーションでユーザが決定する |
AlarmManager 指定時間後にブロードキャストインテント発行 PendingIntent BroadcastReceiver ブロードキャストインテント受信 NotificationManager ステイタスバーに通知を表示 PendingIntent(文字列)で通知する 通知形式はアプリケーションが決定する |
| plist - CFBundleURLTypes, CFBundleDocumentTypes | AndroidManifest - intent-filter | |
| UIGestureRegognizer | GestureDitector | |
|
|
|
| CoreGraphics | Canvas | |
| CoreGraphics | 座標 (Coordinate) 左下が原点(変更可能)
座標系変更方法 // 原点のy座標を移動 ○:原点 CoreGraphics (CG**) ^ | | | ○-------->
UIKit (UI**)、UIView#drawRect:内 ○--------> | | | V
* UIView#drawRect: 内では左上が原点になるようにあらかじめframeworkが座標系を変更している
回転方向 右回り * CGContextScaleCTM(context, 1.0, -1.0); // Y座標ベクトルを反転 で変更すると、左回りになる
画像(png, jpeg)のレンダリング CoreGraphics (CG**) 標準は左下が描画の原点なのでCGContextDrawImage() すると画像が逆立ちに描画される |
|
| OpenGL | OpenGLES(C++) | OpenGLES(Java or C++(JNI, NativeActivity)) |
| EAGLView(CAEAGLLayer) | GLSurfaceView (Java, JNI) | |
| layoutSubview | onSurfaceChanged | |
| シェーダとは(プログラム・シェーダの書き方) | ||
| OpenGLES2.0の概念と捉え方 | NativeActivity (C++) | |
| C++を実行する方法 | モジュールのファイルタイプを .mm にするだけ。 |
Javaというフレームワーク(言語)はそのプログラム実行速度がとても遅いので、しばしばCやC++を使う必要性が生ずる。 |
| UI座標 | 左上が原点 | 左上が原点 |
| CoreGraphicsは左下が原点(変更可能) | ||
| OpenGLは左下or中央が原点 (変更可能) | ||
| OpenGL関数 | GL10 gl.xxx | |
| GL関数を呼び出す | GLSurfaceViewにわたされるGL10(GL20)インスタンスのラッパーメソッド(gl.openGlfunctionName)を呼び出す | |
| glViewport() | gl.glViewport() * in onDrawFrame() | |
| 描画バッファにいつでも頂点を追加できる | onDrawメソッドで描画しなければならない(surfaceView使用時)*毎回全ての頂点を描画 | |
| AndroidのsurfaceViewでsetDebugFlagsでデバッグモードにすると例外が発生してしまう | ||
| 配列 | |
|
| ポインタ(参照、エイリアス、アドレスポインタ) | 基本データ型
オブジェクト オブジェクトはすべてポインタ |
基本データ型
オブジェクト オブジェクトはすべてポインタ |
| C(Objective-C)とJavaのポインタのコンセプトの違い ポインタとはコンピュータ(CPU)の仮想アドレス空間上のメモリアドレスをポイントする変数のことです。 Cのポインタ変数はメモリアドレスをメモリ上に保持することができるし、それを四則演算することもできる。 対して、Javaのポインタ(参照渡しされた変数)はメモリアドレスをメモリ上に保持していないし、それを四則演算することができない。 要するに、Javaは使う人にコンピュータハードウェアの知識を求めていないのです。コンピュータに詳しくない人でもプログラムが作れるようにと言うSun MicroSystemsの配慮です。 それ以外は、C言語のポインタとJavaの参照は全く同じ概念です。 |
||
| ポインタ表現 | ポインタ *variable |
配列にする |
| クラス配列の使い方 | [C++] |
|
| リソースファイル読み出し | |
R.idを指定するだけ |
| Assetファイルのファイル・コピー | NSFileManager#copyItemAtURL を呼ぶだけ | InputStream#read して
*FileChannel#transferTo というメソッドもあるが、Assetファイル(AssetManager)などをパスに変換するメソッドが用意されていないため使えない。 |
| UI操作はメインスレッドで行う |
|
|
| 非同期実行 | iOSはGCDのおかげでサブスレッド作成実行が簡単 |
androidのサブスレッド作成実行手続きはiOSに比べて複雑
or AsyncTask を継承してインナークラスを作る そして、非同期実行する
or
or |
| 非同期ネットワーク通信(XML取得など) | |
|
| リソースフォルダ | 好きな名称にしてよい | projectRoot/app/src/main/res/ projectRoot/app/src/main/assets/
htmlファイルなどはres/rawでもassetsにも保存することができるが、アクセス方法が異なる。 |
| 画像フォーマット | png | png |
| サウンドフォーマット | caf, mp3, wav | ogg, mp3, wav |
| アプリケーションアイコン(ランチャーアイコン)サイズ | Asset Catalog で指定 icon.png 72x72 icon@2.png 144x144 (retina) *iPhone, iPad共通 |
48dp mdpi:48dp(x1.0) *dp hdpi:72dpi(x1.5) xhdpi:96dpi(x2.0) xxhdpi:144dpi(x3.0) xxxhdpi:192dpi(x4.0) |
| アプリケーション起動時に前回終了状態復元 | NSUserDefault に保存して、アプリケーション起動時に読み出す UIStateRestoration(iOS6以降) |
SharedPreferences に保存して、アプリケーション起動時に読み出す |
| 画面回転時に行うこと | アプリケーションのメモリ内の状態は保持されるので、何もしなくてよい。
が呼ばれる |
アプリケーションのメモリ内の状態は保持されないので、保存復元をアプリケーションで行う必要がある。 |
| static変数(ヒープ領域にメモリ領域を確保する) | メソッド中に定義できる | クラスメンバ変数として定義する |
| nill | null | |
| UIEvent | MotionEvent | |
| 使用するクラスは #import または @class して使う | パッケージ内のクラスは定義する必要なく使える | |
| bundleID | packageName | |
| CGPoint | ポイント座標の構造体がない | |
| touchBigan, Move, Endを別メソッドで受け取る | onTouchEventメソッドですべて受け取る | |
| typedef | 型定義の機能がない | |
| ポイント座標のY軸をgl->cocoa変換する | 変換しなくてよい(android座標で取得される) | |
| bool | boolean | |
| 配列初期化 | |
type[] var = new type[10]; |
| NSFileManager | File (ContentWrapperを継承したクラスで使う) | |
| エンディアン | little-endian | little-endian(nexsus7 native) x big-endian (JVMの使用で) |
| オリエンテーション取得 | |
this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT |
| オリエンテーションイベント取得 | UIViewController#viewWillTransitionToSize: withTransitionCoordinator: iOS7まで willRotateFromInterfaceOrientation: didRotateFromInterfaceOrientation: |
manifestに Activity android:configChanges="orientation|keyboardHidden"すると onConfigurationChanged()が呼ばれる |
| 座標とピクセル値対応 | scalefactor 1.0, 2.0(retina) |
|
| テーブル(リスト)表示管理 | UITableViewController | ListActivity ListFragment *テーブルUI+表示データの管理 |
| セクション(グループ)数 | |
|
| セクション・ヘッダー表示 | |
|
| テーブル(リスト)表示内容設定 | |
|
| ビューとウィジェット | UITabView | ActionBarActivity (旧TabHost, TabActivity) |
| UIRadioButton | RadioButton | |
| UITextView | TextView | |
| CheckBox | ||
| コレクション(配列) | |
List<ObjectType> vName = new ArrayList<ObjectType>(); // 空の配列 List<ObjectType> vName = Arrays.asList("value1", "value2", "value3"); // 配列の初期化 |
| コレクション(連想配列) | |
|
| 画面構成デザイン | ||
| ステイタスバー | ステイタスバー Status Bar | |
| ホームボタン/ナビゲーションバー | ハードウェア シングル、ダブルタップ、長押しに対応 アプリケーション終了、タスク一覧、切り替え、音声入力 |
OSにより画面下部に自動表示される3つのアイコン アプリケーション終了、タスク一覧、切り替え *ソフトボタンならアプリケーションで表示制御や無効にできる *現行モデルではハードウェアボタン(4つも)はない ナビゲーションバー Navigation Bar |
| ナビゲーションバー/アクションバー (メニューボタン) |
UToolBar, UINavigationBar 画面上部に表示する |
ActionBar SDK10以下:画面下のメニューボタン押下で画面下にタイル表示される |
| アプリケーション画面で使用する標準アイコンサイズ | 32dp (normal:32dpi, retina:64dpi) *iPhone, iPad共通 |
32dp(24dp) ldpi:19dpi(x0.75) mdpi:25dpi(x1.0) *dp hdpi:38dpi(x1.5) xhdpi:51dpi(x2.0) xxhdpi:96dpi(x3.0) *本来だと75dpiだがxxxhdpiと共用化しているため? xxxhdpi:96dpi(x4.0) *frameworkで実際に使っているアイコンサイズ *iOS用アイコンはサイズ変更せずにそのまま使える |
| ナビゲーションバーボタンはステータスごとにアイコンを定義できる(タップされたときなど) | アクションバーボタンをタップしたときにハイライトするなどはできない。背景色がかわるだけ。 | |
| タブバー | 画面下に表示 UITabBarController |
画面上に表示 *画面下にはナビゲーションバーがあるためと思われる ActionBarActivity (旧TabHost, TabActivity) |
| メソッド・オーバーライド | 普通にsuperClassやプロパティのメソッドを再定義すればOK | |
| いろいろ使うAppDelegateやMainActivityの求め方 | |
MainActivityのonCreateでGlobalクラスのクラス変数に保存しておく *所属するFragmentやView以外からは求めるしくみは用意されていない |
| FragmentからActivityの求め方 | |
|
| ViewからActivityの求め方 | |
|
| 変数型(データ型) | 変数型を見ただけで何に使われる変数かが分かる。 ex. UIDeviceOrientation orientation |
Java標準のデータ型しかない。 ex. int orientation *Javaにはプリプロセッサー(#define)やtypedefが無いため |
| タッチイベント | viewのtouchesEnd: でイベントを受け取る | |
| サウンド再生 | AVAudioPlayer |
MediaPlayer 再生時に読み込む BGMなどに使用 SoundPool メモリ上に常駐 SEに使用 |
|
|
|
| 配列領域確保 | |
|
| 三角関数 | |
|
| クラウド | iCloud | GoogleDrive |
| 国際化(文字定数、画面レイアウト) | 文字定数を国際化するとき |
文字定数を国際化するとき res/values-ja/strings.xmlに値を定義して getResources().getString(R.string.name)で呼び出す 画面ごとに国際化するとき res/layout-ja/activity_main.xml |
| 機種判定 | |
res/layout/activity_main.xml res/values/dimens.xml ↑と↓で画面サイズによって、レイアウトやパディング値を切り替える res/layout-w820dp/activity_main.xml res/values-w820dp/dimens.xml |
| OSバージョンチェック | |
|
| 文字列数値変換 | |
String text = Integer.toString(intVal); int intVal = Integer.parseInt(text); |
| 写真などの画像操作 | CGImage CGDataProvider CGContent (UIGraphics) |
Bitmap ByteBuffer (IntBuffer) Canvas |
iOSアプリケーションをAdHocで公開する方法 Xcode6.1の場合
iOSアプリケーションのビルドが通ってから新しいApple版テストフライトにアップするまで
SIMフリーのスマートフォンの中にはMacとUSB接続できないものがある
iOSのSizeClassとConstraintsはフラグメント化したiOSには欠かせないものとなった

