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