美文网首页
Android面试相关 - IntentService

Android面试相关 - IntentService

作者: A大心 | 来源:发表于2020-04-24 11:22 被阅读0次
image.jpg

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);  //多次启动
}
}

运行结果:

image.png

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

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

相关文章

  • Android面试相关 - IntentService

    1.IntentService定义: intentService继承与Service,用来处理异步请求。客户端可以...

  • 笔记:Android线程和线程池

    Android线程和线程池 Android中的线程操作相关的类有 AsyncTask IntentService ...

  • Suffering is the most powerful t

    Android面试相关 程序猿面试葵花宝典 Android面试题集 网易Android面试 乐视、美团,京东等面试...

  • IntentService源码解析

    为什么我们需要IntentService ? Android中的IntentService是继承自Service类...

  • IntentService详解

    为什么需要有IntentService: Android中的IntentService是继承自Service类的,...

  • Need Note Link

    Android 2.2 中文 Api 农民伯伯的博客 面试相关 面试相关1(内有干货链接)吧主 面试相关2(面试题...

  • 面试总结Android

    下面是啊最近几次面试总结:面试分类为三个方面 android相关 java相关 其他 Android相关 1.四大...

  • android 多线程 — IntentService

    我们来看看android 上著名的一次性 Service IntentService ,IntentService...

  • 线程池

    Android中线程形态 AsyncTask HandlerThread IntentService AsyncT...

  • Service详解

    Android四大组件之一 服务 IntentService

网友评论

      本文标题:Android面试相关 - IntentService

      本文链接:https://www.haomeiwen.com/subject/yhixwhtx.html