Android Service组件理解
1.什么是Service?
Service就是一个执行后台任务的模块或组件,但需要注意,它本身默认是运行在主线程(进程)中的,并没有创建新的线程,因此不能在其中做很耗时的任务,类似于Thread和AsyncTask
2.为什么要使用Service?
当一个应用程序含有Service,则该程序便会因此有希望在系统中保留更长的时间(特别在系统资源紧张,系统便会选择性kill某些处于后台的应用程序,而假如应用程序有Service便不那么容易被kill掉)
(慎重使用Service,只有在某些功能、任务等在应用处于后台情况也必须保证正常运行的活着一些监听类行为的功能才可采用,像一般的耗时计算、异步网络请求等对于应用处不处于后台都无影响)
3.如何使用Service?
任何Service的使用都必须先自定义一个继承自Service的子类,然后重写特定的方法
然后在AndroidMainifest.xml中配置声明该Service,如下:
android:exported="false">表示不导出,即本地Service
(1).以startService()方法启动Service,访问者与Service没有关联、没有通信,访问者
即使退出,Service仍然运行,一直运行,不管应用程序处在后台还是压根没打开,只有当该应用被删掉之
后,启动的Service才会停止。
自定义Service类如下:
public class MyService extends Service{
@Override
public void
onCreate() { Service第一次被创建时调用,只会调用一次,除非再次重建,与 onDestroy对应
super.onCreate();
Log.v("ppp",
"onCreate");
}
@Override
public int
onStartCommand(Intent intent, int flags, int startId){
该Service以调用方法StartService方式启用时调用,每启用一次则调用一次
return
START_STICKY;
}
@Override
public
IBinder onBind(Intent intent) {
其实这是以bindService方式启动时需实现的方法,但此处还是要提供一个空实现并返回null
return
null;
}
@Override
public void
onDestroy (){
super.onDestroy();
Log.v("ppp",
"onDestroy");
}
}
(2).
以bindService方式启用,访问者与Service之间有关联、能够通信且访问者退出,Service也就终止
自定义Service类如下:
public class MyService extends Service{
private
MyBinder binder = new MyBinder(); 给Service定义一个Binder类型的成员变量,供onBind函数返回给访问者,然后访问者便可以通过这个binder调用改Service里的方法了,实现通信
public class
MyBinder extends Binder {
public void
ggg() {
}
}
@Override
public void
onCreate() { Service第一次被创建时调用,只会调用一次,除非再次重建,与 onDestroy对应
super.onCreate();
Log.v("ppp",
"onCreate");
}
@Override
public
IBinder onBind(Intent intent) { 该Service以调用方法bindService方式启用时调用
与onUnbind对应
// TODO
Auto-generated method stub
Log.v("ppp",
"onBind");
return
binder;
}
@Override
public void onRebind(Intent intent)
{ 重新被绑定时
}
@Override
public
boolean onUnbind(Intent intent){ 调用unBindService方法解除绑定时
Log.v("ppp",
"onUnbind");
return
true;
}
@Override
public void
onDestroy (){
super.onDestroy();
Log.v("ppp",
"onDestroy");
}
}
访问者调用方式如下,一般在Activity中进行:
public class MainActivity
extends Activity{
需要定义一个ServiceConnection对象供bindService传参及回调
private
ServiceConnection cconConnection = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName
name) {
// TODO Auto-generated method stub
//只有宿主进程异常终止时该方法才会被执行,直接调用unBind方法则不会
Log.v("ppp", "onServiceDisconnected");
}
@Override
public void onServiceConnected(ComponentName
name, IBinder service) {
// TODO Auto-generated method stub
Log.v("ppp", name.toString());
2.为什么要使用Service?
3.如何使用Service?
public class MyService extends Service{
}
public class MyService extends Service{
}