Android四大组件之服务(Service)的探究
(内容来自《Android第一行代码(第二版)》)
附:Android基础之四大组件
本文目录
1. Android多线程编程
2. 服务的基本用法
2.1 定义一个服务
2.2 启动和停止服务
2.3 活动和服务进行通信
3. 服务的生命周期
4. 更多关于服务
4.1 使用前台服务
4.2 使用IntentService
5. 服务实践演示Dmeo
分割线
1. Android多线程编程
Android多线程编程
2. 服务的基本用法
2.1 定义一个服务
我们首先新建一个ServiceTest项目
然后右击com.example.servicetest新建一个服务
服务命名为MyService
Exported
属性表示是否允许除了当前之外的其他程序访问这个服务Enabled
属性表示是否启用这个服务这里将两个属性都选上
图片.png
下面是自动生成的代码
public class MyService extends Service {
public MyService() {
}
@Override
public IBinder onBind(Intent intent) {
// TODO: Return the communication channel to the service.
throw new UnsupportedOperationException("Not yet implemented");
}
}
可以看到,MyService是继承自Service类的,说明这是一个服务
其中有个onBind()方法,这是Service中唯一的一个抽象方法,所以必须在子类中实现
下面我们重写Service中的另外一些方法
public class MyService extends Service {
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();
}
@Override
public int onStartCommand(Intent intent,int flags,int startId){
return super.onStartCommand(intent,flags,startId);
}
@Override
public void onDestroy(){
super.onDestroy();
}
}
可以看到,这里我们又重写了onCreate()
、onStartCommand()
和onDestroy()
这3个方法,它们是每个服务中最常用到的3个方法了。其中:
-
onCreate()
方法会在服务创建的时候调用 -
onStartCommand()
方法会在每次服务启动的时候调用 -
onDestroy()
方法会在服务销毁的时候调用。
通常情况下,如果我们希望服务一旦启动就立刻去执行某个动作,就可以将逻辑写在onStartCommand()
方法里。而当服务销毁时,我们又应该在onDestroy()
方法中去回收那些不再使用的资源。
另外需要注意,每一个服务都需要在AndroidManifest.xml文件中进行注册才能生效,不知道你有没有发现,这是Android四大组件共有的特点。不过相信你已经猜到了,智能的Android Studio早已自动帮我们将这一步完成了。打开AndroidManifest.rml文件瞧一瞧,代码如下所示:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.servicetest">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service
android:name=".MyService"
android:enabled="true"
android:exported="true">
</service>
</application>
</manifest>
这样的话就已经将一个服务定义好了。
2.2 启动和停止服务
接下来我们考虑如何去启动以及停止这个服务
-
修改activity_main.xml代码
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/start_service"
android:text="Start Service"/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/stop_service"
android:text="Stop Service"/>
</LinearLayout>
-
修改MainActivity
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button startService = (Button) findViewById(R.id.start_service);
Button stopService = (Button) findViewById(R.id.stop_service);
startService.setOnClickListener(this);
stopService.setOnClickListener(this);
}
@Override
public void onClick(View v){
switch (v.getId()){
case R.id.start_service:
Intent startIntent = new Intent(this,MyService.class);
startService(startIntent);
break;
case R.id.stop_service:
Intent stopIntent = new Intent(this,MyService.class);
stopService(stopIntent);
break;
default:
break;
}
}
}
可以看到:
这里在onCreate()
方法中分别获取到了Start Service
按钮和Stop Service
按钮的实例,并给它们注册了点击事件。
然后在Start Service
按钮的点击事件里,我们构建出了一个Intent对象,并调用startService()方法来启动 MyService这个服务。在Stop Serivce
按钮的点击事件里,我们同样构建出了一个Intent对象,并调用stopService()方法来停止 MyService这个服务。
startService()和stopService()方法都是定义在 Context类中的,所以我们在活动里可以直接调用这两个方法。注意,这里完全是由活动来决定服务何时停止的,如果没有点击Stop Service
按钮,服务就会一直处于运行状态。
那服务有没有什办法让自已停止下来呢?当然可以,只需要在MyService的任何一个位置调用stopSelf()
方法就能让这个服务停止下来了。
那么接下来又有一个问题需要思考了,我们如何才能证实服务已经成功启动或者停止了呢?最简单的方法就是在MyService的几个方法中加入打印日志,如下所示
图片.png
现在运行程序,点击Start Service
按钮,观察logcat中的打印日志
MyService中的onCreate()
和onStartCommand()
方法都执行了,说明这个服务启动成功了。
然后再点击一下Stop Service
按钮,观察logcat中的日志
说明MyService确实成功停止下来了
话说回来,虽然我们已经学会了启动服务以及停止服务的方法,不知道你心里现在有没有个疑惑,那就是onCreate()
方法和onStartCommand()
方法到底有什么区别呢?因为刚刚点击Start Service
按钮后两个方法都执行了。
其实onCreate()
方法是在服务第一次创建的时候调用的,而onStartCommand()
方法则在每次启动服务的时候都会调用,由于刚オ我们是第一次点击Start Service
按钮,服务此时还未创建过,所以两个方法都会执行,之后如果你再连续多点击几次Start Service
按钮,你就会发现只有onStartCommand()
方法可以得到执行了。
以下内容后续更新......