Android中的Service

来源:互联网 发布:装完软件蓝屏 编辑:程序博客网 时间:2024/06/05 02:22

1.Service介绍

Service是一种计算型组件,用于在后台执行一系列计算任务,服务有两种状态:启动状态和绑定状态。当服务组件处于启动状态时,Service可以在后台做一些计算,但不需要和外界有直接的交互。注意Service是运行在主线程的,所以后台耗时操作需要在子线程中完成。当Sevice处于绑定状态的时候,外界可以和Service组件进行通信。我们可以采用stopService和unBindService来停止一个服务组件。注意要在清单文件中配置服务

2.Service的生命周期

  • 当Sevice处于启动状态时的生命周期

    给出一个Service的简单实现

public class FirstService extends Service{    private static final String TAG = "FirstService";    //必须实现的方法,可以通过该对象与Service组件通信    @Override    public IBinder onBind(Intent intent)     {        Log.e(TAG, "onBind()方法执行了");        return null;    }    //Service第一次创建后回调此方法    @Override    public void onCreate()     {        super.onCreate();        Log.e(TAG, "onCreate()方法执行了");    }    //每次调用startService方法时,都会调用此方法    @Override    public int onStartCommand(Intent intent, int flags, int startId)     {        Log.e(TAG, "onStartCommand()方法执行了");        return super.onStartCommand(intent, flags, startId);    }    //Service被关闭时回调此方法    @Override    public void onDestroy()     {        super.onDestroy();        Log.e(TAG, "onDestroy()方法执行了");    }    //当该Service上绑定的所有客户端都断开连接时会调用该方法    @Override    public boolean onUnbind(Intent intent)    {        Log.e(TAG, "onUnbind()方法执行了");        return super.onUnbind(intent);    }}
<service android:name=".service.FirstService"/>
        //开启服务的按钮        mStartButton.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                intent = new Intent(MainActivity.this, FirstService.class);                startService(intent);            }        });        //停止服务的按钮        mStopButton.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                //会调用onDestroy()方法                intent = new Intent(MainActivity.this, FirstService.class);                stopService(intent);            }        });

当第一次开启服务的时候:
onCreate()——>onStartCommand()
截图如下:
这里写图片描述

当第二次点击开启服务的时候只会执行一个方法
onStartCommand()
截图如下:
这里写图片描述
我点击了四次,所以执行了四次onStartCommand()方法

  • 当Sevice处于绑定状态时的生命周期
public class BindService  extends Service{    private static final String TAG = "BindService";    private MyBinder binder = new MyBinder();    private int  count;    private boolean quit;    public class MyBinder extends Binder    {        public int getCount(){            return count;        }    }    @Override    public IBinder onBind(Intent intent)    {        Log.e(TAG, "onBind()方法执行了");        return binder;    }    @Override    public void onCreate()     {        super.onCreate();        Log.e(TAG, "onCreate()方法执行了");        new Thread()        {            @Override            public void run()            {                while (!quit)                {                    try                    {                        Thread.sleep(1000);                    }                    catch (Exception e)                    {                    }                    count++;                }            }        }.start();    }    @Override    public int onStartCommand(Intent intent, int flags, int startId)     {        Log.e(TAG, "onStartCommand()方法执行了");        return super.onStartCommand(intent, flags, startId);    }    @Override    public void onDestroy()     {        super.onDestroy();        Log.e(TAG, "onDestroy()方法执行了");        quit=true;    }    @Override    public boolean onUnbind(Intent intent)    {        Log.e(TAG, "onUnbind()方法执行了");        return true;    }}
 private ServiceConnection conn = new ServiceConnection() {        @Override        public void onServiceConnected(ComponentName name, IBinder binder) {            //服务连接            mBinder = (BindService.MyBinder) binder;        }        @Override        public void onServiceDisconnected(ComponentName name) {            //服务断开        }    };        //绑定服务        mBindService.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                mIntent = new Intent(SecondActivity.this, BindService.class);                bindService(mIntent, conn, Service.BIND_AUTO_CREATE);            }        });        //解除绑定        mUnbindService.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                if(conn!=null){                    unbindService(conn);                }            }        });

当绑定Service的时候,生命周期
onCreate()——>onBind()
运行截图如下:
这里写图片描述

当解除绑定Service的时候,生命周期
onUnbind()——>onDestroy()
运行截图如下:
这里写图片描述

3.绑定Service的demo

SecondActivity.java

package service.zhoujian.com.serviceinstance.activity;import android.app.Activity;import android.app.Service;import android.content.ComponentName;import android.content.Intent;import android.content.ServiceConnection;import android.os.Bundle;import android.os.IBinder;import android.view.View;import android.widget.Button;import android.widget.Toast;import butterknife.ButterKnife;import butterknife.InjectView;import service.zhoujian.com.serviceinstance.R;import service.zhoujian.com.serviceinstance.service.BindService;/** * Created by zhoujian on 2016/11/10. */public class SecondActivity extends Activity {    private BindService.MyBinder mBinder;    private Intent mIntent;    @InjectView(R.id.bind_service)    Button mBindService;    @InjectView(R.id.unbind_service)    Button mUnbindService;    @InjectView(R.id.bind_state)    Button mBindState;    //option+command+k   对生命周期方法进行排序    private ServiceConnection conn = new ServiceConnection() {        @Override        public void onServiceConnected(ComponentName name, IBinder binder) {            //服务连接            mBinder = (BindService.MyBinder) binder;        }        @Override        public void onServiceDisconnected(ComponentName name) {            //服务断开        }    };    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_second);        ButterKnife.inject(this);        clickEvent();    }    private void clickEvent()    {        //绑定服务        mBindService.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                mIntent = new Intent(SecondActivity.this, BindService.class);                bindService(mIntent, conn, Service.BIND_AUTO_CREATE);            }        });        //解除绑定        mUnbindService.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                if(conn!=null){                    unbindService(conn);                }            }        });        //绑定状态        mBindState.setOnClickListener(new View.OnClickListener()        {            @Override            public void onClick(View view)            {                if(mBinder!=null){                    Toast.makeText(SecondActivity.this, "Service的count值为:"+mBinder.getCount(), Toast.LENGTH_SHORT).show();                }            }        });    }    @Override    protected void onRestart() {        super.onRestart();    }    @Override    protected void onStart() {        super.onStart();    }    @Override    protected void onResume() {        super.onResume();    }    @Override    protected void onPause() {        super.onPause();    }    @Override    protected void onStop() {        super.onStop();    }    @Override    protected void onDestroy() {        super.onDestroy();    }}

BindService.java

package service.zhoujian.com.serviceinstance.service;import android.app.Service;import android.content.Intent;import android.os.Binder;import android.os.IBinder;import android.util.Log;/** * Created by zhoujian on 2016/11/10. */public class BindService  extends Service{    private static final String TAG = "BindService";    private MyBinder binder = new MyBinder();    private int  count;    private boolean quit;    public class MyBinder extends Binder    {        public int getCount(){            return count;        }    }    @Override    public IBinder onBind(Intent intent)    {        Log.e(TAG, "onBind()方法执行了");        return binder;    }    @Override    public void onCreate()    {        super.onCreate();        Log.e(TAG, "onCreate()方法执行了");        new Thread()        {            @Override            public void run()            {                while (!quit)                {                    try                    {                        Thread.sleep(1000);                    }                    catch (Exception e)                    {                    }                    count++;                }            }        }.start();    }    @Override    public int onStartCommand(Intent intent, int flags, int startId)    {        Log.e(TAG, "onStartCommand()方法执行了");        return super.onStartCommand(intent, flags, startId);    }    @Override    public void onDestroy()    {        super.onDestroy();        Log.e(TAG, "onDestroy()方法执行了");        quit=true;    }    @Override    public boolean onUnbind(Intent intent)    {        Log.e(TAG, "onUnbind()方法执行了");        return true;    }}
<service android:name=".service.BindService"/>

运行截图:

这里写图片描述

4.IntentService

  • IntentSevice不会阻塞主线程,可以自己处理耗时任务,最重要的一个方法onHandleIntent()。
  • IntentService会创建单独的worker线程来处理所有的Intent请求。
  • onHandleIntent()方法实现的代码,无需考虑多线程问题。
  • 当所有请求处理完成后,IntentSevice会自动停止,无需调用stopSelf()方法来停止该Service。

  • MyIntentService.java
public class MyIntentService extends IntentService{   private static final String TAG = "MyIntentService";   private long mLong;   public  MyIntentService()    {        super("MyIntentService");        Log.e(TAG,"MyIntentService()方法执行了");    }    @Override    protected void onHandleIntent(Intent intent)    {        Log.e(TAG,"onHandleIntent()方法执行了");        //模拟耗时任务,让线程暂停20s        //这段代码要是放在普通Service中会阻塞主线程。ANR异常,放在IntentSevice中不会有问题        mLong = System.currentTimeMillis() + 20 * 1000;        while (System.currentTimeMillis()<mLong)        {            synchronized (this)            {                try                {                    //线程等待20秒                    wait(mLong-System.currentTimeMillis());                }                catch (Exception e)                {                    e.printStackTrace();                }            }        }    }    @Override    public void onDestroy() {        super.onDestroy();        Log.e(TAG,"onDestroy()方法执行了");    }}
<service android:name=".service.MyIntentService"/>
        //开启服务的按钮        mStartButton.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                intent = new Intent(MainActivity.this, MyIntentService.class);                startService(intent);            }        });        //停止服务的按钮        mStopButton.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                intent = new Intent(MainActivity.this, MyIntentService.class);                stopService(intent);            }        });

当开启服务的时候,IntentService生命周期如下:
首先执行构造方法,然后执行onHandleIntent()方法
MyIntentService()——>onHandleIntent()
这里写图片描述

当停止服务的时候,IntentService生命周期
onDestroy()
截图如下:
这里写图片描述

0 0
原创粉丝点击