Service(一):认识service、绑定Service
Activity是与用户打交道的,而Service是在后台运行的。
这个程序介绍了下如何启动和停止一个Service,以及在后台打印消息,我添加了一些注释。
在activity_main中将布局改为线性布局,方向改为垂直并添加两个按钮,
android:orientation="vertical" <Button android:layout_width="69dp" android:layout_height="wrap_content" android:text="启动服务" android:id="@+id/btnStartService" android:layout_weight="0.06" /> <Button android:layout_width="69dp" android:layout_height="wrap_content" android:text="停止服务" android:id="@+id/btnStopService" android:layout_weight="0.06" />
在MainActivity中
intent = new Intent(MainActivity.this,MyService.class);//启动另一个活动 findViewById(R.id.btnStartService).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { startService(intent); } }); findViewById(R.id.btnStopService).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { stopService(intent); } });
在MyService中,负责在后台打印消息,注意如何创建一个线程:
public int onStartCommand(Intent intent, int flags, int startId) { //startService()启动时,这个函数自动启动 new Thread(){ //创建一个新线程 @Override public void run() { super.run(); while (true) { System.out.println("服务正在运行..."); try { sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } }.start(); return super.onStartCommand(intent, flags, startId); }
具体参考: http://www.jikexueyuan.com/course/683.html
接下来讲的是绑定Service。课程只讲了怎么用,但没有讲为什么用。整个过程和上节差不多,定义两个按钮来监听启动绑定Serivce功能。
在MainActivity中,增加两个按钮(注意接口监听的方式,和用匿名类的方式进行对比)
//采用接口的方式,下面要实现相应的接口 findViewById(R.id.btnBindService).setOnClickListener(this); findViewById(R.id.btnUnbindService).setOnClickListener(this); public void onClick(View v) { switch (v.getId()){ case R.id.btnStartService: startService(intent); break; case R.id.btnStopService: stopService(intent); break; case R.id.btnBindService: //第二个参数要求一个ServiceConnection,实现两个接口 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("System connected!"); } @Override public void onServiceDisconnected(ComponentName name) { }
同时在MyService的onBind函数中,修改其返回值。
@Override public IBinder onBind(Intent intent) { return new Binder(); }
Service生命周期
服务的生命周期涉及到两个函数,onCreate()和onDestroy()。按下启动服务和绑定服务时,第一个会被调用;反之,第二个会被调用。如果同时按下启动和绑定服务,只需要同时解除绑定
和停止服务,onDestroy()才会被调用。
按下启动服务,按返回键(退出activity)后,服务仍会运行;但对于绑定服务,服务却会退出运行(绑定就是activity和服务之间的事啊!)。
@Override public void onCreate() { super.onCreate(); System.out.println("Service Create"); } @Override public void onDestroy() { super.onDestroy(); System.out.println("Service destroy"); }
当不断按下启动服务时,onCreate只会调用一次,但onStartCommand()函数每次都会被调用(startService()每次都会调用它)。