Android Service 笔记
2015-06-30 21:49
561 查看
从运行模式来看,Android的服务组件没有运行在独立的进程或线程中,而是和Android其他组件一样运行在进程的主线程中。所以直接在服务组件中同步执行耗时操作,将会阻塞主线程。
像Service的子类IntentService,完成构造函数和onHandleIntent(Intent intent)方法,然后就可以通过startService(intent)发送执行命令,IntentService接收到首个命令时,IntentService完成启动,并触发一个后台线程,然后将命令放入队列。IntentService会顺序执行这些命令,并同时为每一条命令在后台线程上调用onHandleIntent(intent)的方法。当执行完队列的所有命令后,服务也随即停止并被销毁。PS:IntentService是一种non-sticky服务。
non-sticky服务:当服务自己认为已经完成任务时,会调用stopSelf()或者stopSelf(int)方法告诉Android任务已经完成,以结束服务。
sticky服务:服务会持续运行,直到某个组件调用Context.stopService(Intent)让它停止。
Service的生命周期
一、Context.startService
当首次启动服务时,会依次调用onCreate()和onStart(),如果服务已经被创建,再调用startService(intent)
就只会执行onStart()。Intent传递过来的参数可以在onStartCommand()方法中进行处理。主动结束时执行
stopSelf()方法,被动结束调用Context.stopService()方法,然后再执行onDestroy()。
二、Context.bindService
如果客户端想持续连接服务,获取服务实例可以使用绑定服务这种方式。
同样首次创建服务时,会调用onCreate(),然后onBind方法会构造一个IBinder对象返回给调用者,建立通信连
接,调用者通过重写ServiceConnection类中的onServiceConnected()方法可以获取此IBinder对象。通过
onUnBind解绑服务,然后再执行onDestroy()。绑定服务的组件在销毁前应解除绑定,否则会造成内存泄
露。
部分代码如下:
Service端
[java] view
plaincopy
public class MyService extends Service {
private static final String TAG = "MyService";
private MyBinder mBinder = new MyBinder();
// 创建一个Binder对象,通过onBinder返回给调用者,调用者再通过此对象得到该服务实例
@Override
public IBinder onBind(Intent intent) {
Log.e(TAG, "start IBinder~~~");
return mBinder;
}
@Override
public void onCreate() {
Log.e(TAG, "start onCreate~~~");
super.onCreate();
}
@Override
public void onDestroy() {
Log.e(TAG, "start onDestroy~~~");
super.onDestroy();
}
@Override
public boolean onUnbind(Intent intent) {
Log.e(TAG, "start onUnbind~~~");
return super.onUnbind(intent);
}
//为服务创建一个公共方法,用于测试
public String test(){
System.out.println("test");
}
public class MyBinder extends Binder{
MyService getService(){
return MyService.this;
}
}
}
调用端:
[java] view
plaincopy
public class ServiceDemo extends Activity {
private ServiceConnection mServiceConnection = new ServiceConnection() {
public void onServiceConnected(ComponentName name, IBinder service) {
mMyService = ((MyService.MyBinder)service).getService();
mMyService.test(); // 直接调用服务实例的公共方法
}
public void onServiceDisconnected(ComponentName name) {
}
};
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Intent i = new Intent();
i.setClass(ServiceDemo.this, MyService.class);
mContext.bindService(i, mServiceConnection, BIND_AUTO_CREATE);
}
}
像Service的子类IntentService,完成构造函数和onHandleIntent(Intent intent)方法,然后就可以通过startService(intent)发送执行命令,IntentService接收到首个命令时,IntentService完成启动,并触发一个后台线程,然后将命令放入队列。IntentService会顺序执行这些命令,并同时为每一条命令在后台线程上调用onHandleIntent(intent)的方法。当执行完队列的所有命令后,服务也随即停止并被销毁。PS:IntentService是一种non-sticky服务。
non-sticky服务:当服务自己认为已经完成任务时,会调用stopSelf()或者stopSelf(int)方法告诉Android任务已经完成,以结束服务。
sticky服务:服务会持续运行,直到某个组件调用Context.stopService(Intent)让它停止。
Service的生命周期
一、Context.startService
当首次启动服务时,会依次调用onCreate()和onStart(),如果服务已经被创建,再调用startService(intent)
就只会执行onStart()。Intent传递过来的参数可以在onStartCommand()方法中进行处理。主动结束时执行
stopSelf()方法,被动结束调用Context.stopService()方法,然后再执行onDestroy()。
二、Context.bindService
如果客户端想持续连接服务,获取服务实例可以使用绑定服务这种方式。
同样首次创建服务时,会调用onCreate(),然后onBind方法会构造一个IBinder对象返回给调用者,建立通信连
接,调用者通过重写ServiceConnection类中的onServiceConnected()方法可以获取此IBinder对象。通过
onUnBind解绑服务,然后再执行onDestroy()。绑定服务的组件在销毁前应解除绑定,否则会造成内存泄
露。
部分代码如下:
Service端
[java] view
plaincopy
public class MyService extends Service {
private static final String TAG = "MyService";
private MyBinder mBinder = new MyBinder();
// 创建一个Binder对象,通过onBinder返回给调用者,调用者再通过此对象得到该服务实例
@Override
public IBinder onBind(Intent intent) {
Log.e(TAG, "start IBinder~~~");
return mBinder;
}
@Override
public void onCreate() {
Log.e(TAG, "start onCreate~~~");
super.onCreate();
}
@Override
public void onDestroy() {
Log.e(TAG, "start onDestroy~~~");
super.onDestroy();
}
@Override
public boolean onUnbind(Intent intent) {
Log.e(TAG, "start onUnbind~~~");
return super.onUnbind(intent);
}
//为服务创建一个公共方法,用于测试
public String test(){
System.out.println("test");
}
public class MyBinder extends Binder{
MyService getService(){
return MyService.this;
}
}
}
调用端:
[java] view
plaincopy
public class ServiceDemo extends Activity {
private ServiceConnection mServiceConnection = new ServiceConnection() {
public void onServiceConnected(ComponentName name, IBinder service) {
mMyService = ((MyService.MyBinder)service).getService();
mMyService.test(); // 直接调用服务实例的公共方法
}
public void onServiceDisconnected(ComponentName name) {
}
};
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Intent i = new Intent();
i.setClass(ServiceDemo.this, MyService.class);
mContext.bindService(i, mServiceConnection, BIND_AUTO_CREATE);
}
}
相关文章推荐
- Android SDK和ADT无法更新的解决办法
- Android实现双进程守护
- Android ListView和CheckBox应用之批量删除操作
- Android的事件处理
- android sdk更新hosts修改
- Scroll View
- android webview 嵌入html5 定位 文件上传
- Android数据存储-通过SharedPreferences实现记住密码的操作
- Android基础知识_使用Service
- android菜鸟学习笔记11----Intent的两点补充
- Android按钮单击事件的四种常用写法总结
- Android studio 关联源代码
- android 学习笔记-1
- android编译错误:No such file or directory
- Android内核开发:浅析APK的安装过程
- Android内核开发:浅析APK的安装过程
- android 完美退出应用程序。
- Android监听程序自身被卸载
- Android监听程序自身被卸载
- 修正Android基于ZXing的二维码扫描——横竖屏自由切换