本文共 4130 字,大约阅读时间需要 13 分钟。
1)、定义上:android中 service、thread、后台是不一样的概念
service是由系统进程托管,service是一种轻量级的IPC通信,2)、实际开发中:
service运行在主线程,不能执行耗时操作,不然会NAR,要开启单独线程3)、应用场景
service : 播放音乐,开启天气预报的统计,数据统计等等开启服务,一旦该服务开启,就会在后台无限期的运行,activity被销毁也不影响,除非你通过stopService关闭service。
public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { Intent intent = new Intent(this, StartService.class); startService(intent); }}
public class StartService extends Service { /** * 绑定服务时才会调用 */ @Nullable @Override public IBinder onBind(Intent intent) { return null; } /** * 首次创建服务时。系统调用此方法进行一次性设置程序(在调用onStartCommend() 和onBind() 之前), * 如果服务已经运行,则不会调用此方法,此方法只会调用一次 */ @Override public void onCreate() { super.onCreate(); } /** * 1、每次通过startservice()方法启动service时,都被调用 * 2、当返回值为START_STICKY,表明service因为系统内存不足被回收后, * 在系统内存再次有空闲的时候,会重新启动该service,并调用该方法,但是其中的Intent为null * 这种适用于像后台播放器,天气预报等 */ @Override public int onStartCommand(Intent intent, int flags, int startId) { return super.onStartCommand(intent, flags, startId); } /** * 服务销毁时的回调 * 在这里实现一些资源的清理:1、子线程 2、监听器 3、 contentProvide */ @Override public void onDestroy() { super.onDestroy(); }}
public class BindActivity extends Activity { private Service mService; private ServiceConnection serviceConnection = new ServiceConnection(){ /** * 与服务器端交互的接口方法,绑定服务的时候被回调,在这个方法获取绑定的service传递过来的IBinder对象, * 通过这个IBinder对象,实现宿主和service的交互 */ @Override public void onServiceConnected(ComponentName name, IBinder service) { //获取Binder BindService.LocalBinder binder = (BindService.LocalBinder)service; mService = binder.getService(); } /** *当取消绑定的时候被回调,但正常情况下是不被调用的。 * 它的调用时机是当service被意外销毁时,activity主动关闭service时不回调用该方法 * 例如内存资源不足时,该方法才被自动调用 */ @Override public void onServiceDisconnected(ComponentName name) { } }; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); Intent intent = new Intent(this, BindService.class); //开启绑定 bindService(intent, serviceConnection, Service.BIND_AUTO_CREATE); }}
public class BindService extends Service { private LocalBinder localBinder = new LocalBinder(); /** * 创建Bind对象,返回给客户端即activity使用,提供数据交换的接口 */ public class LocalBinder extends Binder{ //声明这个方法,getService(),提供给客户端调用 BindService getService(){ //返回当前服务的对象,这样我们就可以在客户端调用service的public方法了 return BindService.this; } } /** * 绑定服务时才会调用 */ @Nullable @Override public IBinder onBind(Intent intent) { return localBinder; } /** * 首次创建服务时。系统调用此方法进行一次性设置程序(在调用onStartCommend() 和onBind() 之前), * 如果服务已经运行,则不会调用此方法,此方法只会调用一次 */ @Override public void onCreate() { super.onCreate(); } /** * 1、每次通过startservice()方法启动service时,都被调用 * 2、当返回值为START_STICKY,表明service因为系统内存不足被回收后, * 在系统内存再次有空闲的时候,会重新启动该service,并调用该方法,但是其中的Intent为null * 这种适用于像后台播放器,天气预报等 */ @Override public int onStartCommand(Intent intent, int flags, int startId) { return super.onStartCommand(intent, flags, startId); } @Override public boolean onUnbind(Intent intent) { return super.onUnbind(intent); } /** * 服务销毁时的回调 * 在这里实现一些资源的清理:1、子线程 2、监听器 3、 contentProvide */ @Override public void onDestroy() { super.onDestroy(); }}
转载地址:http://thaji.baihongyu.com/