zoukankan      html  css  js  c++  java
  • android 中IntentService的使用场景

    IntentService是继承并处理异步请求的一个类,在IntentService内有一个工作线程来处理耗时操作,启动IntentService的方式和启动传统的Service一样,同时,当任务执行完后,IntentService会自动停止,而不需要我们手动去控制或stopSelf()。另外,可以启动IntentService多次,而每一个耗时操作会以工作队列的方式在IntentService的onHandleIntent回调方法中执行,并且,每次只会执行一个工作线程,执行完第一个再执行第二个,以此类推。

    在Android开发中,我们或许会碰到这么一种业务需求,一项任务分成几个子任务,子任务按顺序先后执行,子任务全部执行完后,这项任务才算成功。那么,利用几个子线程顺序执行是可以达到这个目的的,但是每个线程必须去手动控制,而且得在一个子线程执行完后,再开启另一个子线程。或者,全部放到一个线程中让其顺序执行。这样都可以做到,但是,如果这是一个后台任务,就得放到Service里面,由于Service和Activity是同级的,所以,要执行耗时任务,就得在Service里面开子线程来执行。那么,有没有一种简单的方法来处理这个过程呢,答案就是IntentService。

    什么是IntentService,首先看看官方的解释:
    IntentService is a base class forServices that handle asynchronous requests (expressed asIntents) on demand. Clients send requests throughstartService(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


    简单说,IntentService是继承于Service并处理异步请求的一个类,在IntentService内有一个工作线程来处理耗时操作,启动IntentService的方式和启动传统Service一样,同时,当任务执行完后,IntentService会自动停止,而不需要我们去手动控制。另外,可以启动IntentService多次,而每一个耗时操作会以工作队列的方式在IntentService的onHandleIntent回调方法中执行,并且,每次只会执行一个工作线程,执行完第一个再执行第二个,以此类推。
    还有一个说明是:
    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.
    大致意思是:所有请求都在一个单线程中,不会阻塞应用程序的主线程(UI Thread),同一时间只处理一个请求。
    那么,用IntentService有什么好处呢?首先,我们省去了在Service中手动开线程的麻烦,第二,当操作完成时,我们不用手动停止Service,第三,it's so easy to use!

    package im.weiyuan.com.viewutils;
    
    import android.app.IntentService;
    import android.content.Intent;
    import android.content.Context;
    import android.os.SystemClock;
    import android.util.Log;
    
    /**
     * An {@link IntentService} subclass for handling asynchronous task requests in
     * a service on a separate handler thread.
     * <p>
     * TODO: Customize class - update intent actions, extra parameters and static
     * helper methods.
     */
    public class MyIntentService extends IntentService {
    
    
        /**
         * 必须要写一个无参数的构造函数,然后调用父类的 super("MyIntentService");
         * 其中MyIntentService就是执行onHandleIntent对应的线程的名字
         * */
        public MyIntentService() {
            super("MyIntentService");
        }
    
    
    
    
        /**
         * onHandleIntent函数是在子线程中去执行处理的,所以这里就没有必要去开启线程
         * */
    
        @Override
        protected void onHandleIntent(Intent intent) {
            Log.d("123456","onHandleIntent is called");
            /**
             * 模拟耗时操作
             * */
            SystemClock.sleep(10000);
            Log.d("123456","onHandleIntent is out");
        }
    
        /**
         * onHandleIntent函数中的耗时任务执行完成后,服务会自动销毁
         * 调用onDestroy函数
         *
         * */
    
        @Override
        public void onDestroy() {
            super.onDestroy();
            Log.d("123456","onDestroy is called");
        }
    }
    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="im.weiyuan.com.viewutils">
    
        <permission android:name="com.weiyuan.sb" />
    
        <uses-permission android:name="com.weiyuan.sb" />
    
        <application
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:supportsRtl="true"
            android:theme="@style/AppTheme">
            <activity android:name=".MainActivity">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
    
            <service
                android:name=".MyIntentService"
                android:exported="false"></service>
        </application>
    
    </manifest>
    Intent intent = new Intent(MainActivity.this,MyIntentService.class);
    startService(intent);
    我们来看看日志打印的输出:

    07-23 11:52:18.507 14993-15238/im.weiyuan.com.viewutils D/123456: onHandleIntent is called
    07-23 11:52:28.508 14993-15238/im.weiyuan.com.viewutils D/123456: onHandleIntent is out
    07-23 11:52:28.510 14993-14993/im.weiyuan.com.viewutils D/123456: onDestroy is called

    不清楚的看博客:

    http://blog.csdn.net/ryantang03/article/details/8146154/

    相当的经典

  • 相关阅读:
    循环图片 yi
    给大家一个经典的.net情感故事 yi
    [东邪西毒][程序员版][原版][剧情] yi
    Sqlite 使用笔记 中文显示为乱码 yi
    sql2005安装过程,(不装C盘) yi
    Visual Studio 2010 美女与程序员的爱情网剧全集 yi
    IT行业几大职业病 yi
    标准化操作
    【ActiveMQ Tuning】Serializing to Disk
    我的山寨敏捷四季之春
  • 原文地址:https://www.cnblogs.com/kebibuluan/p/7224158.html
Copyright © 2011-2022 走看看