Service與Activity

Download Report

Transcript Service與Activity

Service 與 Activity
●
Service 與 Activity 的差異
●
Service 的生命週期
●
Service 的寫法
●
Activity 與 Activity 、 Service 聯繫
Service 與 Activity 的差異
●
●
●
Activity 是前端的程式,放到背景就不會執行
Service 是背景執行的程式,像 Web Server 一樣,
會持續執行
權限檔案要加 AndroidManifest.xml
● <service android:name=".xxx" />
●
●
xxx 要跟 Service 的 class name 一樣
通常 Service 要搭配一個 Activity 來讓使用者控制其
運行
Service 的生命週期
●
●
●
Service 經過執行 Context.startService() 啟動 o
nCreate() ,然後呼叫 onStartCommand(Intent, i
nt, int)
Service 透過 Context.stopService() 或
stopSelf() 停止
當 Client( 通常是 Activity) 呼叫
Context.bindService() 時,如果 service 沒有執
行, service 就會被叫起來執行,但是僅會跑 o
nCreate() ,不會跑
onStartCommand(Intent, int, int)
Service 的寫法(一)
●
class 繼承 android.app.Service
●
把主要的程式放在 onStartCommand 中,回傳
●
●
START_STICKY 被異常 kill 之後會自動重啟
START_NOT_STICKY 被異常 kill 之後不自動重
啟
START_REDELIVER_INTENT 被異常 kill 重傳
intent 內容啟動
public int onStartCommand(Intent inte, int flag, int a)
{
●
Service 的寫法(二)
●
為了持續不斷背景執行,通常會開另外的
Thread ,並用 while (true) 配合 delay 運行
new Thread(){
public void run(){
while(true)
{
// 程式寫這裡
try {Thread.sleep(1000);} catch (InterruptedException e) {e.pr
intStackTrace();}
}
Service 的寫法(三)
●
●
Service 自己可以呼叫 stopSelf() 自己停止
由外面的 Activity 可以呼叫 stopService(new Int
ent(this, xxx.class)); 強制停止
●
但是 Service 內部如果還有持續運作的 Thread , S
ervice 將不會停止,此時可用 SharePreferences 等
方法去停止 Service 內部的 while(true) 迴圈
Activity 與 Activity 、 Service 聯繫
●
建議用 SharePreferences 或檔案即可
●
Activity 呼叫 Activity 可以用:
Intent i = new Intent(Intent.ACTION_SEND);
i.setType("message/rfc822");
i.putExtra(Intent.EXTRA_EMAIL , Email);
i.putExtra(Intent.EXTRA_SUBJECT, "Subject");
i.putExtra(Intent.EXTRA_TEXT , "Message......");
Context.startActivityForResult(Intent.createChooser(i, "Choose mail
client :"),1);
作業
●
寫個 Service 紀錄回家的路上 GPS 數字的變化
進入檔案,每秒鐘紀錄一次