原创 Android之IntentService的使用

2021-11-25 17:27 1790 25 4 分类: 软件与OS 文集: android studio

通过前面的学习大家会发现我们在使用 Service 时总会创建一个线程来执行任务,而不是直接在 Service中执行。这是因为 Service 中的程序仍然运行于主线程中,当执行一项耗时操作时,不新建一个线程的话很容易导致 Application Not Responding 错误。当需要与 UI线程进行交互时,使用 Handler 机制来进行处理。

为了简化操作,Android提供了IntentService类。IntentServiceAndroid中提供的后台服务类,是Service 自动实现多线程的子类。IntentService onCreate(函数中通过 HandlerThread 单独开启一个线程来处理所有Intent 请求对象所对应的任务,这样以免请求处理阻塞主线程。执行完一个 Intent 请求对象所对应的工作之后,如果没有新的 Intent 请求到达,就自动停止Service;否则执行下一个Intent 请求所对应的任务,直至最后执行完队列的所有命令,服务也随即停止并被销毁。所以如果使用 IntentService,用户并不需要主动使用 stopService()或者在lntentService 中使用 stopSelf()来停止。

lntentService在处理请求时采用的也是 Handler机制,它通过创建一个名叫 ServiceHandler 的内部 Handler 直接绑定到 HandlerThread所对应的子线程。ServiceHandler 把处理一个 intent 所对应的请求都封装到 onHandleIntent()方法中,在开发时只需要直接重写 onHandleIntent()方法,当开启服务之后系统会自动调用此方法来处理请求。

使用 IntentService 相当简单,只需继承 IntentService类,实现 onHandleIntent()方法并在其中处理相关请求的操作即可。下面通过一个实例来说明。

创建一个 Activity 类,并在布局文件中加入一个 Button 来开启服务

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:app="http://schemas.android.com/apk/res-auto"
  4. xmlns:tools="http://schemas.android.com/tools"
  5. android:layout_width="match_parent"
  6. android:layout_height="match_parent"
  7. tools:context=".MainActivity">
  8. <Button
  9. android:id="@+id/button2"
  10. android:layout_width="wrap_content"
  11. android:layout_height="wrap_content"
  12. android:onClick="start"
  13. android:text="启动IntentService"
  14. app:layout_constraintBottom_toBottomOf="parent"
  15. app:layout_constraintEnd_toEndOf="parent"
  16. app:layout_constraintHorizontal_bias="0.498"
  17. app:layout_constraintStart_toStartOf="parent"
  18. app:layout_constraintTop_toTopOf="parent"
  19. app:layout_constraintVertical_bias="0.089" />
  20. </androidx.constraintlayout.widget.ConstraintLayout>

MainActivity中捕获Button按钮的点击事件,开启服务,代码如下:

  1. package com.example.test47;
  2. import androidx.appcompat.app.AppCompatActivity;
  3. import android.content.Intent;
  4. import android.os.Bundle;
  5. import android.view.View;
  6. public class MainActivity extends AppCompatActivity {
  7. @Override
  8. protected void onCreate(Bundle savedInstanceState) {
  9. super.onCreate(savedInstanceState);
  10. setContentView(R.layout.activity_main);
  11. }
  12. public void start(View view){
  13. Intent intent=new Intent(MainActivity.this,MyService.class);
  14. startService(intent);//启动service
  15. }
  16. }

最后创建一个类继承IntentService,代码如下:

  1. package com.example.test47;
  2. import android.app.IntentService;
  3. import android.content.Intent;
  4. import android.util.Log;
  5. import androidx.annotation.Nullable;
  6. //定义IntentService类
  7. public class MyService extends IntentService {
  8. int i = 3;
  9. //构造方法
  10. public MyService() {
  11. super("");
  12. }
  13. //耗时任务
  14. @Override
  15. protected void onHandleIntent(@Nullable Intent intent) {
  16. while (i > 0) {
  17. Log.i("=====", i + "");
  18. i--;
  19. try {
  20. Thread.sleep(100);//隔100ms打印数字i
  21. } catch (InterruptedException e) {
  22. e.printStackTrace();
  23. }
  24. }
  25. }
  26. @Override
  27. public void onCreate() {
  28. super.onCreate();
  29. Log.i("======", "onCreate");
  30. }
  31. @Override
  32. public void onDestroy() {
  33. Log.i("======", "onDestroy");
  34. }
  35. }//TODO 特别注意构造方法,不然程序会出错

AndroidManifest.xml文件中注册此服务:

  1. <service android:name=".MyService"></service>

运行程序,点击按钮,观察Log会发现,确实如前文所说,当Intent请求的操作完成之后Service会自动销毁。Log如下:

实例很简单、很容易理解,通过这个实例可以很容易地学会如何使用IntentService。当然如果想要进一步了解IntentService的运行机制,也可以阅读IntentService类的源码。

android studio工具及手机模拟器以及更多工程源代码下载请前往微信公众号:大鸟科创空间,回复:android studio即可获取。

作者: 大鸟科创空间, 来源:面包板社区

链接: https://mbb.eet-china.com/blog/uid-me-3949041.html

版权声明:本文为博主原创,未经本人允许,禁止转载!

文章评论1条评论)

登录后参与讨论

yzw92 2021-11-26 06:43

谢谢分享
相关推荐阅读
大鸟科创空间 2022-02-14 17:42
生日快乐HTML浪漫网页制作源码
对象生日快到了,赶快下载去给ta一个惊喜吧。解压后里面有整个项目和使用说明。这个代码有背景音乐(可以自己更改),有自转相册(可以改成对象照片)如下是效果截图,用鼠标滑动界面会有爱心划过,下滑可以循环播...
大鸟科创空间 2022-01-18 18:06
Android之WebView用法
除了HTTP通信与 Socket 通信两种主要的网络技术外,在 Android 中还提供了一种加载和显示网页的技术—WebView。这可以让我们去处理一些特殊的需求,比如像微信那样在应用程序里展示网页...
大鸟科创空间 2022-01-07 14:18
Android之Socket实例
    Socket(套接字)是对 TCP/IP 协议的封装和应用,根据底层封装协议的不同,Socket 的类型可以分为流套接字(streamsocket)和数据报套接字(data...
大鸟科创空间 2021-12-24 14:38
Android之本地广播的使用
前面我们发送和接收的广播全部属于系统全局广播,即发出的广播可以被其他任何应用程序接收到,并且我们也可以接收来自于其他任何应用程序的广播。这样就很容易会引起安全性的问题,比如说我们发送的一些携带关键性数...
大鸟科创空间 2021-12-15 12:50
自定义广播实例
我们应该已经学会了通过广播接收者来接收系统广播的内容,但是在实际开发中,仍需要自定义一些广播。下面我们就来讲解如何在应用程序中发送自定义的广播。发送广播很简单,只需要声明一个意图,然后使用Contex...
大鸟科创空间 2021-12-07 13:04
Android之动态注册广播实例
Android内置了很多系统级别的广播,我们可以在应用序中通过监听这些广播来得到各种系统的状态信息,比如手机开机完成后会发出一条广播、电池的电最发生变化会发出一条广播、时间或时区发生改变也会发出一条广...
我要评论
1
25
关闭 站长推荐上一条 /2 下一条