Android服务Service教程

作者:banq 时间:2022-02-19 13:05:40 

前言:

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 中配置:


<service android:name=".TestService" android:enabled="true"/>

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", "SurvivingwithAndroid");      
       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);
   }
});

运行效果如下:

Android服务Service教程

 

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中配置:


<receiver android:name=".BootBroadcast">  
   <intent-filter >
       <action android:name="android.intent.action.BOOT_COMPLETED"/>              
   </intent-filter>
</receiver>

来源:https://www.jdon.com/android/android-service-tutorial.html

标签:Android,服务,Service
0
投稿

猜你喜欢

  • 关于统计数字问题的算法

    2023-11-03 00:33:32
  • android自由改变Dialog窗口位置的方法

    2021-09-13 04:19:04
  • Spring Boot 集成Mybatis实现主从(多数据源)分离方案示例

    2023-08-10 07:43:21
  • Java Swing实现让窗体居中显示的方法示例

    2023-11-06 02:59:07
  • Springboot如何通过yml配置文件为静态成员变量赋值

    2021-08-03 12:03:17
  • 浅谈Java面向接口编程

    2021-07-25 16:29:58
  • java使用poi读取ppt文件和poi读取excel、word示例

    2022-09-08 04:55:23
  • JavaCV实战之调用摄像头基础详解

    2022-07-15 02:14:10
  • java中final与finally的使用介绍

    2023-04-21 05:36:43
  • Java反射机制在Spring IOC中的应用详解

    2023-11-10 14:09:32
  • MyBatis数据脱敏的实现方案介绍

    2021-10-06 19:22:34
  • springboot访问静态资源遇到的坑及解决

    2022-11-06 14:45:11
  • java8到java15的新功能简介

    2023-07-28 02:18:18
  • java 中遍历取值异常(Hashtable Enumerator)解决办法

    2023-08-06 05:17:08
  • 详解java设计模式中的门面模式

    2021-08-17 18:16:25
  • Java生成动态版验证码的方法实例

    2023-08-26 03:53:08
  • C# 使用SharpZipLib生成压缩包的实例代码

    2021-08-29 20:32:57
  • 如何让java只根据数据库表名自动生成实体类

    2022-02-24 04:25:52
  • android studio编译jar包或者aar包的方法教程详解

    2023-06-18 17:22:32
  • Java操作excel的三种常见方法实例

    2022-12-11 02:29:55
  • asp之家 软件编程 m.aspxhome.com