新建学习群:79369965 ,欢迎大家一起来共同学习
service是application fundamentals之一 ,所以它的重要性就不言而喻了!
本文概要:
1:使用startService()启动service (机制分析)
2:使用bindService()启动service(机制分析)
3:区别
4:注意事项
1:这种方式跟启动一个activity是一样的原理
①:创建一个类实现Service (ServiceModel extends Service) 复写int onStartCommand(Intent intent, int flags, int startId)(其他的方法可以选择复写)
②:注册service(<service android:name=".ServiceModel"></service>)
③:驱动此service
btn.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
Intent intent = new Intent();
intent.setClass(ServiceTest.this, ServiceModel.class);
startService(intent);
}
});
机制分析:当驱动startService()时,系统会回调一个onStartCommand方法,然后你可以在此方法里做你需要做的操作
2:将应用程序和service绑定(这里是将一个activity和service绑定)
①:从这里我们可以看到需要返回一个IBinder对象 IBinder onBind(Intent intent) 在API中我们可以发现这个是一个接口,实现了这个接口的类叫Binder在此我们自定义一个类来继承此类如下:
public class LocalBinder extends Binder {
public ServiceModel getService() {
return ServiceModel.this;
}
}
//该类的母的是 :返回了一个service对象
②:这里主要满足这个bindService函数。这个函数需要的是一个Intent对象,一个ServiceConnection对象,以及一个flag 这里主要 谈一下第二个参数
当我们的service中的onBind方法返回的时候如果连接上了会调用这个ServiceConnection里面的onServiceConnected这个方法,在这个方法里的第二个参数就是onBind()返回的那个IBinder对象.而这个对象中我们有创建了一个方法getService() 用来获得这个service对象所以可以在activity中操作这个service了,完成了绑定!
bindService.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
Intent intent = new Intent();
intent.setClass(ServiceTest.this, ServiceModel.class);
bindService(intent, conn = new ServiceConnection(){
public void onServiceConnected(ComponentName name,
IBinder service) {
Log.i(TAG , "---onServiceConnected---");
ServiceModel model =((ServiceModel.LocalBinder) service).getService();
model.model_methed();
}
public void onServiceDisconnected(ComponentName name) {
}}, BIND_AUTO_CREATE);
}
});
③:机制分析:通过IBinder onBind(Intent intent) 返回的IBinder ,与ServiceConnection中的onServiceConnected返回的service相对应来完成service的绑定操作
3:区别
前者与应用程序无关,也就是说前者的应用程序的关闭与否与service无关。而后者与应用程序共存亡(onServiceDisconnected)。
4:注意事项:在service里面不要进行非常耗时的操作,因为系统会调用几秒钟后就返回了。这时可以考虑使用单独开其他的线程,或者使用API中定义的IntentService这个类是继承了service而且也实现了多线程异步的机制 。
PS:service是一个比较复杂的框架,在此只是蜻蜓点水,具体可以查看开发文档比如这里没有介绍:Remote Messenger Service
----------------关键要学会如何查看开发文档,其他都是浮云!---------------------------------