作者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)
1F:推 yauhh:谢谢,这像是起码有个手画地图,看起来很有方向感 04/27 06:53
2F:推 gpc:现在写native或jni也是没IDE可用...XD 04/27 10:32
5F:→ LaPass:没应向 那部分我是边试边写出来的 04/30 13:56