日本Androidの会の資料
Upcoming SlideShare
Loading in...5
×

Like this? Share it with your network

Share
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
    Be the first to like this
No Downloads

Views

Total Views
1,849
On Slideshare
1,849
From Embeds
0
Number of Embeds
0

Actions

Shares
Downloads
3
Comments
0
Likes
0

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. Android : Service 小山 圭
  • 2. Agenda
    • Service とは何でしょう?
    • 最も簡単な Service
    • Notification
    • Callback
    • まとめ
  • 3. Android の Service
    • from Anatomy of an Android Application
      • A Service is code that is long-lived and runs without a UI.
      • UI が無い長生きするコード
      • Activity と違いフロントに表示されなくても実行
        • つまり常駐して実行を続けられる
      • 音楽の再生などに用います
  • 4. Service の実体
    • android.app.Service
    • Activity と同じく Context を継承
    • Task の 1 要素
    • サービスの実装は Service を継承
    • Context#startService() で起動
    • bindService() で起動中のサービスに接続、起動していなければ起動
    • stopService() にて停止
  • 5. Intent
    • Service も Intent をキーに起動します
    • Service を止めるキーも Intent です
    • 設定により他の Activity に公開可能
    • Intent は江川さんにおまかせします ><
  • 6. Service のライフタイム
    • 基本は start されてから stop されるまで
    • システムがメモリ状況により殺す場合有り
      • ただし殺害対象の優先順位は低い
    • bind している client が複数いる間は stop しても止まらない
  • 7. <service>
    • AndroidMenifest.xml にタグの記述が必要
      • 例 )
        • <service android:name= &quot;.PlayerService&quot; />
    • process 属性
      • この属性値に名前を付けると remote
      • local: 起動した Activitiy と同じプロセス
      • remote: 新しいプロセス
    • 細粒度のセキュリティ設定が可能
  • 8. ハンズオン
  • 9. 流れ
    • SD カードイメージを作る
    • エミュレータを SD カードをマウントして起動
    • 単純なプレーヤ
    • 単純なサービス
    • 単純な Notification
  • 10. PATH の設定
    • Linux, Mac OS X, Cygwin
      • cd $ANDROID_HOME/tools
      • PATH=$PATH:$PWD
    • Windows
      • cd %ANDROID_HOME% ools
      • path %path%;%cd%
  • 11. SD カードイメージを作る
    • mksdcard <size> <file>
      • サイズは K と M が指定可
        • 例 ) 128M, 16K
      • ファイルの拡張子は自動で付きません
      • エミュレータは 8M 以下の SD カードを使えません
      • 例 ) サイズ 1G バイトでファイル名が” 1G.img”
        • mksdcard 1024M 1G.img
  • 12. エミュレータを起動
    • SD カードをマウントして起動する
    • 例 ) ファイル名” 1G.img” のイメージを使用
      • emulator –sdcard 1G.img
    • Eclipse では起動オプションに入れられる
  • 13. mp3 を SD カードにコピー
    • adb push <local> <remote>
    • SD カードは /sdcard にマウントされます
      • 例 ) SD カードに全ての mp3 をコピー
        • adb push *.mp3 /sdcard
    • adb shell にて確認
      • adb shell で Linux の sh が起動します
      • cd /sdcard
      • ls –l
    • mp3 がない場合、
      • /system/media/audio/ringtones
  • 14. MediaScanner を起動
    • MediaScanner により DB の更新
      • メディアファイルの情報が DB 化
      • ホーム画面より
        • DevTools->Media Scanner
    • DB は sqlite3 形式
      • /data/data/com.android.providers.media/databases/external-label.db
      • SDK は sqlite3 が /system/xbin にあります
  • 15. 最も単純な Player
    • public class SimplePlayer extends Activity {
    • public void onCreate(Bundle savedInstanceState) {
    • super .onCreate(savedInstanceState);
    • Button b = new Button( this );
    • b.setText(&quot;Play&quot;);
    • b.setOnClickListener( new OnClickListener() {
    • public void onClick(View v) {
    • MediaPlayer mp = new MediaPlayer();
    • try {
    • mp.setDataSource(&quot;/sdcard/CrazyDream.ogg&quot;);
    • mp.prepare();
    • mp.start();
    • } catch (Exception e) {
    • throw new RuntimeException(e);
    • }
    • }
    • });
    • setContentView(b);
    • }
    • }
    演奏中にバックボタンを押すことで演奏が停止することを確認
  • 16. 最も単純なサービス
    • Activity は Service を起動、終了するだけ
    • 詳細はソースで
  • 17. 高度なサービス
  • 18. 高度なサービス
    • サービスを実行するだけでは足りない
    • サービスに処理対象や処理内容を依頼したい
    • サービスと通信する必要がある
  • 19. IPC
    • Interprocess Communication
    • Activity と Service は別プロセスの場合有
      • 直で呼べるとは限らない
      • pipe? socket? 共有メモリ ?
    • プロセス間通信手段の抽象化が必要
      • リモートでもローカルでも同じ手段で通信したい
  • 20. AIDL (1/2)
    • Android Interface Definition Language
    • Activity と Service 間の Interface を定義
      • IDL は昔からあります
        • CORBA
    • Java の Interface とほぼ同じです
      • 違いは引数に方向性があります
    • Interface を用いて通常の OOP が可能です
      • 接続手続は非常に面倒です
      • 一旦繋がればそれはただのインスタンス
  • 21. AIDL(2/2)
    • 拡張子 “ .aidl”
    • Eclipse ではファイル作成で行う
      • 保存すると即時で java にコンパイルされる
    • CUI では aidl
    • 方向の記述は in,out,inout
    • 実装の実際は document の AIDL を
  • 22. Stub
    • AIDL をコンパイルした java に存在
    • 呼び出される側が継承して概念としてのサービスを実装
      • 例 ) 指定された曲を演奏する
    • 呼び出す側は Interface として呼出に利用
  • 23. Callback
    • Activity が Service に依頼するだけでは足りない
    • Service が Activity に依頼する場合がある
      • 例 ) 曲の再生が次に移った時に画面を更新
    • これを Callback と呼ぶ
    • 実装は AIDL を用いるので変わらない
    • ただし実装場所が反対になる
  • 24. Parcellable
    • Acitivity と Service で class を共有したい
    • 分散オブジェクト指向がしたい
    • Android は Java の Serializable を用いない
    • Parcellable を継承して自前でシリアライズ
    • 使ってません ><
  • 25. サービスの利用手順 startService(Bundle) bindService(ServiceConection) Interface.Stub.asInterface(IBinder) ServiceConnection.onConnect(IBinder) Service Service.registerCallback(Callback) Service.method() Callback.method() Activity Service サービスの利用 コールバックの利用 登録 取得 作成 / 実行 接続
  • 26. MP3Player 完成版の解説
  • 27. 注意点
    • サービスの必要性を良く考えよう
      • CPU とストレージは進化している
      • 電池は進化していない
      • Android は省電力を最も重視している
      • 本当に Service が必要か?
      • Intent で即時起動、即時終了で良い可能性は?
  • 28. まとめ
    • Service による常駐アプリ作成法を学んだ
    • AIDL を用いた IPC の方法を学んだ
    • 以下について大体理解した
      • MediaPlayer
      • Notification
      • ContentProvider
  • 29. 謝辞
    • アイコン提供
      • http://www.iconarchive.com/
    • 写真と MP3 の提供
      • http://www.niconicommons.jp/