Service是Android四大组件之一,他主要负责后台服务,长时间运行。
java
一:主要特色
ide
(1)优先级大于Activity,即便Activity被中止后,他也不会轻易被终止
测试
(2)即便被系统终止,在紫铜回复资源后,Service也会自动回复运行状态
this
(3)×××面操做,后台一致运行 spa
二:生命周期
线程
生命周期:启动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。