Android多线程-----异步(IntentService)

一、Service 是什么

1、大家随口就能答得上来,Service是一个在后台执行长时间运行操作而不用提供用户界面的应用组件,可由其他组件启动,即使用户切换到其他应用程序,Service 仍然在后台继续运行。

2、service的弊端:
service既不是独立的进程也不是独立的线程,是依赖于主线程的,所以是不建议在service里面做过多的耗时操作的,避免ANR。

3、Service 有两种启动方式,并且它的两种启动方式的生命周期是不一样的。

A)startService方式,注意参数

从Android官方文档中,我们知道onStartCommand有4种返回值:
1、START_STICKY:如果service进程被kill掉,保留service的状态为开始状态,但不保留递送的intent对象。随后系统会
尝试重新创建service,由于服务状态为开始状态,所以创建服务后一定会调用onStartCommand(Intent,int,int)方法。如果在此期间没有任何启动命令被传递到service,那么参数Intent将为null。
2、START_NOT_STICKY:“非粘性的”。使用这个返回值时,如果在执行完onStartCommand后,服务被异常kill掉,系统不会自动重启该服务。
那个直到接收新的intent对象,这个服务才会被重新创建。这是最安全的选项,用来避免在不需要的时候运行你的服务。
3、START_REDELIVER_INTENT:重传Intent。使用这个返回值时,如果在执行完onStartCommand后,服务被异常kill掉,
系统会自动重启该服务,并将Intent的值传入。
4、START_STICKY_COMPATIBILITY:START_STICKY的兼容版本,但不保证服务被kill后一定能重启。

B)bindService 方式,多个组件可以绑定到同一个服务上,绑定服务的时候,需要提供一个ServiceConnection 接口,在接口回调中获取Binder 对象,与服务进行通信。

二、IntentService是什么

1、IntentService是继承Service处理异步请求的一个类,拥有service的全部生命周期,包含了service的全部特性;
2、它有一个工作线程来处理耗时操作,启动IntentService的方式和启动传统的Service一样
3、同时,当任务执行完后,IntentService会自动停止,而不需要我们手动去控制或stopSelf()。
4、可以启动IntentService多次,这就会产生多个job,而每一个耗时操作会以工作队列的方式在IntentService的onHandleIntent回调方法中执行,并且,每次只会执行一个工作线程,执行完第一个再执行第二个,即one-by-one方式

三、IntentService能做什么

1、举个例子,文件下载

    @Override
    protected void onHandleIntent(Intent intent) {
        HttpURLConnection conn = null;
        InputStream is = null;
        String blogUrl = intent.getStringExtra("url");
        String blogName = intent.getStringExtra("name");
        try {
            //下载指定的文件
            URL url = new URL(blogUrl);
            conn = (HttpURLConnection) url.openConnection();
            if (conn != null) {
                //我们在此处得到所下载文章的输入流,可以将其以文件的形式写入到存储卡上面或
                //将其读取出文本显示在App中
                is = conn.getInputStream();
            }
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (conn != null) {
                conn.disconnect();
            }
        }
    }

2、Application里初始化三方控件等

猜你喜欢

转载自blog.csdn.net/pangjl1982/article/details/85220477