Service是Android四大组件之一,他主要负责后台服务,长时间运行。

   一:主要特点

   (1)优先级大于Activity,即使Activity被停止后,他也不会轻易被终止

   (2)即使被系统终止,在紫铜回复资源后,Service也会自动回复运行状态

   (3)×××面操作,后台一致运行  

   二:生命周期

   生命周期启动Activity之后,会执行一次仅一次onCreate方法创建Service和一次onStartCommand方法,而多次启动时onStartCommand方法则会执行多次,终止Service时,则会执行到onDestory方法

   触发的方法有:onCreate、onStartCommand、onDestory

   三:创建及方法

   使用Service时,必须继承自Service抽象类,实现其中的方法。常用的方法有:

   (1)onCreate():非必须重写。负责Service的创建,初始化,或者全部工作。启动Service时执行一次,且只执行一次

   (2)onStartCommand():非必须重写。负责Service应该完成的工作。每次启动Service时,都会执行一次

   (3)onDestory():释放资源的部分。关闭时只执行一次

   四:启动、停止方式

   1:不与用户交互

   启动方式:startService(intent对象)

   终止方式:stopService(intent对象)    

   五:不与用户交互时的Service

   测试方法:

   ◆创建类MyService继承自Service,重写onCreate、onStartCommand、onDestory三个方法,在方法体里面各添加一句输出语句

public class MyService extends Service {
    // 与用户交互时触发的方法,但是两种生命周期都必须重写
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }
    //用来创建Service,完成初始化,工作都可以
    @Override
    public void onCreate() {
        System.out.println("onCreate");
        super.onCreate();
    }
    // 用来标识Activity生命周期的开始,完成工作
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        System.out.println("OnStartCommand");
        return super.onStartCommand(intent, flags, startId);
    }
    // 两者生命周期的结束
    @Override
    public void onDestroy() {
        System.out.println("onDestory");
        super.onDestroy();
    }
}

   ◆在主界面上,添加两个按钮,一个是start,一个为stop,为两个按钮添加监听。  

public class MainActivity extends Activity implements OnClickListener {
private Intent intent;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        findViewById(R.id.start).setOnClickListener(this);//给启动按钮加监听
        findViewById(R.id.stop).setOnClickListener(this);//给终止按钮加监听
        intent = new Intent(this,MyService.class);
    }
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.start:
            startService(intent);//启动Service
            break;
        case R.id.stop:
            stopService(intent);//终止Service
            break;
        }
    }
}

    看后台输出,可能出现的情况为:  

(1)第一次单击Start按钮后:执行了一次onStart方法和onStartCommand方法
(2)第二次单击Start按钮后:仅执行了一次onStartCommand方法
(3)接下来每一次单击start按钮后,都仅执行一次onStartCommand方法
(4)点击Stop按钮后:执行了一次onDestory方法。

  六:具体应用

   功能实现:在Service中提供一个计时器,让他计数,当start和stop时观察结果。

   ◆MyService中

public class MyService extends Service{
    private Timer timer;//计时器声明
    private TimerTask task;//计时器Task声明
    private int i=0;//变量初始化
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }
                                                                                                                         
    @Override
    public void onCreate() {
        super.onCreate();
        System.out.println("onCreate-----");
    }
                                                                                                                         
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        System.out.println("onStartCommand-----");
        start();//把启动计时器的方法放在这个方法中
        return super.onStartCommand(intent, flags, startId);
    }
    @Override
    public void onDestroy() {
        super.onDestroy();
        stop();//把关闭计时器的方法放在这个方法中
        System.out.println("onDestroy-----");
    }
    //定时器的启动
    public void start(){
        timer = new Timer();//实例化计时器
        task = new TimerTask() {//实例化计时器Task
                                                                                                                                 
            @Override
            public void run() {
                i++;//变量自增
                System.out.println(i);//打印输出
                                                                                                                                     
            }
        };
        timer.schedule(task, 1000, 1000);//启动计时器
    }
    //定时器的关闭
    public void stop(){
        timer.cancel();
    }
}

   ◆主界面同上

   ◆结果显示

   (1)第一次单击start:出发了onCreate和onStartCommand方法,onStartCommand中的计时器开始工作循环计数输出

   (2)单击返回键后,任然继续输出

   (3)单击Stop之后,停止输出,即执行了onDestory方法。

08-31 13:25:45.703: I/System.out(2055): onCreate----//第一次单击start之后
08-31 13:25:45.703: I/System.out(2055): onStartCommand-----
08-31 13:25:46.764: I/System.out(2055): 1
08-31 13:25:47.779: I/System.out(2055): 2
08-31 13:25:48.815: I/System.out(2055): 3
08-31 13:25:49.883: I/System.out(2055): 4
08-31 13:25:50.893: I/System.out(2055): 5
08-31 13:25:51.922: I/System.out(2055): 6
08-31 13:25:52.923: I/System.out(2055): 7
08-31 13:25:53.991: I/System.out(2055): 8//单击返回键后继续输出
08-31 13:25:54.983: I/System.out(2055): 9
08-31 13:25:55.998: I/System.out(2055): 10
08-31 13:25:57.000: I/System.out(2055): 11
08-31 13:25:57.433: I/System.out(2055): 12
08-31 13:25:58.456: I/System.out(2055): 13
08-31 13:25:59.039: I/System.out(2055): 14
08-31 13:25:59.474: I/System.out(2055): 15
08-31 13:25:59.474: I/System.out(2055): onDestory----//单击stop之后

   注意:Service是单线程,如果你多次单击Start之后,即使你单击了同样次数的stop按钮,也只能终止你第一触发的那个Service。


   Service还有一种启动方式,我们明日再续哈。。电脑很不给力啊。Android后台服务---无交互时的Service_Service