99网
您的当前位置:首页Android服务Service教程

Android服务Service教程

来源:99网
Android服务Service教程

⽬录

1、服务⽤途2、继承Service3、启动和停⽌服务4、⾃动启动服务前⾔:

Android的服务是开发Android应⽤程序的重要组成部分。不同于活动Activity,服务是在后台运⾏,服务没有接⼝,⽣命周期也与

活动Activity⾮常不同。通过使⽤服务我们可以实现⼀些后台操作,⽐如想从远程服务器加载⼀个⽹页等。服务能帮助我们在Android中实现多任务。

  我们已经知道,安卓的活动可以启动,停⽌,当系统资源太低时可以销毁,服务被设计为实现具有更长执⾏时间的任务。安卓的服务可以从活动Activity中启动,也可以从⼀个⼴播接收器和其他服务中启动。

  必须注意,使⽤服务并不需要⾃动创建新的线程,所以如果在服务中我们实现⼀个简单的逻辑,这不需要很长的时间去处理,我们其实不需要将它运⾏在单独的线程。但是如果我们要实现复杂的逻辑,⽤很长⼀段时间去处理,我们就必须采取创建⼀个新线程去执⾏,否则在主线程上运⾏服务,可能会导致ANR问题。

1、服务⽤途

服务适合两种⽤途:

实现多任务

激活 Inter-Process-Communication (IPC) 流程间通讯

第⼀种情况的典型的例⼦是: 需要从远程服务器下载数据,在这种情况下,我们可以让应⽤同时与⽤户进⾏交互,并在后台开始完成⼯作,⽽⽤户可以继续使⽤应⽤程序,当服务完成后发送⼀个消息给⽤户。

在第⼆种情况下,我们可以通过服务“共享”⼀些常⽤的功能,使不同的应⽤程序可以重⽤这些功能。例如,假设我们有⼀个发送电⼦邮件的服务,我们希望在⼏个应⽤程序共享此服务,这样不必重写相同的代码。在这种情况下,我们可以使⽤IPC使服务公开,这个服务向“远程”暴露接⼝,被其他应⽤程序调⽤。下⾯是⼀个简单的服务,继承Service。

2、继承Service

public class TestService extends Service { @Override

public IBinder onBind(Intent arg0) { return null; }}

服务是有⽣命周期的,可以实现其中⼀些回调⽅法:

public class TestService extends Service { @Override

public void onCreate() { super.onCreate(); }

@Override

public void onDestroy() { super.onDestroy(); }

@Override

public int onStartCommand(Intent intent, int flags, int startId) { return super.onStartCommand(intent, flags, startId); }

@Override

public IBinder onBind(Intent arg0) { return null; }}

  只有服务被创建时,⽅法onCreate才会被唯⼀的调⽤⼀次。如果该服务已在运⾏这个⽅法将不会被调⽤。我们也不是直接调⽤它,操作系统OS调⽤这个⽅法。

  OnStartCommand是最重要的⽅法,因为它被调⽤的时候,我们需要启动服务。在这个⽅法中,我们需要向我们运⾏的服务传递意图,这样我们就可以与服务交换⼀些信息。在这个⽅法中实现的逻辑可以直接在这个⽅法中被执⾏,如果执⾏很花费时间,我们就需要创建⼀个线程。正如你可以看到这个⽅法要求我们返回⼀个整数作为结果。此整数表⽰服务如何由操作系统来处理。

START_STICKY :使⽤这个返回值,如果OS杀死我们的服务,它会重新创建它,但是发往该服务的意图Intent不会再被传递,这种⽅式下服务总是在运⾏。

START_NOT_STICKY: 如果OS杀死服务,就不会再创建,直到客户端显式激活onStart 命令 START_REDELIVER_INTENT: 它类似 START_STICKY,意图也会被再传递给该服务。

OnDestroy是在服务销毁时由操作系统调⽤。

服务需要在Manifest.xml 中配置:

3、启动和停⽌服务

  正如我们所知道服务必须⾸先被启动,并在完成它的任务后最终停⽌。我们可以从活动Activity启动它,我们可以使⽤Intent传递给服务⼀些信息。假设我们有两个按钮,⼀个开始和⼀个停⽌服务.

btnStart.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

Intent i = new Intent(MainActivity.this, TestService.class); i.putExtra(\"name\ MainActivity.this.startService(i); }});

btnStop.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

Intent i = new Intent(MainActivity.this, TestService.class); MainActivity.this.stopService(i); }});

运⾏效果如下:

IntentService

  正如我们前⾯提到的服务运⾏在主线程,所以我们在本服务执⾏⼀些逻辑要⾮常⼩⼼。必须考虑到,如果这个逻辑是⼀个阻塞操作,或者需要较长的时间来完成,会导致⼀个ANR问题发⽣。在这种情况下,将逻辑转移到⼀个单独的线程,这意味

着我们必须在onStartCommand⽅法创建线程并运⾏它。还有另⼀类称为IntentService的衍⽣服务,可以简化这些操作。当我们不需要同时处理多个请求,这个类是有⽤的。这个类创建⼀个⼯作线程来处理不同的请求,功能如下:

创建⼀个分离线程来处理请求

创建⼀个请求队列然后传递⼀个Intent消息创建onStartCommand的缺省实现当所有请求被处理后停⽌服务

public class TestIntentService extends IntentService { public TestIntentService() {

super(\"TestIntentService\"); }

@Override

protected void onHandleIntent(Intent intent) { }}

onHandleIntent⾥⾯我们实现了逻辑,⽽⽆需关⼼这作业需要半天或更长,因为这种⽅法在⼀个单独的线程中运⾏。

4、⾃动启动服务

  如果我们想在智能⼿机开机时启动它,我们先创建⼀个⼴播接收器,监听到这个事件,然后启动该服务。

public class BootBroadcast extends BroadcastReceiver { @Override

public void onReceive(Context ctx, Intent intent) { ctx.startService(new Intent(ctx, TestService.class)); }}

Manifest.xml中配置:

到此这篇关于Android服务Service教程的⽂章就介绍到这了,更多相关Android服务Service内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!

因篇幅问题不能全部显示,请点此查看更多更全内容