摩尔投票法 建网站 OpenCV4 linux创建文件 file button flash text coldfusion nodejs教程视频 php零基础入门视频 jquery点击事件 abaqus是什么软件 vm虚拟化引擎 mac上传文件到linux js数组截取前5个 docker启动容器 python查找指定字符 java中的多态 java的数据类型 java中的队列 java运行环境 java成员变量 java泛型方法 java操作数据库 java八大基本数据类型 java字符串操作 java集成开发环境 javalist数组 方正流行体 战地女记者 swing布局 微信摇骰子表情包 在线手册 汽车配件查询软件 红巨人插件 设备管理器在哪 txplatform renderpartial 字典生成器
当前位置: 首页 > 学习教程  > 编程语言

Android面试相关 - IntentService

2020/11/24 9:48:22 文章标签: 测试文章如有侵权请发送至邮箱809451989@qq.com投诉后文章立即删除

1.IntentService定义: intentService继承与Service,用来处理异步请求。客户端可以通过startService(Intent)方法传递请求给IntentService。IntentService在onCreate()函数中通过HandlerThread单独开启一个线程来依次处理所有Intent请求对象所对应的任务。…

在这里插入图片描述

1.IntentService定义:

intentService继承与Service,用来处理异步请求。客户端可以通过startService(Intent)方法传递请求给IntentService。IntentService在onCreate()函数中通过HandlerThread单独开启一个线程来依次处理所有Intent请求对象所对应的任务。       这样以免事务处理阻塞主线程(ANR)。执行完所一个Intent请求对象所对应的工作之后,如果没有新的Intent请求达到,则自动停止Service;否则执行下一个Intent请求所对应的任务。IntentService在处理事务时,还是采用的Handler方式,创建一个名叫ServiceHandler的内部Handler,并把它直接绑定到HandlerThread所对应的子线程。 ServiceHandler把处理一个intent所对应的事务都封装到叫做onHandleIntent的虚函数;因此我们直接实现虚函数onHandleIntent,再在里面根据Intent的不同进行不同的事务处理就可以了。 另外,IntentService默认实现了Onbind()方法,返回值为null。

2.使用IntentService需要实现的两个方法:

1.构造函数 
  IntentService的构造函数一定是参数为空的构造函数,然后再在其中调用super(“name”)这种形式的构造函数。因为Service的实例化是系统来完成的,而且系统是用参数为空的构造函数来实例化Service的
2.实现虚函数onHandleIntent
  在里面根据Intent的不同进行不同的事务处理。     好处:处理异步请求的时候可以减少写代码的工作量,比较轻松地实现项目的需求。

3.IntentService与Service的区别:

Service不是独立的进程,也不是独立的线程,它是依赖于应用程序的主线程的,不建议在Service中编写耗时的逻辑和操作,否则会引起ANR。IntentService 它创建了一个独立的工作线程来处理所有的通过onStartCommand()传递给服务的intents(把intent插入到工作队列中)。通过工作队列把intent逐个发送给onHandleIntent()。不需要主动调用stopSelft()来结束服务。因为,在所有的intent被处理完后,系统会自动关闭服务。默认实现的onBind()返回null。

4.IntentService实例介绍:

首先是myIntentService.java
public class myIntentService extends IntentService {

//------------------必须实现-----------------------------

public myIntentService() {
    super("myIntentService");
    // 注意构造函数参数为空,这个字符串就是worker thread的名字
}

@Override
protected void onHandleIntent(Intent intent) {
    //根据Intent的不同进行不同的事务处理 
    String taskName = intent.getExtras().getString("taskName");  
    switch (taskName) {
    case "task1":
        Log.i("myIntentService", "do task1");
        break;
    case "task2":
        Log.i("myIntentService", "do task2");
        break;
    default:
        break;
    }       
}
//--------------------用于打印生命周期--------------------
@Override
public void onCreate() {
Log.i("myIntentService", "onCreate");
super.onCreate();
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    Log.i("myIntentService", "onStartCommand");
    return super.onStartCommand(intent, flags, startId);
}

@Override
public void onDestroy() {
    Log.i("myIntentService", "onDestroy");
    super.onDestroy();
}

然后记得在Manifest.xml中注册服务

<service android:name=".myIntentService">
<intent-filter >
<action android:name="cn.scu.finch"/>
</intent-filter>
</service>

最后在Activity中开启服务

public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);

    //同一服务只会开启一个worker thread,在onHandleIntent函数里依次处理intent请求。
    
    Intent i = new Intent("cn.scu.finch");  
    Bundle bundle = new Bundle();  
    bundle.putString("taskName", "task1");  
    i.putExtras(bundle);  
    startService(i);  
       
    Intent i2 = new Intent("cn.scu.finch");  
    Bundle bundle2 = new Bundle();  
    bundle2.putString("taskName", "task2");  
    i2.putExtras(bundle2);  
    startService(i2); 
    
    startService(i);  //多次启动
}
}

运行结果:
在这里插入图片描述

IntentService在onCreate()函数中通过HandlerThread单独开启一个线程来依次处理所有Intent请求对象所对应的任务。通过onStartCommand()传递给服务intent被依次插入到工作队列中。工作队列又把intent逐个发送给onHandleIntent()。

注意: 它只有一个工作线程,名字就是构造函数的那个字符串,也就是“myIntentService”,我们知道多次开启service,只会调用一次onCreate方法(创建一个工作线程),多次onStartCommand方法(用于传入intent通过工作队列再发给onHandleIntent函数做处理)。


本文链接: http://www.dtmao.cc/news_show_400127.shtml

附件下载

上一篇:框选

下一篇:IIC知识整理以及ADS1115

相关教程

    暂无相关的数据...

共有条评论 网友评论

验证码: 看不清楚?