Android Service 使用

2023-11-21 18:25:56 浏览数 (3)

Android 系统中 Activity 承载了界面组件,负责与用户交互,Service 则在后台“默默运行”,给用户提供“服务”,它不与用户直接交互。如果说 Activity 是剧院的大舞台,是呈现“节目”并且负责和“观众互动”,那么Service 就是这个“舞台”的“幕后”,它为现场的活动做“幕后保障”工作。

一起动手实验,认识一下Service 吧!

实验步骤:

  1. 创建项目 ServiceSample
  2. 创建Service ,并配置
  3. 启动、关闭Service
  4. 运行项目

1. 创建项目 ServiceSample

首先在 Android Studio 中创建项目名为 ServiceSample,包名设置为 com.guagua.servicesample

2. 创建Service ,并配置

2.1 待项目初始化完成后,右击项目包名,新建Service
ServiceService

设置组件的名称为 MyService

2.2 编写MyService代码

覆写 onCreate()onStartCommand()onDestroy() 函数,这里我们对这些函数分别加上日志;函数 onBind() 暂时不做处理。

Java 代码

代码语言:java复制
public class MyService extends Service {
    private static final String TAG = "MyService";

    @Override
    public void onCreate() {
        Log.i(TAG, "onCreate()");
        super.onCreate();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.i(TAG, String.format("onStartCommand(flags:%d, startId:%d)", flags, startId));
        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public void onDestroy() {
        Log.i(TAG, "onDestroy()");
        super.onDestroy();
    }

    ......
}

Kotlin 代码

代码语言:text复制
class MyService : Service() {
    companion object{
        private const val TAG = "MyService"
    }

    override fun onCreate() {
        Log.i(TAG, "onCreate()")
        super.onCreate()
    }

    override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
        Log.i(TAG, "onStartCommand(flags:$flags, startId:$startId)")
        return super.onStartCommand(intent, flags, startId)
    }

    override fun onDestroy() {
        Log.i(TAG, "onDestroy()")
        super.onDestroy()
    }

    ......
}
2.3 配置AndroidManifest.xml 清单文件

创建好的Service需要在AndroidManifest.xml 清单文件中注册才能使用:

代码语言:html复制
    <application
        ......

        <service
            android:name=".MyService"
            android:enabled="true"
            android:exported="true"/>
    </application>

3. 启动、关闭Service

3.1 编辑布局文件 activity_main.xml
代码语言:html复制
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:gravity="center_horizontal"
    android:padding="15dp"
    tools:context=".MainActivity">

    <Button
        android:id="@ id/startBtn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="start" />

    <Button
        android:id="@ id/stopBtn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="stop" />

</LinearLayout>

添加了两个按钮,分别用于启动、关闭Service

3.2 编写 MainActivity,注册监听事件

打开MainActivity,为刚才增加的按钮注册点击事件监听,

Java 代码

代码语言:java复制
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button startBtn = findViewById(R.id.startBtn);
        startBtn.setOnClickListener(view -> {
            Log.i(TAG, "startService clicked.");
            Intent intent = new Intent(this, MyService.class);
            startService(intent);
        });

        Button stopBtn = findViewById(R.id.stopBtn);
        stopBtn.setOnClickListener(view -> {
            Log.i(TAG, "stopService clicked.");
            Intent intent = new Intent(this, MyService.class);
            stopService(intent);
        });
    }

Kotlin 代码

代码语言:text复制
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val startBtn = findViewById<Button>(R.id.startBtn)
        startBtn.setOnClickListener {
            Log.i(TAG, "startService clicked.")
            val intent = Intent(this, MyService::class.java)
            startService(intent)
        }

        val stopBtn = findViewById<Button>(R.id.stopBtn)
        stopBtn.setOnClickListener {
            Log.i(TAG, "stopService clicked.")
            val intent = Intent(this, MyService::class.java)
            stopService(intent)
        }
    }

这里调用了 startService()stopService() 函数,用于启动、关闭Service

4. 运行项目

4.1 点击运行项目:
s1s1
4.2 点击“start”按钮,启动Service

查看日志:

loglog

可以看到点击启动按钮后,MyService被启动,onCreate()onStartCommand() 函数被调用.

4.3 查看系统的服务运行统计信息

首先要开启手机的“开发者模式”,然后打开 SettingsDeveloper optionsRunning services

bacbac

我们的项目 ServiceSample在列表中,点击查看详情:

papa

MyService 正在运行。

4.4 接着点击“start”按钮,多次启动Service

看到日志:

l2l2

每点击一次“start”按钮,就会调用一次 ActivitystartService()函数,同时会调用一次MyServiceonStartCommand() 函数,而onCreate()不再被调用到。

Service只在第一次创建启动的时候调用onCreate()函数,只要该Service还在运行,就不会再次触发onCreate()函数;

onStartCommand()函数则在每次启动Service的时候都会调用。

4.5 关闭Service

点击“stop”按钮,关闭Service,查看日志:

stopstop

onDestroy() 函数是在Service被销毁的时候调用,在Service被销毁掉了的时候,即使再次“关闭”Service,也不再触发onDestroy() 函数了。

0 人点赞