Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
モバイルアプリの状態遷移を攻略したい!
2015/04/11(土) わんくま勉強会#東京96
@matatabi-ux
クロスプラットフォーム開発でライフサイクル対応
お や く そ く
掲載内容は個人の私見であり、
所属組織の見解ではありません
自己紹介: 黒柳 達士(@matatabi-ux)
• お仕事
⁃ 某第二工場で Windows ストアアプリ大量生産中
⁃ 拝承系 SIer → 安心簡単快適デザイン会社 → 現職
• 個人活動
Windows Platform Develo...
今回の目標とおことわり
• 目標
⁃ モバイルアプリでのライフサイクル管理の必要性を知ってもらう
⁃ Xamarin.Forms のライフサイクル対応の一例の紹介
• 注意事項
⁃ Xamarin や Xmarin.Forms 自体についての説...
おしながき
• モバイルアプリのライフサイクル管理の必要性
• 各プラットフォームの状態遷移
• クロスプラットフォーム開発でのライフサイクル管理
• まとめ
※ この発表資料は SlideShare で公開します
http://www.sli...
ライフサイクル
モバイルアプリのライフ
サイクル管理の必要性
モバイルアプリのライフサイクル管理の必要性
• いつ停止されるかわからない
⁃ モバイルアプリは場所を選ばずに利用される
⁃ ネットワーク接続の消失やバッテリー切れも日常的に起こる
⁃ ユーザーの都合で突然中断されることも ex.電車の待ち時間...
モバイルアプリのライフサイクル管理の必要性
• Windows UX ガイドライン
優れたユーザー エクスペリエンスを実現するには、アプリの実行が停止しなかったように見えること
が必要です。アプリではユーザーが入力したデータや設定の変更などを保...
モバイルアプリのライフサイクル管理の必要性
やるべきときに やるべきことを
適切な優先順で実行する
より厳密なアプリの
ライフサイクル管理が必要に
状態遷移
各プラットフォームの
状態遷移
Windows ストアアプリ / Phone 8.1 の状態遷移
Not running
Running
Suspended
Terminated
Foreground Background
Not running アプリが起動していない状態 ...
Windows Phone 8.0 の状態遷移
Not running
Running
Dormant
Tombstoned
Foreground Background
Not running アプリが起動していない状態 Running アプリ...
iOS アプリの状態遷移
Not running
Inactive
Active
Background Suspended
Foreground Background
Not running アプリが起動していない状態 Inactive ロック...
Android アプリ(1画面)の状態遷移
Starting Running
Paused
Stopped
Starting 画面生成中 Running 画面表示中 Stopped メモリ確保中で画面非表示
Paused 画面の非表示途中 De...
各プラットフォームの状態遷移
見事なまでにプラットフォーム
ごとにバラバラな状態遷移!
Xamarin.Forms
App Lifecycle
クロスプラットフォーム開発
でのライフサイクル管理
クロスプラットフォーム開発でのライフサイクル管理
Xamarin.Forms.Application で提供されるイベントハンドラ
呼び出されるタイミング
OnStart()
アプリケーションの起動時
ユーザーが明示的に終了した後に起動された場...
DEMO
Xamarin.Forms
App Lifecycle サンプル
※このデモのソースコードは GitHub で公開中
https://github.com/matatabi-ux/SupportLifecycle
クロスプラットフォーム開発でのライフサイクル管理
• 復元するためのデータの保存
⁃ 画面表示用のデータと、その他のアプリデータを分ける
⁃ いつ停止されるかわからないため、必要なデータは随時保存
⁃ 画面表示用は OnResume() で復元...
クロスプラットフォーム開発でのライフサイクル管理
• 自分でアプリデータを保存・復元するには?
• SQLite を利用する
参考:Xamarin.Android で SQLite を使う(かずきさんのブログ記事)
http://okazuki...
var folder = ApplicationData.Current.LocalFolder;
var file = await folder.GetFileAsync(“app-data.xml");
using (var stream ...
var folder = ApplicationData.Current.LocalFolder;
var file = await folder.GetItemAsync(“app-data.xml");
using (var stream ...
var folder = Environment.GetFolderPath(Environment.SpecialFolder.Personal);
var file = Path.Combine(folder, “app-data.xml"...
DEMO
Xamarin
データ保存・復元サンプル
※このデモのソースコードは GitHub で公開中
https://github.com/matatabi-ux/XamarinSessionRestore
まとめ
モバイルアプリで
ライフサイクル管理
まとめ
• モバイルアプリのためのライフサイクル管理
⁃ いつ停止されるかわからないため、アプリ状態に応じたデータ保存と復元処理が必要
⁃ 画面表示の状態などもできる限りデータ化し、必要に応じて退避・復元できるように
• クロスプラットフォーム...
Upcoming SlideShare
Loading in …5
×

モバイルアプリの状態遷移を攻略したい!

モバイルアプリの状態遷移を攻略したい!
~クロスプラットフォーム開発でライフサイクル対応~

Related Books

Free with a 30 day trial from Scribd

See all

Related Audiobooks

Free with a 30 day trial from Scribd

See all
  • Be the first to comment

モバイルアプリの状態遷移を攻略したい!

  1. 1. モバイルアプリの状態遷移を攻略したい! 2015/04/11(土) わんくま勉強会#東京96 @matatabi-ux クロスプラットフォーム開発でライフサイクル対応
  2. 2. お や く そ く 掲載内容は個人の私見であり、 所属組織の見解ではありません
  3. 3. 自己紹介: 黒柳 達士(@matatabi-ux) • お仕事 ⁃ 某第二工場で Windows ストアアプリ大量生産中 ⁃ 拝承系 SIer → 安心簡単快適デザイン会社 → 現職 • 個人活動 Windows Platform Development Jan 2015 ~ ⁃ Blog: 「しっぽを追いかけて」 http://matatabi-ux.hateblo.jp ⁃ facebook: https://www.facebook.com/tatsuj.kuroyanagi ⁃ 日本人間工学会 認定人間工学専門家 ⁃ 飼い猫写真も垂れ流し中 twitter: https://twitter.com/burst_cafemocha facebook: https://www.facebook.com/burst.cafemocha しっぽもふもふの自宅警備ネコ 「モカ」
  4. 4. 今回の目標とおことわり • 目標 ⁃ モバイルアプリでのライフサイクル管理の必要性を知ってもらう ⁃ Xamarin.Forms のライフサイクル対応の一例の紹介 • 注意事項 ⁃ Xamarin や Xmarin.Forms 自体についての説明は省いてます ⁃ Xamarin は現在進行形で進化中なので仕様が大きく変わるかも ⁃ できるかぎり Xamarin.Forms ワンソース解決を目指しました プラットフォーム個別記述より、対応が大雑把になるのは言うまでもなく・・・ ⁃ Xamarin.Forms for WinRT は出たばかりでまだ色々不足してます ※ 2015/03/21 現在
  5. 5. おしながき • モバイルアプリのライフサイクル管理の必要性 • 各プラットフォームの状態遷移 • クロスプラットフォーム開発でのライフサイクル管理 • まとめ ※ この発表資料は SlideShare で公開します http://www.slideshare.net/tatsujkuroyanagi/ss-46861384
  6. 6. ライフサイクル モバイルアプリのライフ サイクル管理の必要性
  7. 7. モバイルアプリのライフサイクル管理の必要性 • いつ停止されるかわからない ⁃ モバイルアプリは場所を選ばずに利用される ⁃ ネットワーク接続の消失やバッテリー切れも日常的に起こる ⁃ ユーザーの都合で突然中断されることも ex.電車の待ち時間にだけ利用 • バッテリー消費を抑えないといけない ⁃ 場所を選ばない=電源が有限 ⁃ できるかぎりバッテリーを消費しないような処理方式が必要 ⁃ 必要のないときにはアプリを停止するなどの工夫が必要
  8. 8. モバイルアプリのライフサイクル管理の必要性 • Windows UX ガイドライン 優れたユーザー エクスペリエンスを実現するには、アプリの実行が停止しなかったように見えること が必要です。アプリではユーザーが入力したデータや設定の変更などを保持する必要があります。 このため、アプリを中断する場合は Windows によって終了される場合に備えて、後で復元でき るようにアプリの状態を保存する必要があります。 • iOS ヒューマンインタフェイスガイドライン できるだけ早く、かつ妥当な頻度でユーザデータを保存する バックグラウンド状態のアプリケーションは、いつでも強制終了させられる可能性があるからです 停止時に現在の状態をできるだけ詳細なレベルまで保存する 次に同じアプリケーションを起動したとき、同じ状態から再開できるようにしてください たとえばデータの表示領域をスクロールしている場合、そのスクロール位置も保存します https://msdn.microsoft.com/ja-jp/library/windows/apps/hh986968.aspx#js_tut_state_diagram https://developer.apple.com/jp/documentation/UserExperience/Conceptual/MobileHIG/StartingStopping/StartingStopping.html#//apple_ref/doc/uid/TP40006556-CH52-SW3
  9. 9. モバイルアプリのライフサイクル管理の必要性 やるべきときに やるべきことを 適切な優先順で実行する より厳密なアプリの ライフサイクル管理が必要に
  10. 10. 状態遷移 各プラットフォームの 状態遷移
  11. 11. Windows ストアアプリ / Phone 8.1 の状態遷移 Not running Running Suspended Terminated Foreground Background Not running アプリが起動していない状態 Running アプリ利用中 Suspended メモリ確保中でアプリ停止 Terminated データを退避しメモリ解放 ファイルからデータを読み 遷移履歴・画面を復元! Low memory Activate Launch Suspending Launch ClosedByUser ファイルに データ保存
  12. 12. Windows Phone 8.0 の状態遷移 Not running Running Dormant Tombstoned Foreground Background Not running アプリが起動していない状態 Running アプリ利用中 Dormant メモリ確保中でアプリ停止 Tombstone データを退避しメモリ解放 画面表示は復元できる 遷移履歴までは復元できず Low memory Application_Activated Application_Activated Application_Deactivated Application_Launching Application_Closing メモリ解放
  13. 13. iOS アプリの状態遷移 Not running Inactive Active Background Suspended Foreground Background Not running アプリが起動していない状態 Inactive ロック状態などイベント無受信 Background バックグラウンド動作中 Active アプリ利用中 Suspended メモリ確保中でアプリ停止 5秒~ 10分後 次回の起動時間を短縮できる Low memory 永続も ある
  14. 14. Android アプリ(1画面)の状態遷移 Starting Running Paused Stopped Starting 画面生成中 Running 画面表示中 Stopped メモリ確保中で画面非表示 Paused 画面の非表示途中 Destroyed 画面の破棄 表示時間を短縮できる Low memory / Rotation Destroyed onPause() onResume() onResume() Low memory onDestroy() 回転しただけで破棄 される OS も! 画面ごとに 状態遷移
  15. 15. 各プラットフォームの状態遷移 見事なまでにプラットフォーム ごとにバラバラな状態遷移!
  16. 16. Xamarin.Forms App Lifecycle クロスプラットフォーム開発 でのライフサイクル管理
  17. 17. クロスプラットフォーム開発でのライフサイクル管理 Xamarin.Forms.Application で提供されるイベントハンドラ 呼び出されるタイミング OnStart() アプリケーションの起動時 ユーザーが明示的に終了した後に起動された場合に呼び出される OnSleep() アプリケーションの中断時 バックグラウンドに遷移する際に呼び出される OnResume() アプリケーションの再開時 バックグラウンドから復帰する際に呼び出される ※ 2015/03/21 時点では Windows ストアアプリ、Windows Phone 8.1 は非対応 Xamarin が 状態管理を 肩代わり!
  18. 18. DEMO Xamarin.Forms App Lifecycle サンプル ※このデモのソースコードは GitHub で公開中 https://github.com/matatabi-ux/SupportLifecycle
  19. 19. クロスプラットフォーム開発でのライフサイクル管理 • 復元するためのデータの保存 ⁃ 画面表示用のデータと、その他のアプリデータを分ける ⁃ いつ停止されるかわからないため、必要なデータは随時保存 ⁃ 画面表示用は OnResume() で復元、その他のアプリデータは OnStart() でも復元 • Xamarin.Forms が提供するデータ永続化機能 ⁃ Dictionary 型データストア Application.Properties ⁃ 値を代入すれば保存、参照すれば復元のシンプル機能 ⁃ Windows Phone 8.0 の場合アプリ起動時点でデータが復元されない模様 ※ 2015/03/21 現在の状況、そのためアプリデータ保存には利用できない 一般に必要な保持期間が異なるため ※画面表示用は一時保存、その他のアプリ データはほぼ永続化することが多い
  20. 20. クロスプラットフォーム開発でのライフサイクル管理 • 自分でアプリデータを保存・復元するには? • SQLite を利用する 参考:Xamarin.Android で SQLite を使う(かずきさんのブログ記事) http://okazuki.hatenablog.com/entry/2014/07/27/195015 • Serializer & File 入出力ライブラリで保存・復元する XmlSerializer と File 入出力ライブラリで保存・復元 ⁃ XmlSerializer は各プラットフォームごとにほぼ同じ使い方 ⁃ File 入出力ライブラリはプラットフォームごとに書き換えが必要
  21. 21. var folder = ApplicationData.Current.LocalFolder; var file = await folder.GetFileAsync(“app-data.xml"); using (var stream = await file.OpenSequentialReadAsync())) { var serializer = new XmlSerializer(data.GetType()); data = serializer.Deserialize(stream.AsStramForRead()); } file = await folder.CreateFileAsync(“app-data.xml“, CreationCollisionOption.ReplaceExisting); using (var stream = await file.OpenSequentialWriteAsync()) { var serializer = new XmlSerializer(data.GetType()); serializer.Serialize(stream, data); } Xamarin でアプリデータの保存と復元 ファイルからインスタンスをデシリアライズして復元 Windows ストアアプリ & Windows Phone 8.1 での読み書き インスタンスをシリアライズしてファイルに保存
  22. 22. var folder = ApplicationData.Current.LocalFolder; var file = await folder.GetItemAsync(“app-data.xml"); using (var stream = new StreamReader(file.Path)) { var serializer = new XmlSerializer(data.GetType()); data = serializer.Deserialize(stream); } file = await folder.CreateFileAsync(“app-data.xml“, CreationCollisionOption.ReplaceExisting); using (var stream = new StreamWriter(file.Path)) { var serializer = new XmlSerializer(data.GetType()); serializer.Serialize(stream, data); } Xamarin でアプリデータの保存と復元 Windows Phone 8.0 での読み書き ファイルからインスタンスをデシリアライズして復元 インスタンスをシリアライズしてファイルに保存
  23. 23. var folder = Environment.GetFolderPath(Environment.SpecialFolder.Personal); var file = Path.Combine(folder, “app-data.xml"); using (var stream = new StreamReader(file)) { var serializer = new XmlSerializer(data.GetType()); data = serializer.Deserialize(stream); } // file パスは同じ using (var stream = new StreamWriter(file)) { var serializer = new XmlSerializer(data.GetType()); serializer.Serialize(stream, data); } Xamarin でアプリデータの保存と復元 iOS & Android での読み書き ファイルからインスタンスをデシリアライズして復元 インスタンスをシリアライズしてファイルに保存
  24. 24. DEMO Xamarin データ保存・復元サンプル ※このデモのソースコードは GitHub で公開中 https://github.com/matatabi-ux/XamarinSessionRestore
  25. 25. まとめ モバイルアプリで ライフサイクル管理
  26. 26. まとめ • モバイルアプリのためのライフサイクル管理 ⁃ いつ停止されるかわからないため、アプリ状態に応じたデータ保存と復元処理が必要 ⁃ 画面表示の状態などもできる限りデータ化し、必要に応じて退避・復元できるように • クロスプラットフォームでのライフサイクル管理 ⁃ Xamarin.Forms App Lifecycle でアプリの状態監視が可能 ⁃ Xamarin.Forms Application.Properties でデータ永続化がかんたん ⁃ アプリが完全に終了した状態からのデータ復元には個別対応が必要

×