本篇介绍Android四大组件之Service基本知识和常用操作。
Android四大组件分别为activity、service、content provider、broadcast receiver。
Service
Service是运行在手机后台的服务,没有界面,属于系统组件。service的创建和销毁是由操作系统控制,不能通过代码控制,即不能通过new来实例化service。但是可以通过代码进行服务状态的启动、停止及通信。
启动服务有两种方式:startService和bindService。区别如下:
- startService()启动服务,导致服务的onStartCommand()方法被调用。当服务是started状态时,其生命周期与启动它的组件无关,并且可以在后台无限期运行,即使启动服务的组件已经被销毁。因此,服务需要在完成任务后调用stopSelf()方法停止,或者由其他组件调用stopService()方法停止。
- bindService()启用服务,调用者与服务绑定在了一起,调用者一旦退出,服务也就终止。对应使用unbindService()来停止服务。
下面通过一个示例来演示service的基本操作:
1、添加一个service
在项目文件夹上右键选择Service添加到项目中。与Activity一样,也会在AndroidManifest.xml中增加一个service的配置项。
<service
android:name=".service.MyService" android:enabled="true"
android:exported="true" />
2、在service里重写方法
为了演示启动和停止服务的操作,我们需要重写如下4个方法。
当使用onBind方式启动服务时,需要一个Binder对象,通过该对象实现调用者与服务之间的通信。
public class MyService extends Service {
public MyService() {
}
private MyServiceBinder myBinder = new MyServiceBinder();
@Override
public IBinder onBind(Intent intent) {
System.out.println("服务onBind");
return myBinder;
}
@Override
public void onCreate() {
super.onCreate();
System.out.println("创建服务");
}
@Override
public void onDestroy() {
super.onDestroy();
System.out.println("销毁服务");
stopTimer();
}
public class MyServiceBinder extends Binder {
public MyService getService()
{
return MyService.this;
}
}
3、在activity里添加4个按钮控制service状态
添加的4个按钮分别为启动服务、停止服务、绑定服务、解绑服务。点击不同按钮,可在Logcat中查看服务状态的变化。
需要注意的是,只用使用bindService()启动服务时才能实现与service的通信,具体在
onServiceConnected函数中,通过binder类来获取运行中的service实例,再通过service内部公开的方法进行通信。
public class HelloActivity extends AppCompatActivity {
private Button btnStartService;
private Button btnStopService;
private Button btnBindService;
private Button btnUnbindService;
private MyService myService = null;
private ServiceConnection conn = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder binder) {
System.out.println("服务连接onServiceConnected");
myService = ((MyService.MyServiceBinder) binder).getService();
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_hello);
btnStartService = findViewById(R.id.btnStartService);
btnStopService = findViewById(R.id.btnStopService);
btnBindService = findViewById(R.id.btnBindService);
btnUnbindService = findViewById(R.id.btnUnbindService);
btnStartService.setOnClickListener(listener);
btnStopService.setOnClickListener(listener);
btnBindService.setOnClickListener(listener);
btnUnbindService.setOnClickListener(listener);
}
OnClickListener listener = new OnClickListener() {
public void onClick(View v) {
switch (v.getId()) {
case R.id.btnStartService:
startService(serviceIntent);
break;
case R.id.btnStopService:
stopService((serviceIntent));
break;
case R.id.btnBindService:
bindService(serviceIntent, conn, Context.BIND_AUTO_CREATE);
break;
case R.id.btnUnbindService:
unbindService(conn);
myService = null;
break;
}
}
};
}