Service与IntentService

之前介绍了Android Service与Thread的区别(点击查看Service与Thread区别),由于Service不是线程,它是在主线程中运行的,因此在Service中应该避免耗时操作,之前看到过很多帖子和代码都把耗时操作交给Service去处理,这样是不合理的。如果Service中有耗时操作一定要new 一个Thread去处理。
        下面写一个错误的示例,即将耗时操作直接放在Service中进行。

//Service
public class MyService extends Service {

@Override
    public IBinder onBind(Intent intent) {
        return null;
    }

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

@Override
    public void onStart(Intent intent, int startId) {
        Log.i("Test", "Service start...");
        try {
            Thread.sleep(30000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

Log.i("Test", "Service end...");
    }

}
//测试主程序
public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

startService(new Intent(this, MyService.class));
        //...填充UI
    }
}

测试结果显示Service开启后,MainActivity被阻塞住,UI界面无法绘制。等待一段时间后Activity出现假死现象,点击“等待”按钮,Service睡眠30秒后,程序正常。

因此在Service中如果进行耗时操作,正确的做法是开启一个线程。

除了在Service中开启线程之外,Android提供了IntentService来处理耗时操作。
IntentService继承自Service,但相比Service有以下优点:
使用队列的方式将请求的Intent加入队列,然后开启一个worker thread(线程)来处理队列中的Intent,对于异步的startService请求,IntentService会处理完成一个之后再处理第二个,每一个请求都会在一个单独的worker thread中处理,不会阻塞应用程序的主线程,这里就给我们提供了一个思路,如果有耗时的操作与其在Service里面开启新线程还不如使用IntentService来处理耗时操作。
这里给出一个IntentService处理耗时操作的例子:
public class MyIntentService extends IntentService {

public MyIntentService() {
        super("Test");
    }

@Override
    protected void onHandleIntent(Intent intent) {
        Log.i("Test", "Service start...");
        try {
            Thread.sleep(30000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        Log.i("Test", "Service end...");
    }
}

//测试主程序
public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

startService(new Intent(this, MyIntentService.class));
        startService(new Intent(this, MyIntentService.class));//开启两个IntentService,观察执行
        //...填充UI
    }
}

测试结果显示,MyIntentService开启后Activity并未阻塞,可以正常运行。两个IntentService按照先进先出的原则依次执行。

因此我们在处理Service中有耗时操作的时候,可以尝试使用IntentService代替Thread.

时间: 2024-10-02 21:28:44

Service与IntentService的相关文章

Android中Service与IntentService的使用比较

不知道大家有没有和我一样,以前做项目或者 练习的时候一直都是用Service来处理后台耗时操作,却很少注意到还有个IntentService,前段时间准备面试的时候看到了一篇关于 IntentService的解释,发现了它相对于Service来说有很多更加方便之处,今天在这里稍微来总结下我的心得. 首先IntentService是继承自Service的,那我们先看看Service的官方介绍,这里列出两点比较重要的地方: 1.A Service is not a separate process.

Android自学之路——Service与IntentService

A)MainActivity部分的代码1 package com.example.cms.intentservice; 2 3 import android.content.Intent; 4 import android.support.v7.app.AppCompatActivity; 5 import android.os.Bundle; 6 import android.view.View; 7 import android.widget.Button; 8 9 public class

service与IntentService 区别

关系: IntentService继承service 区别: IntentService 是一个带有HandlerThread的线程的service,把任务执行完成以后IntentService自动销毁. Service要手动 调用stopSelf()来销毁. IntentService 运行在子线程中,Service运行在主线程中 作用:  IntentService 用于执行一次复杂的场景使用IntentService相对好一点 Service 用于重复执行的场景 代码分析: IntentS

service and intentservice

Service是Android中四大组件之一,在Android开发中起到非常重要的作用,先来看一下官方对Service的定义: A Service is an application component that can perform long-running operations in the background and does not provide a user interface. Another application component can start a service

Service和IntentService中显示Toast的区别

1. 表象 Service中可以正常显示Toast,IntentService中不能正常显示Toast,在2.3系统上,不显示toast,在4.3系统上,toast显示,但是不会消失. 2. 原因 Toast要求运行在UI主线程中. Service运行在主线程中,因此Toast是正常的. IntentService运行在独立的线程中,因此Toast不正常. 3. 在IntentService中显示Toast 利用Handler,将显示Toast的工作,放在主线程中来做.具体有两个实现方式. Ha

[Android 基础系列]Service、IntentService和习以为常的误解

前言: 也许是低门槛原因,最初接触Android的人写了很多书.博文,创造了一个邪论:Activity就是弄界面的,Service就是弄后台的,进而将"播放音乐"这种演变为"耗时操作",进而演绎成:"耗时的.长时间运行的都需要使用service".只想说:MDZZ! 原意是想全文自己写,但看了一眼API文档,整理的实在是太好了,所以本文会摘录API的内容并结合重点写一点内容. 正文: Service: API文档中的概述如下: A Service

Android查缺补漏--Service和IntentService

Service的运行不依赖界面,即使程序被切换到后台,Service仍然能够保持正常运行.当某个应用程序进程被杀掉时,所有依赖于该进程的Service也会停止运行. Service 分为启动状态和绑定状态.当处于仅启动状态时,通过 stopService或 stopSelf 即可停止 Service.当处于绑定状态时需要通过 unBindService 和 stopService 结合使用才能完全停止 Service. 一.Service的生命周期(onCreate()-onStartComma

Android Service 与 IntentService

IntentService:异步处理服务,新开一个线程:handlerThread在线程中发消息,然后接受处理完成后,会清理线程,并且关掉服务. IntentService有以下特点: (1)  它创建了一个独立的工作线程来处理所有的通过onStartCommand()传递给服务的intents. (2)  创建了一个工作队列,来逐个发送intent给onHandleIntent(). 每一个请求都会在一个单独的worker thread中处理,不会阻塞应用程序的主线程 (3)  不需要主动调用

android开发步步为营之60:IntentService与Service的区别

这个面试的时候,相信是面试官最爱的问题之一.简单的来说,IntentService继承至Service,Service和Acitivity一样是依附于应用主进程的,它本身不是一个进程或者一个线程.一些耗时的操作可能会引起ANR的bug,(本文测试的时候,Service执行20秒没有报ANR),而IntentService,看它的源代码,onCreate()其实是创建了一个新的线程. /* * Copyright (C) 2008 The Android Open Source Project *