当前位置: 首页 > 编程笔记 >

Android IntentService详解及使用实例

百里沛
2023-03-14
本文向大家介绍Android IntentService详解及使用实例,包括了Android IntentService详解及使用实例的使用技巧和注意事项,需要的朋友参考一下

Android IntentService详解

一、IntentService简介

IntentService是Service的子类,比普通的Service增加了额外的功能。先看Service本身存在两个问题: 

  • Service不会专门启动一条单独的进程,Service与它所在应用位于同一个进程中; 
  • Service也不是专门一条新线程,因此不应该在Service中直接处理耗时的任务;  

二、IntentService特征

  • 会创建独立的worker线程来处理所有的Intent请求; 
  • 会创建独立的worker线程来处理onHandleIntent()方法实现的代码,无需处理多线程问题; 
  • 所有请求处理完成后,IntentService会自动停止,无需调用stopSelf()方法停止Service; 
  • 为Service的onBind()提供默认实现,返回null; 
  • 为Service的onStartCommand提供默认实现,将请求Intent添加到队列中; 

 三、使用步骤(详情参考Service项目)

继承IntentService类,并重写onHandleIntent()方法即可;

MainActivity.Java文件

public class MainActivity extends Activity {  
  
  @Override  
  protected void onCreate(Bundle savedInstanceState) {  
    super.onCreate(savedInstanceState);  
    setContentView(R.layout.activity_main);  
  }  
  
  public void startService(View source) {  
    // 创建所需要启动的Service的Intent  
    Intent intent = new Intent(this, MyService.class);  
    startService(intent);  
  }  
  
  public void startIntentService(View source) {  
    // 创建需要启动的IntentService的Intent  
    Intent intent = new Intent(this, MyIntentService.class);  
    startService(intent);  
  }  
}  

 MyIntentService.java文件

public class MyIntentService extends IntentService {  
  
  public MyIntentService() {  
    super("MyIntentService");  
  }  
  
  @Override  
  protected void onHandleIntent(Intent intent) {  
    // IntentService会使用单独的线程来执行该方法的代码  
    // 该方法内执行耗时任务,比如下载文件,此处只是让线程等待20秒  
    long endTime = System.currentTimeMillis() + 20 * 1000;  
    System.out.println("onStart");  
    while (System.currentTimeMillis() < endTime) {  
      synchronized (this) {  
        try {  
          wait(endTime - System.currentTimeMillis());  
        } catch (InterruptedException e) {  
          e.printStackTrace();  
        }  
      }  
    }  
    System.out.println("----耗时任务执行完成---");  
  }  
}  
 

MyService.java文件

public class MyService extends Service {  
  
  @Override  
  public IBinder onBind(Intent arg0) {  
    return null;  
  }  
  
  @Override  
  public int onStartCommand(Intent intent, int flags, int startId) {  
    // 该方法内执行耗时任务可能导致ANR(Application Not Responding)异常  
    long endTime = System.currentTimeMillis() + 20 * 1000;  
    System.out.println("onStart");  
    while (System.currentTimeMillis() < endTime) {  
      synchronized (this) {  
        try {  
          wait(endTime - System.currentTimeMillis());  
        } catch (InterruptedException e) {  
          e.printStackTrace();  
        }  
      }  
    }  
    System.out.println("----耗时任务执行完成---");  
    return START_STICKY;  
  }  
}  

运行上述代码,启动MyIntentService的会使用单独的worker线程,因此不会阻塞前台的UI线程;而MyService会。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

 类似资料:
  • 本文向大家介绍iOS-GCD使用详解及实例解析,包括了iOS-GCD使用详解及实例解析的使用技巧和注意事项,需要的朋友参考一下 iOS-GCD使用详解 前言 对初学者来说,GCD似乎是一道迈不过去的坎,很多人在同步、异步、串行、并行和死锁这几个名词的漩涡中渐渐放弃治疗。本文将使用图文表并茂的方式给大家形象地解释其中的原理和规律。 线程、任务和队列的概念 异步、同步 & 并行、串行的特点 一条重要的

  • 本文向大家介绍Python heapq使用详解及实例代码,包括了Python heapq使用详解及实例代码的使用技巧和注意事项,需要的朋友参考一下  Python heapq 详解 Python有一个内置的模块,heapq标准的封装了最小堆的算法实现。下面看两个不错的应用。 小顶堆(求TopK大) 话说需求是这样的: 定长的序列,求出TopK大的数据。 大顶堆(求BtmK小) 这次的需求变得更加的

  • 本文向大家介绍java 语句块的使用详解及实例,包括了java 语句块的使用详解及实例的使用技巧和注意事项,需要的朋友参考一下 java 语句块 犹记得在初看C,C++和Java的编程书籍时,上面就有介绍语句块,但当时甚是不理解什么是语句块。《代码大全》中也有讲说要把相似功能的语句组织到一起形成语句块,然后与其他语句块用空行分隔。但这只是在人的理解上的语句块,并非是真的程序语言意义上的语句块。 程

  • 本文向大家介绍Android  CardView详解及使用方法和实例,包括了Android  CardView详解及使用方法和实例的使用技巧和注意事项,需要的朋友参考一下 Android  CardView详解 Android5.0中向我们介绍了一个全新的控件–CardView,从本质上看,可以将CardView看做是FrameLayout在自身之上添加了圆角和阴影效果。请注意:CardView被

  • 本文向大家介绍JSP request.setAttribute()详解及实例,包括了JSP request.setAttribute()详解及实例的使用技巧和注意事项,需要的朋友参考一下  javascript request.setAttribute()详解 request.setAttribute()怎么用的? JSP1代码 JSP2代码 为什么JS P2中会找不到test? 用来在同一个re

  • 本文向大家介绍Android requestFocus详解及实例,包括了Android requestFocus详解及实例的使用技巧和注意事项,需要的朋友参考一下 Android requestFocus详解及实例 requestFocus的使用 一句话概括: <requestFocus />: 标签用于指定屏幕内的焦点View。 布局资源文件的根节点可以使用容器控件(如LinearLayout、