继承IntentService类来实现一个被启动类型的服务很简单,但是如果你需要服务执行多线程(而不是通过工作队列来处理启动请求),那么你就要继承Service类来处理每个Intent。
为便于比较,下面例子中,Service类的实现代码执行了与之前“继承IntentService类”一节中的例子相同的工作,也就是说,对于每个启动请求,它都会使用一个工作线程来执行工作,并且每次只处理一个请求。
public class HelloService extends Service {
private Looper mServiceLooper;
private ServiceHandler mServiceHandler;
// Handler that receives messages from the thread
private final class ServiceHandler extends Handler {
public ServiceHandler(Looper looper) {
super(looper);
}
@Override
public void handleMessage(Message msg) {
// Normally we would do some work here, like download a file.
// For our sample, we just sleep for 5 seconds.
long endTime = System.currentTimeMillis() + 5*1000;
while (System.currentTimeMillis() < endTime) {
synchronized (this) {
try {
wait(endTime - System.currentTimeMillis());
} catch (Exception e) {
}
}
}
// Stop the service using the startId, so that we don't stop
// the service in the middle of handling another job
stopSelf(msg.arg1);
}
}
@Override
public void onCreate() {
// Start up the thread running the service. Note that we create a
// separate thread because the service normally runs in the process's
// main thread, which we don't want to block. We also make it
// background priority so CPU-intensive work will not disrupt our UI.
HandlerThread thread = new HandlerThread("ServiceStartArguments",
Process.THREAD_PRIORITY_BACKGROUND);
thread.start();
// Get the HandlerThread's Looper and use it for our Handler
mServiceLooper = thread.getLooper();
mServiceHandler = new ServiceHandler(mServiceLooper);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Toast.makeText(this, "service starting", Toast.LENGTH_SHORT).show();
// For each start request, send a message to start a job and deliver the
// start ID so we know which request we're stopping when we finish the job
Message msg = mServiceHandler.obtainMessage();
msg.arg1 = startId;
mServiceHandler.sendMessage(msg);
// If we get killed, after returning from here, restart
return START_STICKY;
}
@Override
public IBinder onBind(Intent intent) {
// We don't provide binding, so return null
return null;
}
@Override
public void onDestroy() {
Toast.makeText(this, "service done", Toast.LENGTH_SHORT).show();
}
}
正如你看到的,它要比继承IntentService类多做很多工作。
但是,因为你自己处理每个onStartCommand()方法的调用,你就能够同时执行多个请求。在上面的例子中没有这么做,但是如果你想要这么做的话,那么你就能够给每个请求创建一个新的线程,并且立即运行它们(而不是等待前一个请求完成)。
注意:onStartCommand()方法必须返回一个整数,这个整数是一个描述了在系统的杀死事件中,系统应该如何继续这个服务的值(虽然你能够修改这个值,但是IntentService处理还是为你提供了默认实现)。从onStartCommand()方法中返回的值必须是以下常量:
START_NOT_STICKY
如果系统在onStartCommand()方法返回之后杀死这个服务,那么直到接受到新的Intent对象,这个服务才会被重新创建。这是最安全的选项,用来避免在不需要的时候运行你的服务。
START_STICKY
如果系统在onStartCommand()返回后杀死了这个服务,系统就会重新创建这个服务并且调用onStartCommand()方法,但是它不会重新传递最后的Intent对象,系统会用一个null的Intent对象来调用onStartCommand()方法,在这个情况下,除非有一些被发送的Intent对象在等待启动服务。这适用于不执行命令的媒体播放器(或类似的服务),它只是无限期的运行着并等待工作的到来。
START_REDELIVER_INTENT
如果系统在onStartCommand()方法返回后,系统就会重新创建了这个服务,并且用发送给这个服务的最后的Intent对象调用了onStartCommand()方法。任意等待中的Intent对象会依次被发送。这适用于那些应该立即恢复正在执行的工作的服务,如下载文件。
注:本人转载系个人觉得翻译的很好,值得收藏,且自己回头看着方便。
如有兴趣请访问作者官方博客http://blog.csdn.net/FireOfStar
分享到:
相关推荐
DaemonService Android端心跳服务与进程保活 使用 继承AbsHeartBeatService抽象心跳服务,在onHeartBeat()中处理自己的任务,具体保活策略不需要关心 public class HeartBeatService extends AbsHeartBeatService { ...
android service 简单实例代码 . binder继承一个接口,实现方法。
BleLib BleLib 是 Android 低功耗蓝牙 4.0 及以上开发的辅助库,一行代码解决 Ble 初始化、扫描、连接、特性读写、设置通知等操作。 BleLib 中的关键类: ...BleLib 中的 Ble 继承了 Service,因此建议绑定服务进
Android service类的应用及源码例子,通过Android service类创建一个音乐服务模块,演示service类的创建、启动和方法使用,以及Service生命周期的说明,该例子继承service 然后重写onStart播放音乐 重写onDestry停止...
只需要在service包中建立一个继承抽象类ActionService的类。重写和实现里面的方法。 同时也对应着json字符串转对象的方法,或者不转对象,直接返回字符串。把类名作为字符串的action发给js端,把参数对象的格式也...
----------------------------------- Android 编程基础 1 封面----------------------------------- Android 编程基础 2 开放手机联盟 --Open --Open --Open --Open Handset Handset Handset Handset Alliance ...
9、activity代理实现后,其他组件,如service等,如法炮制即可。 10、插件编译问题。 如果插件和宿主共享依赖库,那边编译插件的时候不可将共享库编译到插件当中,包括共享库的代码以及R文件,但是需要在...
后台播放创建一个类继承service方法,在该类中使其具有播放暂 停下一首上一首的功能的方法,从而是它在各个Activity之间进行跳转的时候为其他的 类提供相应的方法。创建一个新建文件类和过滤文件信息的类,用以存贮...
用AndroidStudio编写,里面的Activity有三个按钮,用startService函数分别启动三个服务,一 个是通过继承Service类实现的服务,一个是通过继承Service类在里面定义一个线程来处理服务,还有一个是通过继承...
1、使用Service需要在Android Manifest.xml文件中注册Service,如下代码:新建一个普通的class,然后继承Service,那么需
本文实例讲述了Android...定义一个Service比较简单,只要继承Service类,实现其生命周期的方法即可。一个定义好的Service必须在AndroidManifest.xml文件中通过<service>声明才能使用 <service android:name=MyService>
本文实例为大家分享了Android Service实现自动更换...首先定义ChangeService类,继承Service访问系统实现壁纸切换 public class ChangeService extends Service { int[] wallpapers = new int[]{ R.drawable.a2, R.
Android Service类与生命周期 Service是Android四大组件与Activity最...第1步:定义子类,继承Service 第2步:在AndroidManifest.xml文件中配置Service (2)创建Service public class MyService extends Service {
Service和Activity之间通信,新建一个MyBinder类,继承Binder, new ServiceConnection();回调onServiceConnected
安卓的service的创建和调用其实和activity基本上一个样,很简单,只是继承Service类,在里面写一个onStartCommand方法,然后在该方法下写自己的代码就可以了。
Android中已经定义了一个 ‘Service’类,所有其他的Service都继承于该类。Service类中定义了一系列的生命周期相关的方法,如: onCreate(), onStart(), onDestroy()。参见下例: package ...
运行机制handler机制时序图handler机制UML类图应用框架相关四大组件Activity的生命周期Activity间的数据交互Fragment的声明周期service的生命周期UI相关View中widgets相关类的继承关系Android事件分发机制Android...
Android中的sercice分为本地服务和远程服务: ...(需要将代理接口.java扩展名改为.aidl,继承接口的实现类Stub),另外需要将远程服务中的aidl包名和文件拷贝到本地应用程序的工程中。 远程服务调用的Demo见附件。
在Android中,Activity主要负责前台页面的展示,Service主要负责需要长期运行的任务,所以在我们实际开发中,就会常常遇到Activity与Service之间的通信,我们一般在Activity中启动后台Service,通过Intent来启动,...
android项目之aidl跨进程调用举例Demo,开发aidl跨进程调用,主要分以下步骤: ...4. 向客户端公开接口-如果是编写服务,应该继承Service并且重载Service.onBind(Intent) 以返回实现了接口的对象实例