四大组件之Service的介绍和相关问题

本文详细介绍了Android中的Service组件,包括其工作原理、生命周期、启动方式及与Activity的交互方法。探讨了Service在主线程的执行特性,如何避免阻塞UI,并介绍了IntentService的优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.Service是否在main thread 中执行,service里面是否能执行耗时的操作

        默认情况,如果没有显示的指service 所运行的进程,service 和activity 是运行在当前App 所在进程的 main thread(UI主线程)里面

        service里面不能执行时的操作(网络请求,拷贝数据库,大文件)

        特殊情况,可以在清单文件中配置 service 执行所在的进程,让service 在另外的进程中执行

  
  <service>
        android:name="com.niusiyu.location.Aservice"
        andorid:enable="true"
        android:process=":remote"
    </service>

2.Activity 怎么和 Service绑定,怎么在Activity 中启动自己对应的 Service

        Activity 通过bindService(Intent service,ServiceConnection conn, int flag)跟Service 进行绑定,当绑定成功的时候Service会将代理对象通过回调的形式传给conn,这样我们就拿到了Service提供的服务代理对象

        在Activity 中可以通过startService 和bindService方法启动Service。一般情况下如果想获取Service 的服务对象那么肯定需要通过bindService()方法,比如第三方支付等,如果仅仅只是为了开启一个后台任务那么可以使用startService()方法。

 

3.请描述一下 Service 的生命周期

Service 有绑定模式和非绑定模式,以及这两种模式的混合使用方式。不同的使用方法生命周期方法也不同

        非绑定模式当第一次调用startService 的时候执行的方法依次为 onCreate(),onStartCommand(),(onstart())当Service 关闭的时候调用onDestory方法。

        绑定模式:第一次bindService()的时候,执行的方法为onCreate(),onBind() ,解除绑定的时候回执行onUnbind(),onDestory()。

        我们在开发的过程中还需要注意Service 实例只会有一个,也就是说如果当前要启动的Service 已经存在了那么就不会再创建,该Service当然也不会调用onCreate()方法。

        一个Service可以被多个客户进行绑定,只有所有的绑定对象都执行了onBind()方法后该Service才会销毁,不过如果有一个客户执行了onStart()方法,那么这个时候如果所有的bind客户都执行了unBind()该Service也不会销毁。

4.什么 是IntentService ?有何优点

        IntentService 是Service 的子类,比普通的Service 增加了额外的功能,先看Service 本身存在两个问题,Service不会专门启动一条单独的进程,Service 与它所在应用位于同一个进程中;Service也不是专门一条新线程,因此不应该在Service 中直接处理耗时的任务;

        IntentService会创建独立的worker 线程里处理所有的Intent请求;会创建独立的worker线程来处理onHandleIntent()方法实现的代码,无需处理多线程问题;所有请求处理完成后,IntentService会自动停止,无需调用onSelf()方法停止Service;为Service的onBind()提供默认实现,返回null;为Service 的onStartCommand提供默认实现,将请求Intent添加到队列中;

 

5.说说Activity ,Intent,Service 是什么关系

        其实Activity 和 Service都是Android四大组件之一。他们都是Context类的子类ContextWrapper的子类,因此他俩可以算是兄弟关系吧。Activity负责用户界面的显示和交互,Service 负责后台任务的处理。Activity 和 Service 之间可以通过Intent 传递数据,因此可以把Intent看作是通信使者。

 

6.Service 和 Activity 在同一个线程吗

        对于同一app来说默认情况下是在同一个线程中的 main thread (UI Thread)

7.Service 里面可以弹吐司么

可以的,弹吐司有个条件就是得有一个Context 上下文,而Service 本身就是Context 的子类,因此在Service 里面弹吐司是完全可以的。比如我们在Service 中完成下载任务后可以弹一个吐司通知用户。

 

8.如何一个Service 成为前置进程?

@Override
public int onStartCommand(Intent intent,int flags,int startId){
    Notification notification = Nitification(R.drawable.ic_launcher,"服务正在运行",System.currentTimeMillis());
    Intent notificationIntent = new Intent(this,MainActivity.class);
    PendingIntent pendingIntent.getActivity(this,0,notificationIntent,0);
    notification.setLatestEventInfo(this,"消息标题","消息内容",pendingIntent);
    startForeground(1,notification);
    return super.onStartCommand(intent,flags,startId);
}

 

9.Service 的onRebind(Intent)方法在什么情况下会执行?

        如果在onUnbind()方法返回true的情况下会执行,否则不执行

 

10.Activity 调用Service中的方法都有哪些方式?

Activity调用Service中的方法主要是通过绑定服务的模式实现的,绑定服务又分为三种方式

(1).通过Binder接口的形式实现,当Activity绑定Service 成功的时候Activity 会在ServiceConnection 的类的onServiceConnected()回调方法中获取到Service 的onBind()方法return 过来的Binder的子类

(2).using a messenger

(3).using AIDL :aidl比较适合当客户端和服务端不再同一个应用下的场景

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值