号称前者为:持续不断,后者称为一退就断!
-------------------------------------------
接下来是startService的启动和停止的代码,该Activity的界面中包含2个按钮,一个按钮用于启动Service,另一个用于停止Service。
Activity的代码:
public class MainActivity extends Activity implements View.OnClickListener, ServiceConnection { private Button btnStartService; private Button btnStoptService;//定义两个按钮 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btnStartService = (Button) findViewById(R.id.btnStartService); btnStoptService = (Button) findViewById(R.id.btnStoptService);//获取两个按钮 btnStartService.setOnClickListener(this); btnStoptService.setOnClickListener(this);//按钮事件 } @Override public void onClick(View v) { Intent intent = new Intent(MainActivity.this, MyService.class); //1、创建启动Service的Intent switch (v.getId()) { case R.id.btnStartService: startService(intent); //2、启动指定的Service break; case R.id.btnStoptService: stopService(intent);//3、停止指定的Service break; } } }调用Context里的startService()、stopService()方法即可启动、停止Service,操作十分简单。而且程序使用了显式Intent来启动Service,因为从5.0开始,Google要求必须使用显式Intent启动Service组件。我个人觉得这样十分好,因为像Service这样使用频率高,而且用到的地方都是比较重要部位,这样会提高安全性吧。
接下来是通过startService()启动Service的生命周期:
context.startService() ->onCreate() ->onStartCommand() ->Service running
context.stopService() ->onDestroy() ->Service stop
如果Service已经运行,这是再点击启动按钮,就不会再调用onCreate() 方法,则只会调用onStartCommand()方法,而且可以执行多次.
总结得出 onCreate->onStartCommand(可以多次调用) ->onDestroy
--------------------------------
接下来是bindService()绑定本地Service,并与之通信。
当程序使用startService()来启动Service时,Service和访问者无法进行通信、交换数据。因此如果需要做以上动作,就应该使用bindService()和unbindService方法来启动、关闭Service。
Context的bindService()方法的完整方法签名为:bindService(Intent service,ServiceConnection conn,int flags)
Intent service:该参数通过Intent指定要启动的Service。
ServiceConnection conn:该对象用于监听访问者与Service之间的连接情况(一般情况为this,但要实现ServiceConnection)。
int flags:指定绑定时是否自动创建Service(该参数可以指定0(不自动创建)或BIND_AUTO_CREATE(自动创建))。
当开发Service类时,该Service类必须提供一个IBinder onBind(Intent intent)方法,在绑定本地Service的情况下,onBind(Intent intent)方法所返回的IBinder对象将会传给ServiceConnection对象里onServiceConndected()方法的service参数,这样访问者就可以通过IBinder对象与Service进行通信了。
实际上,开发通常会采用继承Binder(IBinder的实现类)的方式实现自己的IBinder对象。
接下来在Activity中绑定本地Service:
public class MyService extends Service { public MyService() { } @Override public IBinder onBind(Intent intent) { System.out.println("onBind"); return new Binder();//返回一个Binder对象 } @Override //当启动成功后会执行的方法 public int onStartCommand(Intent intent, int flags, int startId) { System.out.println("onStartCommand"); new Thread() { public void run() { super.run(); while (ture) { System.out.println("服务正在运行中..."); try { sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } }.start(); return super.onStartCommand(intent, flags, startId); } @Override public void onCreate() { super.onCreate(); System.out.println("onCreate"); } @Override public void onDestroy() { super.onDestroy(); System.out.println("onDestroy"); } @Override public boolean onUnbind(Intent intent) { System.out.println("onUnbind"); return super.onUnbind(intent); } }MainActivity 的代码如下
public class MainActivity extends Activity implements View.OnClickListener, ServiceConnection { private Button btnStartService; private Button btnStoptService; private Button btnBindService; //绑定服务 private Button btnUnBindService;//解除绑定服务 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btnStartService = (Button) findViewById(R.id.btnStartService); btnStoptService = (Button) findViewById(R.id.btnStoptService); btnBindService = (Button) findViewById(R.id.btnBindService);//绑定服务 btnUnBindService = (Button) findViewById(R.id.btnUnBindService);//解除绑定服务 btnStartService.setOnClickListener(this); btnStoptService.setOnClickListener(this); btnBindService.setOnClickListener(this);//按钮事件 btnUnBindService.setOnClickListener(this); } @Override public void onClick(View v) { Intent intent = new Intent(MainActivity.this, MyService.class); //指定Intent switch (v.getId()) { case R.id.btnStartService: startService(intent); break; case R.id.btnStoptService: stopService(intent); break; case R.id.btnBindService: bindService(intent, this, Context.BIND_AUTO_CREATE);//绑定服务 break; case R.id.btnUnBindService: unbindService(this);//解除绑定服务 break; } } @Override public void onServiceConnected(ComponentName name, IBinder service) {//服务被绑定成功的时候运行 System.out.println("onServiceConnected"); } @Override public void onServiceDisconnected(ComponentName name) { //进程被杀掉 或者 奔溃的时候运行 System.out.println("onServiceDisconnected"); }使用context.bindService()启动Service的经历:
总而言之,onCreate --> onBind(只一次,不可多次绑定) --> onUnbind --> onDestory。