?概念
Service(服务)是一个长期运行在后台,没有用户界面的应用组件,即使切换到另一个应用程序或者后台,服务也可以正常运行;
因此,服务适合执行一些不需要显示界面的后台耗时操作,比如下载网络数据,播放音乐等。
?定义一个服务
新建一个 ServiceTest 项目,然后右击 com.example.servicetest->New->Service->Service ;
会弹出如下图所示的窗口:
可以看到,这里我们将服务命名为 MyService(由于我之前创建过,所以左下角提示名字重复):
exported :表示是否允许除了当前程序之外的其他程序访问这个服务
- 如果设置为 true,则能够被调用或交互,通常如果一个服务需要跨进程使用需要这么设置,否则不能
- 设置为 false 时,只有同一个应用程序的组件或带有相同用户 ID 的应用程序才能启动或绑定该服务
enabled :指该服务是否能够被实例化
- 如果设置为 true,则能够被实例化,否则不能被实例化,默认值是 true
- 一般情况下,我们都会需要实例化,所以也可以选择不设置
需要注意的是,每一个服务都需要在 AndroidManifest.xml 文件中进行注册,
因为我们是通过 Android Studio New 的 Service ,
所以 Android Studio 默认帮我们在清单文件中添加对该 Service 的注册;
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.servicetest"> <application ......> <service android:name=".MyService" android:enabled="true" android:exported="true" /> <activity android:name=".MainActivity"> ...... </activity> </application> </manifest>现在观察 MyService 中的代码,如下所示:
public class MyService2 extends Service { public MyService2() { } @Override public IBinder onBind(Intent intent) { // TODO: Return the communication channel to the service. throw new UnsupportedOperationException("Not yet implemented"); } }可以看到,MyService 是继承自 Service 类的,说明这是一个服务;
目前,MyService 中可以算是空空如也,但有一个 onBind() 方法特别醒目,
这个方法是 Service 中唯一的一个抽象方法,所以必须要在子类里实现,后面会提及该方法的用法;
既然是定义一个服务,自然应该在服务中去处理一些事情,这时就要重写 Service 中的另外一些方法了;
MyService.java
public class MyService extends Service { public final static String TAG = "MyService"; public MyService() { } @Override public IBinder onBind(Intent intent) { // TODO: Return the communication channel to the service. throw new UnsupportedOperationException("Not yet implemented"); } @Override public void onCreate() { super.onCreate(); Log.d(TAG, "onCreate: "); } @Override public int onStartCommand(Intent intent, int flags, int startId) { Log.d(TAG, "onStartCommand: "); return super.onStartCommand(intent, flags, startId); } @Override public void onDestroy() { super.onDestroy(); Log.d(TAG, "onDestroy: "); } }可以看到,在该代码中重写了 onCreate(),onStartCommand() , onDestroy() 方法,并分别在它们的方法体中打印Log日志;
?启动和停止服务
启动和停止服务主要是借助 Intent 来实现的,下面就让我们在 ServiceTest 项目中尝试去启动以及停止 MyService;
首先修改 activity_main.xml 中的代码;
activity_main.xml
?