注册

Java转Android:第8天 Service帮你背诵古诗词

一、我讲


今天,我主要讲一下android里面的服务Service,以及它的使用方法。


1.1 服务 Service


Service其实是Android的四大组件之一。


安卓有四大组件,前面我们说的ActivityBroadCastReceiver,其实都属于四大组件。你看,我没有一上来就讲让你先记住四大组件,而是慢慢渗透,因为没有例子的应用,记那些没有意义。


Android中,能看到的属于Activity,看不到的属于Service


image3.png


Service的运行不依赖于任何用户界面,即使程序被切换到后台,或者用户打开了另一个应用程序,Service仍然能够保持正常运行。


1.2 Service的使用


创建


可选中包名,右键点击菜单,输入你的服务的名称进行创建。


image.png


其实,你这步操作,影响了两处代码。


第一,新建了一个继承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>

启动和停止


服务的启动和停止,一般通过IntentActivity中进行。


Intent intent = new Intent(this, MyService.class);
startService(intent);
stopService(intent);

通过Intent构建要提供哪一个服务,然后调用startService启动服务,stopService停止服务。


二、你做


我们要搞一个这样的功能:



启动服务后,在服务里面循环播放古诗,退出程序也不打断,看其他应用也不打断。这样,能播放一整天,你看抖音时也弹。这导致你,无奈地就学会了一首诗。



image8.GIF


虽然,我们说服务没有界面,但是启动它要界面,我们写在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
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

0 个评论

要回复文章请先登录注册