Android 系统中 Activity
承载了界面组件,负责与用户交互,Service
则在后台“默默运行”,给用户提供“服务”,它不与用户直接交互。如果说 Activity
是剧院的大舞台,是呈现“节目”并且负责和“观众互动”,那么Service
就是这个“舞台”的“幕后”,它为现场的活动做“幕后保障”工作。
一起动手实验,认识一下Service
吧!
实验步骤:
- 创建项目
ServiceSample
- 创建
Service
,并配置 - 启动、关闭
Service
- 运行项目
1. 创建项目 ServiceSample
首先在 Android Studio
中创建项目名为 ServiceSample
,包名设置为 com.guagua.servicesample
。
2. 创建Service
,并配置
2.1 待项目初始化完成后,右击项目包名,新建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
清单文件中注册才能使用:
<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 点击运行项目:
4.2 点击“start”按钮,启动Service
,
查看日志:
可以看到点击启动按钮后,MyService
被启动,onCreate()
、onStartCommand()
函数被调用.
4.3 查看系统的服务运行统计信息
首先要开启手机的“开发者模式”,然后打开 Settings
→ Developer options
→ Running services
。
我们的项目 ServiceSample
在列表中,点击查看详情:
MyService
正在运行。
4.4 接着点击“start”按钮,多次启动Service
看到日志:
每点击一次“start”按钮,就会调用一次 Activity
的 startService()
函数,同时会调用一次MyService
的 onStartCommand()
函数,而onCreate()
不再被调用到。
Service
只在第一次创建启动的时候调用onCreate()
函数,只要该Service
还在运行,就不会再次触发onCreate()
函数;
onStartCommand()
函数则在每次启动Service
的时候都会调用。
4.5 关闭Service
点击“stop”按钮,关闭Service
,查看日志:
onDestroy()
函数是在Service
被销毁的时候调用,在Service
被销毁掉了的时候,即使再次“关闭”Service
,也不再触发onDestroy()
函数了。