基础知识:二、 Service

二、 Service


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

默认情况,如果没有显示的指servic所运行的进程,Service和activity是运行在当前app所在进
程的main thread(UI主线程)里面。
service里面不能执行耗时的操作(网络请求,拷贝数据库,大文件 )
特殊情况 ,可以在清单文件配置 service 执行所在的进程 ,让service在另外的进程中执行
<service android:name="com.baidu.location.f" android:enabled="true" android:process=":remote" > </service>


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

Activity通过bindService(Intentservice, ServiceConnectionconn, intflags)跟Service进行
绑定,当绑定成功的时候 Service 会将代理对象通过回调的形式传给 conn,这样我们就拿到了
Service提供的服务代理对象。
在Activity中可以通过startService和bindService方法启动Service。一般情况下如果想获取
Service的服务对象那么肯定需要通过bindService()方法,比如音乐播放器,第三方支付等。如

果仅仅只是为了开启一个后台任务那么可以使用startService()方法。


3、请描述一下Service的生命周期
Service有绑定模式和非绑定模式,以及这两种模式的混合使用方式。不同的使用方法生命周期
方法也不同。
非绑定模 式:当第一次调用 startService 的时候执 行的方法依次为 onCreate()、
onStartCommand(),当Service关闭的时候调用onDestory 方法。
绑定模式:第一次bindService()的时候,执行的方法为onCreate()、onBind()解除绑定的
时候会执行onUnbind()、onDestory()。
上面的两种生命周期是在相对单纯的模式下的情形。我们在开发的过程中还必须注意Service实
例只会有一个,也就是说如果当前要启动的Service已经存在了那么就不会再次创建该Service当然
也不会调用onCreate()方法。
一个 Service 可以被多个客户进行绑定,只有所有的绑定对象都执行了 onBind()方法后该
Service才会销毁,不过如果有一个客户执行了onStart()方法,那么这个时候如果所有的bind客户
都执行了unBind()该Service也不会销毁。

Service的生命周期图如下所示,帮助大家记忆。


4、什么是IntentService?有何优点?
我们通常只会使用Service,可能IntentService对大部分同学来说都是第一次听说。那么看了
下面的介绍相信你就不再陌生了。如果你还是不了解那么在面试的时候你就坦诚说没用过或者不了解
等。并不是所有的问题都需要回答上来的。


一、IntentService简介

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


二、IntentService特征

会创建独立的worker线程来处理所有的Intent请求;
会创建独立的worker线程来处理onHandleIntent()方法实现的代码,无需处理多线程问题;
所有请求处理完成后,IntentService会自动停止,无需调用stopSelf()方法停止Service;
为Service的onBind()提供默认实现,返回null;
为Service的onStartCommand提供默认实现,将请求Intent添加到队列中;
使用IntentService
本人写了一个 IntentService 的使用例子供参考。该例子中一个 MainActivity 一个
MyIntentService,这两个类都是四大组件当然需要在清单文件中注册。这里只给出核心代码:
MainActivity.java:
public void click(View view){ Intent intent = new Intent(this, MyIntentService.class); intent.putExtra("start", "MyIntentService"); startService(intent); }
MyIntentService.java
public class MyIntentService extends IntentService {
private String ex = ""; private Handler mHandler = new Handler() {
public void handleMessage(android.os.Message msg) { Toast.makeText(MyIntentService.this, "-e " + ex, Toast.LENGTH_LONG).show(); } };
public MyIntentService(){ super("MyIntentService"); }
@Override public int onStartCommand(Intent intent, int flags, int startId) { ex = intent.getStringExtra("start"); return super.onStartCommand(intent, flags, startId); }
@Override protected void onHandleIntent(Intent intent) { /** * 模拟执行耗时任务 * 该方法是在子线程中执行的,因此需要用到 handler 跟主线程进行通信 */ try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } mHandler.sendEmptyMessage(0); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } }
}

运行后效果如下:


5、说说Activity、Intent、Service是什么关系
他们都是Android开发中使用频率最高的类。其中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以及描述下它的生命周期。Service有哪些启动方法,有 什么区别,怎样停用Service?

在Service的生命周期中,被回调的方法比Activity少一些,只有onCreate,onStart,onDestroy, onBind和onUnbind。 通常有两种方式启动一个Service,他们对Service生命周期的影响是不一样的。 1. 通过startService Service会经历 onCreate 到onStart,然后处于运行状态,stopService的时候调用onDestroy 方法。 如果是调用者自己直接退出而没有调用stopService的话,Service会一直在后台运行。 2. 通过bindService Service会运行onCreate,然后是调用onBind, 这个时候调用者和Service绑定在一起。调 用者退出了,Srevice就会调用onUnbind->onDestroyed方法。 所谓绑定在一起就共存亡了。调用者也可以通过调用unbindService方法来停止服务,这时候 Srevice就会调用onUnbind->onDestroyed方法。 需要注意的是如果这几个方法交织在一起的话,会出现什么情况呢? 一个原则是Service的onCreate的方法只会被调用一次,就是你无论多少次的startService又 bindService,Service只被创建一次。 如果先是bind了,那么start 的时候就直接运行Service的onStart 方法,如果先是start,那么bind 的时候就直接运行onBind方法。 如果service运行期间调用了bindService,这时候再调用stopService的话,service是不会调用 onDestroy方法的,service就stop不掉了,只能调用UnbindService, service就会被销毁
如果一个service通过startService 被start 之后,多次调用startService 的话,service会多次调 用onStart方法。多次调用stopService的话,service只会调用一次onDestroyed方法。
如果一个service通过bindService被start 之后,多次调用bindService的话,service只会调用 一次onBind方法。
多次调用unbindService的话会抛出异常。


9、在service的生命周期方法 onstartConmand()可不可以执行网络操 作?如何在service中执行网络操作?

可以直接在Service中执行网络操作,在onStartCommand()方法中可以执行网络操作
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值