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还有一种启动方式,我们明日再续哈。。电脑很不给力啊。