`

IntentService

阅读更多
看android的源码可以发现很多很多有趣有用的代码,今天在看关于NFC 的Tag源码的时候,发现了IntentService.做应用程序真的可以很快就完成,因为已经有了很多很多现成的API用,帮我们做了很多的事情。就拿IntentService来说:

Class Overview

IntentService is a base class for Services that handle asynchronous requests (expressed as Intents) on demand. Clients send requests through startService(Intent) calls; the service is started as needed, handles each Intent in turn using a worker thread, and stops itself when it runs out of work.

This "work queue processor" pattern is commonly used to offload tasks from an application's main thread. The IntentService class exists to simplify this pattern and take care of the mechanics. To use it, extend IntentService and implement onHandleIntent(Intent). IntentService will receive the Intents, launch a worker thread, and stop the service as appropriate.

All requests are handled on a single worker thread -- they may take as long as necessary (and will not block the application's main loop), but only one request will be processed at a time.

IntentService是Service的子类,可以通过处理异步的请求(用Intent的方式)。Service可以在需要的时候启动,并且用单独的thread处理每个Intent,但处理完之后就会取消自己。

这种“工作队列的处理器”方式是普遍用于从应用程序的主线程分出来的任务。
所有的请求都会在一个单独的线程处理,但不会阻塞应用程序的主线程。并且一次只处理一个请求。

我们看Tag应用程序里面用IntentService的例子:

/*
 * Copyright (C) 2010 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License
 */

package com.android.apps.tag;

import com.android.apps.tag.provider.TagContract.NdefMessages;

import android.app.IntentService;
import android.app.PendingIntent;
import android.app.PendingIntent.CanceledException;
import android.content.ContentValues;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.nfc.NdefMessage;
import android.os.Parcelable;
import android.util.Log;

public class TagService extends IntentService {
    private static final String TAG = "TagService";

    private static final String EXTRA_SAVE_MSGS = "msgs";
    private static final String EXTRA_DELETE_URI = "delete";
    private static final String EXTRA_STAR_URI = "set_star";
    private static final String EXTRA_UNSTAR_URI = "remove_star";
    private static final String EXTRA_STARRED = "starred";
    private static final String EXTRA_PENDING_INTENT = "pending";

    private static final boolean DEBUG = true;

    public TagService() {
        super("SaveTagService");
    }

    @Override
    public void onHandleIntent(Intent intent) {
        if (intent.hasExtra(EXTRA_SAVE_MSGS)) {
            Parcelable[] msgs = intent.getParcelableArrayExtra(EXTRA_SAVE_MSGS);
            NdefMessage msg = (NdefMessage) msgs[0];

            ContentValues values = NdefMessages.toValues(this, msg, false, System.currentTimeMillis());
            Uri uri = getContentResolver().insert(NdefMessages.CONTENT_URI, values);

            if (intent.hasExtra(EXTRA_PENDING_INTENT)) {
                Intent result = new Intent();
                result.setData(uri);

                PendingIntent pending = (PendingIntent) intent.getParcelableExtra(EXTRA_PENDING_INTENT);

                try {
                    pending.send(this, 0, result);
                } catch (CanceledException e) {
                    if (DEBUG) Log.d(TAG, "Pending intent was canceled.");
                }
            }

            return;
        }

        if (intent.hasExtra(EXTRA_DELETE_URI)) {
            Uri uri = (Uri) intent.getParcelableExtra(EXTRA_DELETE_URI);
            getContentResolver().delete(uri, null, null);
            return;
        }

        if (intent.hasExtra(EXTRA_STAR_URI)) {
            Uri uri = (Uri) intent.getParcelableExtra(EXTRA_STAR_URI);
            ContentValues values = new ContentValues();
            values.put(NdefMessages.STARRED, 1);
            getContentResolver().update(uri, values, null, null);
        }

        if (intent.hasExtra(EXTRA_UNSTAR_URI)) {
            Uri uri = (Uri) intent.getParcelableExtra(EXTRA_UNSTAR_URI);
            ContentValues values = new ContentValues();
            values.put(NdefMessages.STARRED, 0);
            getContentResolver().update(uri, values, null, null);
        }
    }

    public static void saveMessages(Context context, NdefMessage[] msgs, boolean starred,
            PendingIntent pending) {
        Intent intent = new Intent(context, TagService.class);
        intent.putExtra(TagService.EXTRA_SAVE_MSGS, msgs);
        intent.putExtra(TagService.EXTRA_STARRED, starred);
        intent.putExtra(TagService.EXTRA_PENDING_INTENT, pending);
        context.startService(intent);
    }

    public static void delete(Context context, Uri uri) {
        Intent intent = new Intent(context, TagService.class);
        intent.putExtra(TagService.EXTRA_DELETE_URI, uri);
        context.startService(intent);
    }

    public static void setStar(Context context, Uri message, boolean star) {
        Intent intent = new Intent(context, TagService.class);
        if (star) {
            intent.putExtra(EXTRA_STAR_URI, message);
        } else {
            intent.putExtra(EXTRA_UNSTAR_URI, message);
        }
        context.startService(intent);
    }
}


如果我们不用IntentService,我们就自己得用AsyncTask,Looper, Handler来处理。其实若去看IntentService的源码就知道,IntentSerice已经帮我们做了这些事情。所以我们用起来就方便快捷了。^_^
分享到:
评论

相关推荐

    IntentService实现,使用代码

    IntentService是Android系统提供的一种特殊类型的Service,它主要用于在后台执行单线程的任务,处理异步请求。这个服务会自动创建工作线程,并且当所有Intent处理完毕后自动停止服务,无需手动调用stopSelf()。在...

    service和Intentservice示例

    在Android应用开发中,`Service`和`IntentService`是两个关键组件,它们用于在后台执行长时间运行的任务,不依赖于用户界面。本篇将详细阐述`Service`和`IntentService`的用法以及需要注意的要点。 首先,我们来...

    android 中的服务Service intentService例子

    IntentService是Service的一个子类,专门设计来处理异步任务,提供了一种更简洁、线程安全的方式来执行一次性任务。 **Service的基本概念** 1. **生命周期**:Service的生命周期由`onCreate()`、`onStartCommand()`...

    Android中IntentService的特征

    service中1需要手动开启子线程2服务开启之后会一直运行,需要手动调用stopService();或者stopSelf(); intentService是一种异步(子线程)、自动停止的服务,这个例子测试IntentService的特征

    IntentService模拟上传图片

    在Android开发中,IntentService是一种特殊的Service,专为执行单一且异步的任务而设计,尤其适合处理耗时操作,如上传或下载数据。本案例主要关注如何使用IntentService来模拟上传图片。 IntentService的主要特点...

    IntentService+retrofit2.0下载文件、更新APP(项目一部分demo)

    在Android开发中,IntentService和Retrofit2.0是两个重要的组件,它们分别用于异步处理任务和网络请求。在本示例中,IntentService被用来实现后台下载文件,而Retrofit2.0则作为HTTP客户端,负责与服务器进行交互,...

    IntentService学习Demo

    在Android应用开发中,IntentService是一个非常重要的组件,它继承自Service,并且简化了后台服务的处理流程。IntentService主要用于执行单一的任务或者一系列串行任务,而不会长时间占用主线程,提高了应用的响应...

    Android线程,线程池,AsyncTask,HandlerThread和IntentService的用法

    以下是对Android线程、线程池、AsyncTask、HandlerThread和IntentService的详细解释。 1. **Android线程**: Android应用主要运行在主线程(UI线程)上,负责显示和交互。为了防止主线程被长时间运行的任务阻塞,...

    Android—IntentService

    IntentService是Android系统提供的一种特殊服务,用于在后台执行单线程的任务,处理异步请求。它非常适合执行一次性任务,如网络请求、数据同步或耗时计算,且不会阻塞UI线程。IntentService的使用既简单又高效,...

    IntentService简单应用

    在Android开发中,IntentService是一种特殊类型的Service,它主要用于执行后台任务,比如网络请求、数据同步等。IntentService的设计理念是让服务在一个单独的工作线程中运行,避免阻塞主线程,提供了一种有序处理...

    详解Android中IntentService的使用方法

    在Android应用开发中,IntentService是一个非常重要的组件,它继承自Service类,专门用于执行后台的单线程任务,尤其适合处理那些可能阻塞主线程的操作,如网络请求、文件下载等。IntentService的设计旨在避免主线程...

    android IntentService 的学习例子

    在Android开发中,IntentService是一个非常重要的组件,它主要用于处理后台执行的异步任务,而不会阻塞主线程。IntentService具有自动管理线程和停止服务的特性,使得开发者能够轻松地实现耗时操作,如网络请求、...

    Android中的IntentService简介.pdf

    IntentService是Android操作系统中一种特殊的Service子类,它主要用于处理那些需要后台运行的单个任务,比如网络请求、数据同步等。与普通的Service相比,IntentService具有更好的线程管理和任务调度机制,使得...

    IntentService写一个应用切到后台也正常运行的Service

    IntentService是Android系统提供的一种特殊类型的Service,设计用于在后台执行单线程的任务,特别适合处理一次性或异步的操作,比如网络请求、数据下载等。它解决了常规Service可能会面临的资源占用过久、UI阻塞等...

    android IntentService实现原理及内部代码分享

    在Android开发中,IntentService是一个特殊的Service子类,它的设计主要目的是为了简化异步任务的执行,特别是那些一次性、不需要用户交互的任务。IntentService的主要特点在于它会自动管理线程和消息队列,使得...

    安卓 开启service每分钟执行一次任务 模拟定时 或者定时任务

    再开始之前我们还是先介绍下service吧:此处用的是IntentService,至于和常规的service有什么区别呢? 有了Service为什么还要有个IntentService呢? 原因如下: 1)Service默认运行在主线程中,IntentService运行在一个...

    IntentService1

    在Android应用开发中,IntentService是一个非常重要的组件,它继承自Service,并且专门设计用于执行后台的单一任务。"IntentService1"这个示例显然旨在教你如何使用IntentService来处理异步任务,避免阻塞主线程,...

Global site tag (gtag.js) - Google Analytics