android学习笔记之IntentService

在学习IntentService之前我们要先说一下started Service。
先看一个例子:
我们在Service中模拟一个耗时操作(不手动开启新线程),并在主Activity中startService,如下

package com.example.demo;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.util.Log;

public class MyService extends Service {
    public MyService() {
    }

    @Override
    public IBinder onBind(Intent intent) {
        // TODO: Return the communication channel to the service.
        throw new UnsupportedOperationException("Not yet implemented");
    }
    //Service创建时调用
    @Override
    public void onCreate() {
        Log.i("Service","Service创建");
        super.onCreate();
    }
    //Service启动时调用
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
                Log.i("Service","Service启动");
                Long endTime=System.currentTimeMillis()+20*1000;
                while(System.currentTimeMillis()<endTime){
                    synchronized (this) {
                        try {
                            wait(endTime - System.currentTimeMillis());//释放锁
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
                stopSelf();
        return super.onStartCommand(intent, flags, startId);
    }
    //Service停止时调用
    @Override
    public void onDestroy() {
        Log.i("Service","Service凉了");
        super.onDestroy();
    }
}

因为started Service不会自动创建一个新的线程,所以操作都是在主线程的,让主线程等待,很容易出现ANR(Application Not Responding)错误,如下
android学习笔记之IntentService_第1张图片
而且我们也说过,started service只能通过手动调用的stopSelf()或stopService()的方法来停止。
————————————————————————————————————————————
IntentService在开启Service时,会自动开启一个新的线程,而且在Service运行结束后也会自动停止。
我们用IntentService试一下:

public class MyIntentService extends IntentService {
    /**
     * Creates an IntentService.  Invoked by your subclass's constructor.
     *
     * @param name Used to name the worker thread, important only for debugging.
     */
    public MyIntentService(String name) {
        super(name);
    }
    public MyIntentService(){
        super("MyIntentService");

    }
    @Override
    protected void onHandleIntent(@Nullable Intent intent) {
        Log.i("Service","Service启动");
        Long endTime=System.currentTimeMillis()+5*1000;
        while(System.currentTimeMillis()<endTime){
            synchronized (this) {
                try {
                    wait(endTime - System.currentTimeMillis());//释放锁
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }

        }
    }

    @Override
    public void onDestroy() {
        Log.i("Service","Service-->成盒");
        super.onDestroy();
    }
}

在这里插入图片描述发现他并没有出现ANR错误(因为他自动开启了一个新线程),并且调用了onDestory()方法停止了线程
总结:
1.IntentService在开启服务时会自动创建一个新线程
2.IntentService会自动停止服务

你可能感兴趣的:(android)