Java转Android:第8天 Service帮你背诵古诗词
一、我讲
今天,我主要讲一下android里面的服务Service
,以及它的使用方法。
1.1 服务 Service
Service
其实是Android的四大组件之一。
安卓有四大组件,前面我们说的Activity和BroadCastReceiver,其实都属于四大组件。你看,我没有一上来就讲让你先记住四大组件,而是慢慢渗透,因为没有例子的应用,记那些没有意义。
在Android中,能看到的属于Activity,看不到的属于Service
。
Service
的运行不依赖于任何用户界面,即使程序被切换到后台,或者用户打开了另一个应用程序,Service
仍然能够保持正常运行。
1.2 Service的使用
创建
可选中包名,右键点击菜单,输入你的服务的名称进行创建。
其实,你这步操作,影响了两处代码。
第一,新建了一个继承Service
的类。
public class MyService extends Service {
@Override
public void onCreate() {
super.onCreate();
}
@Override
public int onStartCommand(final Intent intent, int flags, int startId) {
// 巴拉巴拉
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
super.onDestroy();
}
}
当服务每次启动时,都会执行onStartCommand
方法,所以我们终点会把逻辑写到这里面。
第二,在AndroidManifest.xml
中做了注册。
<?xml version="1.0" encoding="utf-8"?>
<manifest>
<application>
……
<service
android:name=".MyService"
android:enabled="true"
android:exported="true"></service>
</application>
</manifest>
启动和停止
服务的启动和停止,一般通过Intent
在Activity
中进行。
Intent intent = new Intent(this, MyService.class);
startService(intent);
stopService(intent);
通过Intent
构建要提供哪一个服务,然后调用startService
启动服务,stopService
停止服务。
二、你做
我们要搞一个这样的功能:
启动服务后,在服务里面循环播放古诗,退出程序也不打断,看其他应用也不打断。这样,能播放一整天,你看抖音时也弹。这导致你,无奈地就学会了一首诗。
虽然,我们说服务没有界面,但是启动它要界面,我们写在MainActivity
中,它的布局是activity_main.xml
,就两个按钮,一个启动,一个关闭。
<?xml version="1.0" encoding="utf-8"?>
<ConstraintLayout tools:context=".MainActivity">
<Button
android:id="@+id/button1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="启动服务"
android:onClick="start" />
<Button
android:id="@+id/button2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="关闭服务"
android:onClick="stop" />
</ConstraintLayout>
又看到了熟悉的onClick=""
这个我们之前讲过。
对应下面的逻辑控制代码,里面有服务的启动和停止。
public class MainActivity extends Activity {
Intent intent;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
intent = new Intent(this, MyService.class);
}
public void start(View view) {
startService(intent);
}
public void stop(View view) {
stopService(intent);
}
}
最后,也是重点,就是我们的服务实现逻辑。
先定义一个字符串数组texts
用于存储每一句诗词。
然后在onStartCommand
里,启动一个线程。
线程里有一个循环,每休眠3秒钟,就往外发送一条消息。
这条消息由Handler发送和接收,接收到后切换诗句,然后通过Toast弹出来。
public class MyService extends Service {
String[] texts = new String[]{"窗前明月光","疑是地上霜","举头望明月","低头思故乡"};
int index = 0;
boolean isRun = true;
……
@Override
public int onStartCommand(final Intent intent, int flags, int startId) {
new Thread(){
@Override
public void run() {
while (isRun){
if (index+1 > texts.length){
index = 0;
}
handler.sendEmptyMessage(index);
sleep(3000);
index++;
}
}
}.start();
return super.onStartCommand(intent, flags, startId);
}
Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
Toast.makeText(MyService.this, ""+texts[msg.what], Toast.LENGTH_SHORT).show();
}
};
@Override
public void onDestroy() {
super.onDestroy();
isRun = false;
}
}
需要注意,isRun
是控制是否还循环,如果为false
了,while
循环就不执行了,线程结束。
另外,Service也是有生命周期的,这个生命周期和Activity的生命周期类似,当 onDestroy()
销毁时,需要做一些收尾工作。
好了,最后点击运行,启动服务,去看看效果吧。
作者:TF男孩
链接:https://juejin.cn/post/7129276744950874149
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。