Android的Service详解

一。Service的简单介绍:

Service是Android的四大组件之一,它是运行在后台的服务程序,可以与其它组件进行交互。


二。Service的两种类型:

1):本地服务(Local Service):用于应用程序内部。

2):远程服务(Remote Service):用于Android系统内部应用程序之间。


三。Service的生命周期:

Service的生命周期相对于Activity来说比较简单,OnCreate()--->OnStart()--->OnDestory()阶段。


四。Service的两种启动方式:

1):Context.startService():

调用Context.stopService()结束。它可以调用Service.stopSelf() 或 Service.stopSelfResult()来自己停止。不论调用了多少次startService()方法,你只需要调用一次stopService()来停止服务。

2):Context.bindService():

客户端建立一个到服务对象的连接,并通过那个连接来调用服务。连接以调用Context.bindService()方法建立,以调用 Context.unbindService()关闭。多个客户端可以绑定至同一个服务。如果服务此时还没有加载,bindService()会先加载它。

以下为google官方给出的两种启动方式的对比:




五。下面用一个Demo来说明本地服务的两种形式:

1.不需要和activity交互的本地服务:

MainActivity:

package com.android.douf;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class MainActivity extends Activity {
    private Button start,stop;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        start = (Button) findViewById(R.id.start);
        stop = (Button) findViewById(R.id.stop);
        //启动Service
        start.setOnClickListener(new OnClickListener()
        {
            
            @Override
            public void onClick(View v)
            {
                Intent intent = new Intent(MainActivity.this,LocalService.class);
                startService(intent);
            }
        });
        //停止Service
        stop.setOnClickListener(new OnClickListener()
        {
            
            @Override
            public void onClick(View v)
            {
                Intent intent = new Intent(MainActivity.this,LocalService.class);
                stopService(intent);
            }
        });
    }
}

LocalService:

package com.android.douf;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.util.Log;

public class LocalService extends Service
{
    private static final String TAG = "LocalService:";

    @Override
    public IBinder onBind(Intent intent)
    {
        Log.i(TAG, "onBind");
        return null;
    }
    //创建Service
    @Override
    public void onCreate()
    {
        Log.i(TAG, "onCreate");
        super.onCreate();
    }
   //销毁Service
    @Override
    public void onDestroy()
    {
        Log.i(TAG, "onDestory");
        super.onDestroy();
    }
   //开始Service
    @Override
    public void onStart(Intent intent, int startId)
    {
        Log.i(TAG, "onStart");
        super.onStart(intent, startId);
    }

}

点击start后点击stop的显示如下:


可以从日志中完全看出Service的整个生命周期。

点击start后再点击start后显示如下:


可以看出当Service创建后到没有停止之前,不管重复使用多少次,都不需要再次调用onCreate(),只需调用onStart()方法。

2.需要和Activity交互的本地服务:

一般情况下我们使用startService()来启动Service,但是这种情况下,我们无法获得Service对象的引用,当我们使用bindService()启动服务时则可以实现此功能。

LocalService:

package com.android.douf;

import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;

public class LocalService extends Service
{
    private IBinder binder = new MyBinder();

    @Override
    public IBinder onBind(Intent intent)
    {
        return binder;
    }

    public class MyBinder extends Binder
    {
        LocalService getService()
        {
            return LocalService.this;
        }        
    }

    public void excute()
    {
        System.out.println("通过Binder得到Service的引用来调用Service内部的方法");
    }

    @Override
    public void onDestroy()
    {
        // 当调用者退出(即使没有调用unbindService)或者主动停止服务时会调用
        super.onDestroy();
    }

    @Override
    public boolean onUnbind(Intent intent)
    {
        // 当调用者退出(即使没有调用unbindService)或者主动停止服务时会调用
        System.out.println("调用者退出了");
        return super.onUnbind(intent);
    }
}

LocalServiceActivity:

package com.android.douf;

import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;

public class LocalServiceActivity extends Activity
{
    private LocalService localService;
    
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        //将Service和Activity绑定,并启动Service
        Intent intent = new Intent(this, LocalService.class);
        bindService(intent, connection, BIND_AUTO_CREATE);
    }

    private ServiceConnection connection = new ServiceConnection()
    {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service)
        {
            //获取Service的对象的引用
            localService = ((LocalService.MyBinder) service).getService();
            System.out.println("Service连接成功");
            localService.excute();
        }

        @Override
        public void onServiceDisconnected(ComponentName name)
        {
            localService = null;
        }
    };

    @Override
    protected void onDestroy()
    {
        super.onDestroy();
        unbindService(connection);
        System.out.println("调用者退出绑定");
    }
    
}
这样当我们启动程序后,显示如下:


此时我们可以清楚的看见,我们在Activity中得到了Service对象的引用。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值