服务的启动和生命周期
一、采用start的方式开启服务
生命周期如下:
onStart()过时了
开启服务: onCreate()--> onStartCommand() ---> onDestory();
如果服务已经开启,不会重复的执行onCreate(),而是会调用onStart()或onStartCommand();
服务停止的时候 onDestory().
服务只会被停止一次
二、服务还有一种开启方式,绑定的方式开启服务。
onCreate() ---> onBind() ---> onUnbind() --> onDestory();
绑定服务不会调用onstart或者onstartcommand方法;
三、混合调用的服务的生命周期:
服务长期后台运行,又想调用服务的方法:
1.start方式开启服务(保证服务长期后台运行)
2.bind方式绑定服务(保证调用服务的方法)
3.unbind解除绑定服务
4.stopService停止服务。
四、两种开启服务方法的区别。
1.start方式开启服务
一旦服务开启跟调用者(开启者)就没有任何关系了。
开启者退出或销毁,服务还在后台长期的运行。
开启者没有办法去调用服务里面的方法。
2.bind的方式开启服务
绑定服务,调用者挂了,服务也会跟着挂掉。不求同时生,但求同时死。
开启者可以调用服务里面的方法。
草根、黄牛、铁倒部
一。创建铁倒部
铁倒部提供卖票的服务,但是草根无法直接从铁倒部买票。铁倒部有个职务叫黄牛,当有人意图连接时,就把黄牛提供出去。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
/** * 一。创建一个服务 * 铁倒部。内部养着一个投机倒把者 */ public class RailroadService extends Service { /*** 1.第一步服务要暴露方法 必须要有一个中间人 */ public class Scalper extends Binder { /* 买票 * @param money 黄牛公开的价格。 */ public void callMethodInService(int money){ // 车票的实际价格 if(money>=50){ methodInService(); // 调用服务中的方法 }else{ Toast.makeText(getApplicationContext(), "多准备点钱。", 0).show(); } } } /* 1.服务被创建 */ @Override public void onCreate() { System.out.println("1.服务生命周期oncreate"); super.onCreate(); } /*** 2.实现服务成功绑定的代码 ,返回一个中间人 * 有人买票时,找到的只能是黄牛 */ /* 2.服务被绑定 */ @Override public IBinder onBind(Intent intent) { System.out.println("2.服务生命周期onBind:" + intent.getAction()); return new Scalper(); } /* 3.解除绑定。不坐火车了 */ @Override public boolean onUnbind(Intent intent) { System.out.println("服务生命周期onunbind:" + intent.getAction()); return super.onUnbind(intent); } /* 4.服务销毁 */ @Override public void onDestroy() { System.out.println("服务生命周期ondestory"); super.onDestroy(); } /** * 这是服务里面的一个方法 */ public void methodInService(){ Toast.makeText(this, "铁倒部服务给你准备好票了", 0).show(); } } |
二。注册服务
三。草根
1.布局。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<Button android:layout_width="fill_parent" android:layout_height="wrap_content" android:onClick="bind" android:text="1.绑定服务" /> <Button android:onClick="call" android:text="3.调用服务里面的方法" /> <Button android:onClick="unbind" android:text="解除绑定服务" /> |
2.主程
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
/*** * 四。绑定,调用服务 */ public class MainActivity extends ActionBarActivity { private ScalperConnection scalperConn; // 服务连接器 private Scalper scalper; // 黄牛 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } /** 1. 绑定服务 **/ public void bind(View view) { // 1)想使用服务的意图-联系铁倒部。 Intent intent = new Intent(this, RailroadService.class); // 此时不必注册即可本地调用 //Intent intent = new Intent(); //intent.setAction("com.cuiweiyou.myservice.localRailroadService"); // 须注册action name // 2)初始化服务连接器-找路子 scalperConn = new ScalperConnection(); // 3)绑定服务(想干啥,怎么干,如何绑定) bindService(intent, scalperConn, BIND_AUTO_CREATE); } /** 3. 调用服务里面的方法。**/ public void call(View view) { /** 4.通过黄牛调用铁倒部的方法。 **/ scalper.callMethodInService(55); } /* 解除绑定服务 */ public void unbind(View view) { // 买不起就不买了 unbindService(scalperConn); } /* 为了买票饿死 */ @Override protected void onDestroy() { System.out.println("啊啊啊,我是activity,我挂了"); super.onDestroy(); } /** * 2.服务连接器 */ private class ScalperConnection implements ServiceConnection { // 当服务被连接的时候、调用服务被成功绑定的时候调用 @Override public void onServiceConnected(ComponentName name, IBinder service) { System.out.println("Activity服务连接器得到:" + name.getClassName()); // 如果有人找上门来,就让黄牛出面 scalper = (Scalper)service; } // 当服务失去连接的时候调用(一般进程挂了,服务被异常杀死) @Override public void onServiceDisconnected(ComponentName name) { System.err.println("服务意外终止---"); } } } |
本文由崔维友 威格灵 cuiweiyou vigiles cuiweiyou 原创,转载请注明出处:http://www.gaohaiyan.com/287.html
承接App定制、企业web站点、办公系统软件 设计开发,外包项目,毕设