首页 > 学院 > 开发设计 > 正文

Service的使用

2019-11-09 18:18:50
字体:
来源:转载
供稿:网友

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塞给它


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表