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比较适合当客户端和服务端不再同一个应用下的场景