一.Service
1.onCreate
onCreate()方法只会在Service第一次被创建的时候调用,如果当前Service已经被创建过了,即使再次调用该服务,也不会执行onCreate()方法
2.onStartCommand
只有当通过上下文Context执行服务才会运行该方法,该方法一旦启动,如果不执行stopService()方法的话,该服务一旦启动,就会一直运行下去,与activity的生命周期无关
3.onStart
在安卓2.0以下时默认使用,在安卓2.0以上时官方不推荐使用onStart方法,推荐使用onStartCommand方法
onStartCommand和onStart同时存在,互不影响
4.onBind
该方法是执行bindService()方法时,当activity绑定service成功时,service的生命周期回合activity的生命周期一致,当activity结束时,对应的服务也会随之结束
5.启动service的方式
一定要注意,在创建service或者activity时一定要先在配置文件中进行注册
有两种方式去启动service
(1).通过上下文Context的方式去启动service
Intent startIntent = new Intent(this,TestService2.clss);
startService(startIntent);
(2).通过跟activity绑定启动service
//在service中写一个公开的内部类,暴露为接口,供service和activity之间进行通讯,继承Binder接口
public class MyBinder extends Binder{
public void doSomething(){
Log.d(TAG, "doSomething: service与activity之间的通信");
}
}
//之后在service的onBind方法中将创建的类对象进行返回
public IBinder onBind(Intent intent) {
Log.d(TAG, "onBind: 执行该服务的onBind");
return myBinder;
}
//与service之间进行通信
//在activity中创建对象
ServiceConnection serviceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
//IBinder是在service自己创建的类接口,要想执行里边的方法,需要将该变量进行强制类型转换
TestService.MyBinder myBinder = (TestService.MyBinder)service;
myBinder.doSomething();
Log.d(TAG, "onServiceConnected: "+service);
}
@Override
public void onServiceDisconnected(ComponentName name) {
Log.d(TAG, "onServiceDisconnected: "+name);
}
};
//启动方式
//绑定服务
//TestActivity.this是要绑定的activity,TestService是绑定的服务(service)
Intent bindIntent = new Intent(TestActivity.this, TestService.class);
//serviceConnection是进行通信的对象,BIND_AUTO_CREATE是一个常量
bindService(bindIntent,serviceConnection,BIND_AUTO_CREATE);
两种启动方式的区别
(1).第一种启动方式
*生命周期
onCreate()->onStartCommand()(onstart()方法在2.0以上时已经弃用)->onDestroy()
*特点
只有第一次开启服务时才会去去执行service中的onCreate()方法,后边再次开启服务,不会去执行onCreate()方法,而是会调用service的onStart()和onStartCommand()方法,服务停止的时候调用onDestory(),服务只会被停止一次,服务是否运行,与启动服务的对象没有关系,启动服务的进程结束,服务也可以一直运行
(2).第二种启动方式
*生命周期
onCreate()->onBind()->onunBind()->onDestory()
*特点
通过该中方式启动service,会执行service中的onBind()方法,不会执行service中的onStart()方法和onStartCommand()方法,这种方式启动的服务与调用服务的组件是绑定在一起的,调用服务的组件线程结束,服务也会跟着结束,调用该服务的组件,可以跟调用的服务进行通信,调用服务中的方法