android intentservice 实例,Android IntentService详解及使用实例

android intentservice详解

一、intentservice简介

intentservice是service的子类,比普通的service增加了额外的功能。先看service本身存在两个问题:

service不会专门启动一条单独的进程,service与它所在应用位于同一个进程中;

service也不是专门一条新线程,因此不应该在service中直接处理耗时的任务;

二、intentservice特征

会创建独立的worker线程来处理所有的intent请求;

会创建独立的worker线程来处理onhandleintent()方法实现的代码,无需处理多线程问题;

所有请求处理完成后,intentservice会自动停止,无需调用stopself()方法停止service;

为service的onbind()提供默认实现,返回null;

为service的onstartcommand提供默认实现,将请求intent添加到队列中;

三、使用步骤(详情参考service项目)

继承intentservice类,并重写onhandleintent()方法即可;

mainactivity.java文件

public class mainactivity extends activity {

@override

protected void oncreate(bundle savedinstancestate) {

super.oncreate(savedinstancestate);

setcontentview(r.layout.activity_main);

}

public void startservice(view source) {

// 创建所需要启动的service的intent

intent intent = new intent(this, myservice.class);

startservice(intent);

}

public void startintentservice(view source) {

// 创建需要启动的intentservice的intent

intent intent = new intent(this, myintentservice.class);

startservice(intent);

}

}

myintentservice.java文件

public class myintentservice extends intentservice {

public myintentservice() {

super("myintentservice");

}

@override

protected void onhandleintent(intent intent) {

// intentservice会使用单独的线程来执行该方法的代码

// 该方法内执行耗时任务,比如下载文件,此处只是让线程等待20秒

long endtime = system.currenttimemillis() + 20 * 1000;

system.out.println("onstart");

while (system.currenttimemillis() < endtime) {

synchronized (this) {

try {

wait(endtime - system.currenttimemillis());

} catch (interruptedexception e) {

e.printstacktrace();

}

}

}

system.out.println("----耗时任务执行完成---");

}

}

myservice.java文件

public class myservice extends service {

@override

public ibinder onbind(intent arg0) {

return null;

}

@override

public int onstartcommand(intent intent, int flags, int startid) {

// 该方法内执行耗时任务可能导致anr(application not responding)异常

long endtime = system.currenttimemillis() + 20 * 1000;

system.out.println("onstart");

while (system.currenttimemillis() < endtime) {

synchronized (this) {

try {

wait(endtime - system.currenttimemillis());

} catch (interruptedexception e) {

e.printstacktrace();

}

}

}

system.out.println("----耗时任务执行完成---");

return start_sticky;

}

}

运行上述代码,启动myintentservice的会使用单独的worker线程,因此不会阻塞前台的ui线程;而myservice会。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值