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

·  阅读 881
Java转Android:第8天 Service帮你背诵古诗词

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第8天,点击查看活动详情


看完这1000字,你将获得如下技能:通过安卓服务,手机循环播放古诗,帮你记忆。

image8.GIF

一、我讲

今天,我主要讲一下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() 销毁时,需要做一些收尾工作。

好了,最后点击运行,启动服务,去看看效果吧。

三、关于

现在,行业内多是Android转Java,很少有Java转Android的。

但是,这并不妨碍Java同学了解Android开发,从学习的角度去拓宽自己的知识面。

所以,我会以最精简的语言来编写一个系列教程《Java转Android》(第一季30篇,日更)。

其实,不管是Java还是python,只要有编程基础的同学,一天看800字,30天可入门安卓。

分类:
Android
标签:
收藏成功!
已添加到「」, 点击更改