基础二:service生命周期
2015-09-14 13:37
417 查看
了解顺序:
service生命周期,启动,停止
service与activity的连接建立:绑定,解绑
service耗时操作
service后台与前台
首先,service生命周期:
如图为service启动与绑定生命周期。
如上图为测试例子,点击启动,停止按钮即可运行和停止service
2.以上生命周期activity和service没有建立连接,只是activity启动服务。那么接下来就需要activity和service进行绑定。
其中,首先点击按钮,通过bindService()方法,绑定服务有一个建立连接的类MyServiceConnection。这里需要注意:绑定和解绑方法里的ServiceConnection对象需要为同一个对象。
调用onBind方法,放回Binder对象,需要注意的是,多个客户端可以绑定一个service,但是onBind方法只会被调用一次,由第一个client绑定时调用,其他客户端绑定只得到第一次绑定后得到的binder对象。
在OnServiceConnected方法上调用IBinder类的getService()方法。
然后在getService方法中执行耗时操作。Binder机制是贯穿整个android系统的进程间访问机制。注意:service是运行在主线程上的,不能直接在此方法中进行耗时操作,可能会引起ORM。
以上图片为启动service,执行onCreate,onStartCommand(onStart()方法从api5就已经废除了);绑定service,执行onBind,onServiceConnected,gerService;点击停止service按钮后,未执行其他方法,因为服务未解绑;点击解绑service后,调用onDestroy。
以上图片log日志打印出来的结果是,启动service,停止service,绑定service,解绑service。
4.耗时操作
因为service是运行在主线程的,所以不能直接在service上进行耗时操作,方法为:在Binder方法中开启子线程。有两种方法:
- 开启子线程
- service集成IntentService
集成IntentService
图上所示为启动服务是执行过程。
新建线程
上图为启动,绑定服务的流程。
4.后台service与前台service。
后台service:音乐播放器
前台service:例如墨迹天气,通过通知栏来显示,天气情况通过后台实时刷新。通过Notification和NotificationManager来管理。
service生命周期,启动,停止
service与activity的连接建立:绑定,解绑
service耗时操作
service后台与前台
首先,service生命周期:
如图为service启动与绑定生命周期。
public class MyService extends Service { final static String TAG = "MyService"; @Override public void onCreate() { DebugLog.i( "onCreate"); super.onCreate(); } @Override public int onStartCommand(Intent intent, int flags, int startId) { DebugLog.i("onStartCommand"); return super.onStartCommand(intent, flags, startId); } @Override public IBinder onBind(Intent intent) { Log.i(TAG, "onBind"); return new MyBinder(); } @Override public void onDestroy() { Log.i(TAG, "onDestroy"); super.onDestroy(); } @Override public void onRebind(Intent intent) { Log.i(TAG, "onRebind"); super.onRebind(intent); } @Override public boolean onUnbind(Intent intent) { DebugLog.i("onUnbind"); return super.onUnbind(intent); }
如上图为测试例子,点击启动,停止按钮即可运行和停止service
@OnClick(R.id.start_service) void go2Service(){ Intent intent=new Intent(this, MyService.class); this.startService(intent); } @OnClick(R.id.stop_service) void stopService(){ Intent intent=new Intent(this, MyService.class); this.stopService(intent); }
2.以上生命周期activity和service没有建立连接,只是activity启动服务。那么接下来就需要activity和service进行绑定。
- 在activity上: private MyServiceConnection connection; private void initView() { connection=new MyServiceConnection(); } @OnClick(R.id.bind_service) void bindService(){ Intent intent=new Intent(this, MyService.class); this.bindService(intent,connection, Context.BIND_AUTO_CREATE); //Bing_auto_create表示activity和service建立关联之后会创建service的实例,并运行onCreate方法 } @OnClick(R.id.unbind_service) void unBindService(){ unbindService(connection); }
其中,首先点击按钮,通过bindService()方法,绑定服务有一个建立连接的类MyServiceConnection。这里需要注意:绑定和解绑方法里的ServiceConnection对象需要为同一个对象。
@Override public IBinder onBind(Intent intent) { Log.i(TAG, "onBind"); return new MyBinder(); }
调用onBind方法,放回Binder对象,需要注意的是,多个客户端可以绑定一个service,但是onBind方法只会被调用一次,由第一个client绑定时调用,其他客户端绑定只得到第一次绑定后得到的binder对象。
public class MyServiceConnection implements ServiceConnection { @Override public void onServiceConnected(ComponentName componentName, IBinder iBinder) { DebugLog.i("onServiceConnected"); ((MyService.MyBinder) iBinder).getService(); } @Override public void onServiceDisconnected(ComponentName componentName) { DebugLog.i("onServiceDisconnected"); } }
在OnServiceConnected方法上调用IBinder类的getService()方法。
public class MyBinder extends Binder { public MyService getService() { //开启子线程执行耗时操作 DebugLog.i("getService"); return MyService.this; } }
然后在getService方法中执行耗时操作。Binder机制是贯穿整个android系统的进程间访问机制。注意:service是运行在主线程上的,不能直接在此方法中进行耗时操作,可能会引起ORM。
以上图片为启动service,执行onCreate,onStartCommand(onStart()方法从api5就已经废除了);绑定service,执行onBind,onServiceConnected,gerService;点击停止service按钮后,未执行其他方法,因为服务未解绑;点击解绑service后,调用onDestroy。
以上图片log日志打印出来的结果是,启动service,停止service,绑定service,解绑service。
4.耗时操作
因为service是运行在主线程的,所以不能直接在service上进行耗时操作,方法为:在Binder方法中开启子线程。有两种方法:
- 开启子线程
- service集成IntentService
集成IntentService
@OnClick(R.id.start_service) void go2Service() { Intent intent = new Intent(this, MyIntentService.class); this.startService(intent); }
public class MyIntentService extends IntentService { public MyIntentService(){ super("myIntentService"); } @Override protected void onHandleIntent(Intent intent) { DebugLog.i("downLoading"+Thread.currentThread().getId()); try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } DebugLog.i("downLoaded"+Thread.currentThread().getId()); }
图上所示为启动服务是执行过程。
新建线程
public class MyBinder extends Binder { public MyService getService() { //开启子线程执行耗时操作 DebugLog.i("getService 文件现在所在线程:"+Thread.currentThread().getId()); new Thread(new Runnable() { @Override public void run() { try { DebugLog.i("getService downloading文件下载中线程:"+Thread.currentThread().getId()); Thread.sleep(5000); DebugLog.i("getService downloaded 文件下载完成线程:" + Thread.currentThread().getId()); } catch (InterruptedException e) { e.printStackTrace(); } } }).start(); DebugLog.i("service结束"+Thread.currentThread().getId()); return MyService.this; } }
上图为启动,绑定服务的流程。
4.后台service与前台service。
后台service:音乐播放器
前台service:例如墨迹天气,通过通知栏来显示,天气情况通过后台实时刷新。通过Notification和NotificationManager来管理。
相关文章推荐
- HDOJ 5443 The Water Problem(线段树区间最值)(长春网络赛)
- ApacheServerStatus开启
- match查询
- 物联网的媒介——java usb串口通信
- [Linux] - Docker 常用命令
- Hadoop安装配置
- HDU5441 Travel (2015年长春网络赛,并查集)
- 《剑指offer》矩阵中的路径
- EditText 详细信息(监听事件时,输入改变、透明背景、提示改变文字颜色、密文输入)
- JRebel6.2.3的Eclipse插件安装及破解
- 安卓手机修改IMEI的工具软件修改器琢石模拟器的安装和激活
- HDU 5386 Cover(求一个初始状态数图到另一个终止状态数图所需的步骤)
- iOS启动时如何添加引导页面 小demo
- 20150914-解决在Allegro中无法修改FPM生成封装的问题
- 若要访问本地iis网站, 必须在管理员账户的上下文中运行visual studio
- hdu 4691 Front compression (基于hash的LCP)
- ajax的异步请求小结
- nsdate 的操作
- java学习经典书籍_基础编程篇
- ios一个工程的多个target