原创 Android之IntentService的使用

2021-11-25 17:27 427 1 3 分类: 软件与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

谢谢分享
相关推荐阅读
大鸟科创空间 2021-12-01 16:00
android之广播机制介绍
广播(Broadcast)是一种广泛用于应用程序之间传递消息的机制,是 Android系统的四大组件之一。广播机制包含3 个基本要素∶广播(Broadcast),用于发送广播;广播接收器(Broadc...
大鸟科创空间 2021-11-19 15:18
Android之Notification的使用
前台服务一个Service不管是被启动或是被绑定,默认是运行在后台的。有一种特殊的服务叫前台服务,是一种能被用户意识到它存在的服务,默认是不会被系统自动销毁的,但是必须提供一个状态栏Notificat...
大鸟科创空间 2021-11-12 16:33
Android之AsyncTask使用实例
AsyncTask 是 Android提供的轻量级的异步类,可以直接继承 AsyncTask,在类中实现异步操作,并提供接口反馈当前异步执行的程度(可以通过接口实现UI进度更新),最后反馈执行的结果给...
大鸟科创空间 2021-11-02 12:18
Android之Handler机制使用实例
使用 Handler 机制,首先需要创建一个Handler 对象,可以直接使用Handler 无参构造函创建Handler 对象,或者是继承Handler类,重写 handleMessage(Mess...
大鸟科创空间 2021-10-31 18:39
Android 消息处理机制
Android 应用程序启动时,系统会创建一个主线程,负责与UI组件(widget、view)进行交互,比如控制UI 界面显示、更新等;分发事件给UI界面处理,比如按健事件、触摸事件、基绘图事件等,因...
广告
我要评论
1
1
1
2
3
4
5
6
7
8
9
0
广告
关闭 热点推荐上一条 /1 下一条