Service写起来步骤有些多,而且有的写错了就不会有效果,所以我整理一下,以后自己看着能好想起来
Service是Android四大组件之一,主要为了程序退出后仍然可以存在.但是Service实际运行在主线程,请不要做太耗时的操作,有耗时操作可以在Service中再建一个子线程来完成
那么来写一下Service的基本使用方法吧
首先我们需要新建一个类来继承Service 然后必须在AndroidManifest中注册,与activity同级
public class NewService extends Service{ @Nullable @Override public IBinder onBind(Intent intent) { return null; }}写完直接复写出来的方法是onBind(),这个方法很重要,不过返回值暂时为null在这时我们就要了解一下Service的生命周期了,Service的生命周期有两种,而这是由它的启动方式决定的.
两种启动方式分别为.context.startService()和 context.bindService()第一种是直接开始,这一种服务可以在程序结束后继续运行
第二种是将服务与组件(比如Activity)绑定,程序结束时必须解除绑定,不然会报错,单纯被绑定的服务在绑定的组件结束时也会结束,但是绑定的服务可以获得一个binder对象,以此来调用服务中的方法,对服务进行操作,如音乐播放器 不过Service是可以同时被start和bind的
那么我们绑定服务时获取的Ibinder对象就是我们复写的onBind方法的返回值,但是服务中现在没有Ibinder对象,我们需要在服务中创建一个类继承自Binder
并且在这个类中写我们希望操作服务做的方法 比如我这里传入了发短信的数据,在send==true的时候,我会在onCreate中进行发短信的操作(我要做的是延时发送,所以没有把所有操作放在Binder中)
public class MyBinder extends Binder { public void sendmsg(int time, String content, String num) { time1 = time; content1 = content; num1 = num; send = true; }}这时候我们有了一个MyBinder内部类,但是还没有一个对象 so我们要实例化一个对象PRivate MyBinder myBinder;然后我们要复写onCreate方法 onCreate方法是Service的两种生命周期的第一个方法,一定会执行,并且只执行一次
会变化的变量初始化操作不要写在上面,写在生命周期中然后我们在onCreate中初始化对象 并且将onBind方法中的返回值改为这个对象(这一步一定不要忘)
@Overridepublic void onCreate() { super.onCreate(); myBinder = new MyBinder();这时我们有了binder对象,有了binder类中我们要做的操作,并且已经注册了,那么我们服务这个类的所有操作就完成了,接下来我们要找到组件来绑定和使用它.首先我们需要一个连接服务的对象 和一个对服务进行操作的binder对象(这个对象由Service提供) 还有一个Intent(用于启动服务,两种启动方式都需要)
private ServiceConnection serviceConnection;private MyService.MyBind myBind;private Intent start;start = new Intent(this, NewService.class);在onCreate中初始化的时候会直接复写两个方法
serviceConnection = new ServiceConnection() { /** * 当服务连接成功的时候会回调--有坑 Secveice中的bind返回值为空时不调用此方法 * @param componentName * @param iBinder */ @Override public void onServiceConnected(ComponentName componentName, IBinder iBinder) { Log.e(TAG, "onServiceConnected:-------- "); //将onbind方法的返回值,赋值到myBinder上 myBind = (NewService.MyBind) iBinder; } /** * 当服务,被杀死时会回调,例如,内存不够被干掉 * @param componentName */ @Override public void onServiceDisconnected(ComponentName componentName) { Log.e(TAG, "onServiceDisconnected:--------------------- "); }};这时候我们还没有启动Service
Service 的startService和stopService需要一个Intent 绑定服务需要一个Intent ,一个连接服务对象,还有一个flags(这个我一直是选Service.BIND_AUTO_CREATE)
服务解除绑定需要 一个连接服务对象(只要绑定过,那么这个Activity退出时必须做的) 当既Start又bind的时候我们需要既stop又unbind
startService(start);stopService(start);//绑定服务bindService(start, serviceConnection, Service.BIND_AUTO_CREATE);//解绑服务unbindService(serviceConnection);我们只有在绑定服务后才可以使用binder
使用很简单
myBind.sendmsg(1,"这是一条延时发送的短信,延时一秒","88888");这样我们就可以与Service进行交互了
-------------------------------------------------------------------底下有的是别的网站摘下来的--------------------------------------------------------------------------------------------------------
重写生命周期的回调方法
onCreate()何时:首次创建服务时。注意:若服务已在运行,则不会调用此方法。onDestroy()何时:当服务不再使用且将被销毁时。作用:清理所有资源,如线程、注册的侦听器、接收器等。 注意:这是服务接收的最后一个调用。int onStartCommand(Intent intent, int flags, int startId)何时:当另一个组件调用startService()
请求启动服务时。参数:intent:startService()
启动服务时传入的Intent;startId:唯一id标识此次服务的启动请求。返回值:描述系统应该如何在服务终止的情况下继续运行服务。IBinder onBind(Intent it)何时:当另一个组件调用bindService()
与服务绑定时。返回值:供客户端与服务进行通信。/** * Created by dllo on 17/1/16. * 要使用服务,需要先建立一个类,继承Service抽象类 * 实现方法 * 还要去Manifest文件中注册一下 *//** * 如何与服务进行交换 * 推荐使用Binder形式 * 如何使用Binder * 第一步: 建立一个MyService的内部类Mybinder类,继承Binder * 第二步: 声明一个成员的MyBinder对象,在服务的onCreate方法中 * 对MyBinder初始化 * 第三步: 将这个MyBinder对象,作为OnBind方法的返回值返回 * 第四步: 在与服务绑定的类中声明一个MyBinder的成员变量 * 在OnServiceConnected回调中对该成员变量进行赋值(ServiceConnection 中的复写方法) * 这样,服务中的myBinder对象就被传递到了绑定服务的泪中 * 通过操作该myBinder对象,调用该MyBinder类中的各种方法 * 就可以操作MyService中的各种属性 */当Service已经被一个Activity绑定时,另一个Activity绑定时不会走onBind方法,但会获得一个binder,这个binder是最开始绑定时返回的binder,存在第三方中,再有绑定的就直接把binder塞给它
新闻热点
疑难解答