Adnroid Server深入解析.docx
- 文档编号:2433251
- 上传时间:2023-05-03
- 格式:DOCX
- 页数:15
- 大小:79.65KB
Adnroid Server深入解析.docx
《Adnroid Server深入解析.docx》由会员分享,可在线阅读,更多相关《Adnroid Server深入解析.docx(15页珍藏版)》请在冰点文库上搜索。
AdnroidServer深入解析
Android的Service深入分析(全)
1.先来看看WhatisService?
AServiceisnotaseparateprocessAnd AServiceisnotathread.一个服务不是一个独立的进程,也不是一个线程。
那Service是什么呢?
后台运行处理耗时较长的工作
Service是一个应用程序组件
Service没有图形化界面
Service通常用来处理一些耗时比较长的操作
可以使用Service更新ContentProvider,发送Intent以及启动系统的通知等等
2.接着来看看Service的整个生命周期:
Service的活动生命周期是在onStart()之后,这个方法会处理通过startServices()方法传递来的Intent对象。
音乐Service可以通过开打intent对象来找到要播放的音乐,然后开始后台播放。
Service停止时没有相应的回调方法,即没有onStop()方法。
onCreate()方法和onDestroy()方法是针对所有的Services,无论它们是否启动。
通过Context.startService()和Context.bindService()方法。
然而,只有通过startService()方法启动的Service才会被调用onStart()方法。
如果一个Service允许别人绑定,那么需要实现以下额外的方法:
IBinderonBind(Intentintent)
booleanonUnbind(Intentintent)
voidonRebind(Intentintent)
onBind()回调方法会继续传递通过bindService()传递来的intent对像。
onUnbind()会处理传递给unbindService()的intent对象。
如果Service允许绑定,onBind()会返回客户端与服务互相联系的通信频道。
如果建立了一个新的客户端与服务的链接,onUnbind()方法可以请求调用onRebind()方法。
下面的图表介绍了Service的回调方法,然而,它把通过startService()方法建立的服务从通过bindService()方法建立的服务分离开。
记住任何服务,无果它怎样建立,都默认客户端可以链接,所以任何的Service能够接收onBind()和onUnbind()方法。
3.Service组件的通信方式一共有三种:
(1)通过startService来启动的Service;
(2)通过bindService来启动的Service;(3)使用AIDL方式的Service,下面我们来看看它们的具体使用方法,和它们之间有什么区别。
(1)首先来说说通过startService来启动的Service(后台处理工作)
startService(Intentservice),通过intent值来指定启动哪个Service,可以直接指定目标Service的名,也可以通过Intent的action属性来启动设置了相应action属性的Service
,使用这种方式启动的Service,当启动它的Activity被销毁时,是不会影响到它的运行的,这时它仍然继续在后台运行它的工作。
直至调用StopService(Intentservice)方法时
时或者是当系统资源非常紧缺时,这个服务才会调用onDestory()方法停止运行。
所以这种Service一般可以用做,处理一些耗时的工作。
可能有人会问,如果Service不是独立的
一个进程的话,为什么当Activity退出时,Service仍然可以进行运行呢?
其实是这样的,sdk上说了activity和service默认是运行在应用进程的主线程中,四大组件默认都是和
activity运行在同一个主线程中的,那就是说activity通过startservice方法启动一个服务后,被启动的服务和activity都是在同一个线程中的。
所以当我主动销毁了这个activity,但是
他所在的线程还是存在的,只不过是这个activity他所占用的资源被释放掉了,这个activity所在的主线程只有当android内存不足才会被杀死掉,否则一般的情况下这个activity所
在的应用程序的线程始终存在,也就是这个activity所启动的服务也会一直运行下去。
还有一点需要注意的是,如果Service要处理一些比较耗时的工作时,因为Service和Activity默认情况都在同一个主线程中的缘故,所以要操作这些耗时的工作一般是在
Service里另起一个新线程来处理。
这样可以避免主线程的阻塞,影响用户体验性。
(2)然后来说说通过bindService来启动的Service(在本地同进程内与Activity交互)
这里举一个实例来讲:
首选,创建一个接口,IService
packageyy.android.service
publicinterfaceIService{
StringgetName();
}
接着,创建一个服务LocalService
packageyy.android.service;
importandroid.app.Service;
importandroid.content.Intent;
importandroid.os.Binder;
importandroid.os.IBinder;
importandroid.util.Log;
publicclassLocalServiceextendsService{
privatestaticfinalStringTAG="LocalService";
privateMyBindmyBind=newMyBind();
publicIBinderonBind(Intentintent){
Log.d(TAG,"localServiceonBind");
returnmyBind;
}
@Override
publicvoidonCreate(){
super.onCreate();
Log.d(TAG,"localServiceonCreate");
}
@Override
publicvoidonDestroy(){
super.onDestroy();
Log.d(TAG,"localServiceonDestroy");
}
@Override
publicvoidonStart(Intentintent,intstartId){
//TODOAuto-generatedmethodstub
super.onStart(intent,startId);
Log.d(TAG,"localServiceonStart");
}
@Override
publicbooleanonUnbind(Intentintent){
//TODOAuto-generatedmethodstub
Log.d(TAG,"localServiceonUnBind");
returnsuper.onUnbind(intent);
}
publicclassMyBindextendsBinderimplementsIService{
publicStringgetName(){
//TODOAuto-generatedmethodstub
return"YUZHIBOYI";
}
}
}
最后就是实现ServiceActivity了:
packageyy.android.service;
importandroid.app.Activity;
importandroid.os.Bundle;
importandroid.content.ComponentName;
importandroid.content.Intent;
importandroid.content.ServiceConnection;
importandroid.os.IBinder;
importandroid.util.Log;
importandroid.view.View;
importandroid.view.View.OnClickListener;
importandroid.widget.Button;
importandroid.widget.EditText;
publicclassServiceActivityextendsActivity{
privatestaticfinalStringTAG="ServiceActivity";
privateIServiceiService=null;
privateEditTextedit;
privateButtonmBind;
ServiceConnectionconnection=newServiceConnection(){
publicvoidonServiceDisconnected(ComponentNamename){
Log.d(TAG,"DisConnection");
System.out.println("DisConnection!
!
!
");
}
publicvoidonServiceConnected(ComponentNamename,IBinderservice){
//TODOAuto-generatedmethodstub
Log.d(TAG,"Connection");
System.out.println("Connection!
!
!
");
iService=(IService)service;
edit.setText(iService.getName());
//text.setText(iService.getName());
}
};
@Override
publicvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// Log.d(TAG,"Start");
edit=(EditText)findViewById(R.id.edit);
mBind=(Button)findViewById(R.id.Connection);
mBind.setOnClickListener(newOnClickListener(){
publicvoidonClick(Viewv){
Intentintent=newIntent(ServiceActivity.this,LocalService.class);
bindService(intent,connection,BIND_AUTO_CREATE);
}
});
}
}
AndroidManifest.xml注册LocalService
name=".LocalService"> 布局文件: xmlversion="1.0"encoding="utf-8"? > android=" android: layout_width="fill_parent" android: layout_height="fill_parent" android: orientation="vertical"> android: id="@+id/edit" android: layout_width="fill_parent" android: layout_height="wrap_content" >
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Adnroid Server深入解析 Server 深入 解析