前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android Service 使用

Android Service 使用

原创
作者头像
小数
发布2023-11-21 18:25:56
2070
发布2023-11-21 18:25:56
举报

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
Service
Service

设置组件的名称为 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 点击运行项目:
s1
s1
4.2 点击“start”按钮,启动Service

查看日志:

log
log

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

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

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

bac
bac

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

pa
pa

MyService 正在运行。

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

看到日志:

l2
l2

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

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

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

4.5 关闭Service

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

stop
stop

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 创建项目 ServiceSample
  • 2. 创建Service ,并配置
    • 2.1 待项目初始化完成后,右击项目包名,新建Service,
      • 2.2 编写MyService代码
        • 2.3 配置AndroidManifest.xml 清单文件
        • 3. 启动、关闭Service
          • 3.1 编辑布局文件 activity_main.xml
            • 3.2 编写 MainActivity,注册监听事件
            • 4. 运行项目
              • 4.1 点击运行项目:
                • 4.2 点击“start”按钮,启动Service,
                  • 4.3 查看系统的服务运行统计信息
                    • 4.4 接着点击“start”按钮,多次启动Service
                      • 4.5 关闭Service
                      领券
                      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
                      http://www.vxiaotou.com