作者LaPass (LaPass)
看板AndroidDev
標題Re: [問題] IntentService怎麼用?
時間Thu Apr 26 23:54:15 2012
※ 引述《yauhh (喲)》之銘言:
: 我想做比較穩定的即時service,
: 基本上不需要service長期運作,只要想要的時候可以叫得醒service就好,
: 然後,一旦派送工作到service,最好service可以運作到工作完成.
: 就算app關掉了,已經送上service的工作也要繼續完成.
: 聽說IntentService可以管理一些thread,我頗心動,就將舊程式模型修改
: 為IntentService.
: 舊程式是啟動app時會啟動service,然後可以即時bindService把工作派上去.
: bindService時有開partial wake lock和wifi lock,然後service會啟動AsyncTask,
: AsynTask中也開wake lock和wifi lock (使用service context).
: 如果有一百個工作,就會發送一百個AsyncTask;這些AsyncTask共搶一個lock.
: 運作起來,如果app還開著時都會運作,而如果app關掉,就看情況,通常是大批工作
: 的後面一大段AsyncTask-s都不見. 我猜是因為當時service已經結束.
: 修改為IntentService的方式,我查了手冊及例子,覺得好像是把
: ... extends Service {
: 改成
: ... extends IntentService {
: 這樣是基本. 接著看到的例子說,要啟動就是丟資料到intent然後用startService
: 方式派上去,但我看這樣應該是只有IntentService啟動時會onHandleIntent吧?
: 另外,應該也是照樣使用bindService. 整體來說,我舊程式改成新程式就是
: 把Service改成IntentService而已.
: 後來測試新程式的運作情況,覺得好像與舊程式很接近. 也對,其實就是沒改過.
: 那請問IntentService怎麼用可以做到本文第一段所說的需求呢?
東西太多了,直接打
Activity跟Service的溝通方式,至少有兩種
簡單一點的,就是在啟動、呼叫service時,丟個Intent過去
我記得在官方文件那邊有個生命周期... 有本看過的書上也看過
就是server已經在運作時,android會去呼叫另一個方法
那個方法就能接受intent,去取得資料
另外
Lock lock = new Rrealatylock(); //忘了那個lock怎麼拼
public void ononHandleIntent()
{
lock.lock(); //這樣就可以確保這個service不會被android砍掉
//我通常會在這裡面寫個迴圈,每個幾秒或是幾分鐘去檢查運作正不正常
//直到這個service該結束掉時,才lock.unlock();把這個地方給結束掉
}
另外一種方法是複寫service的 onBind()方法
在activty中用bindService()
不知道有沒有拼對.... 按alt+/他會自己跳出來,我懶得記
在這個方法中需要有個callback物件當參數 (S...C....什麼的)
在service跟activity連上時,會呼叫那個callback中的onBindService
在那裏會收到Service中的IBinder
這樣一來,就能在activity中去呼叫service的方法
service跟activity連結的簡單範例大概會像這樣:
interface MyServiceAct
{
int getX();
}
//=====================================
public MyService extant Service
{
int i = 1000;
public class MyBinder extant Binder implement MyServiceAct
{
public int getX();
{
return i;
}
}
public onBind(....)
{
return new MyBinder();
}
.......
}
//===================================
Activity 就這樣用
class Sc implement S....C....
{
public onBindService(IBinder binder, .....)
{
MyServiceAct msa = (MyServiceAct)binder;
msa.getX(); //從activity中取得service中的i
}
public onUnBindService(.....)
{
.......
}
}
startService(.....);
bindService(.... new Sc()....);
//====================================
完蛋了,我沒有IDE就不會寫程式了... orz....
抱歉,因為現在沒有eclipse,所以很多東西都記得不清楚
但差不多就是這樣
--
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 125.233.154.127
※ 編輯: LaPass 來自: 125.233.154.127 (04/26 23:56)
※ 編輯: LaPass 來自: 125.233.154.127 (04/27 00:03)
推 yauhh:謝謝,這像是起碼有個手畫地圖,看起來很有方向感 04/27 06:53
推 gpc:現在寫native或jni也是沒IDE可用...XD 04/27 10:32
→ LaPass:沒應向 那部分我是邊試邊寫出來的 04/30 13:56