Android studio实现定时广播2.0

一共用时四天
主要目的是让自己的生活更规律
良好的作息是复习的最大帮助

<!-- AndroidManifest.xml -->

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="com.example.mortal">

    <uses-permission android:name="android.permission.SET_ALARM" />

    <application
        android:allowBackup="true"
        android:dataExtractionRules="@xml/data_extraction_rules"
        android:fullBackupContent="@xml/backup_rules"
        android:icon="@drawable/charleen"
        android:label="@string/app_name"
        android:roundIcon="@drawable/charleen"
        android:supportsRtl="true"
        android:theme="@style/Theme.Mortal"
        tools:targetApi="31">
        <service
            android:name=".RingtoneTimer"
            android:enabled="true"
            android:exported="false" />
        <activity
            android:name=".MainActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>



    </application>

</manifest>
package com.example.mortal;
import android.content.Intent;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.text.method.ScrollingMovementMethod;
import android.widget.TextView;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import java.text.SimpleDateFormat;
import java.util.Date;

public class MainActivity extends AppCompatActivity {

    private RingtoneTimer ringtoneTimer;
    private CountDownTimer countDownTimer;
    private TextView textView_time;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        textView_time = findViewById(R.id.textView_time);

        // 创建一个倒计时定时器
        // 倒计时99999999秒,每隔500毫秒更新一次时间
        countDownTimer = new CountDownTimer(99999999, 500) {
            @Override
            public void onTick(long millisUntilFinished) {
                // 更新剩余时间
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                final String currentTime = sdf.format(new Date());
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        textView_time.setText(currentTime);
                    }
                });
            }

            @Override
            public void onFinish() {
                // 定时器结束时的操作
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        textView_time.setText("倒计时结束");
                    }
                });
            }
        };

        // 启动倒计时定时器
        countDownTimer.start();

        TextView textView2 = findViewById(R.id.textView2); // 假设你的 TextView 的 id 是 textView2
        TextView textView_show = findViewById(R.id.textView_show);
        textView_show.setMovementMethod(ScrollingMovementMethod.getInstance());
        ringtoneTimer = new RingtoneTimer(textView2, textView_show);
        ringtoneTimer.startTimer();

        startService(new Intent(this, RingtoneTimer.class)); // 启动后台服务
    }
}
package com.example.mortal;

import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.Handler;
import android.os.IBinder;
import android.os.Looper;
import android.widget.TextView;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;

public class RingtoneTimer extends Service {
    private TextView textView2; // 用于显示最近广播信息的TextView
    private TextView textView_show; // 用于显示播报时间的TextView
    private Timer timer; // 计时器
    private Date executionTime0715; // 执行铃声的时间
    private MediaPlayer mediaPlayer0715; // 铃声播放器


    public MediaPlayer mediaPlayer0930;//break


    public MediaPlayer mediaPlayer1120;//kitchen help

    public MediaPlayer mediaPlayer1300;//play a lit

    public MediaPlayer mediaPlayer1400;//noon break

    public MediaPlayer mediaPlayer1530;//gte up and play



    public MediaPlayer mediaPlayer2100;//relax

    public MediaPlayer mediaPlayer2200;//go to bed

    public MediaPlayer mediaPlayer2300;//sleep

    private Handler mainHandler; // 用于在主线程更新UI

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    public RingtoneTimer() {
        // 无参数构造函数的实现代码
    }

    public RingtoneTimer(TextView textView2, TextView textView_show) {
        this.textView2 = textView2;
        this.textView_show = textView_show;

        // 创建MediaPlayer并设置音频源为raw/sound0830
        mediaPlayer0830 = MediaPlayer.create(textView2.getContext(), R.raw.sound0830);
//get up
        mediaPlayer0830 = MediaPlayer.create(textView2.getContext(), R.raw.sound0830);
        
        mediaPlayer0930 = MediaPlayer.create(textView2.getContext(), R.raw.sound0930);
        //break
        mediaPlayer0945 = MediaPlayer.create(textView2.getContext(), R.raw.sound0945);
        //recover
        mediaPlayer1120 = MediaPlayer.create(textView2.getContext(), R.raw.sound1120);
        //kitchen help
        mediaPlayer1300 = MediaPlayer.create(textView2.getContext(), R.raw.sound1300);
        //play a lit
        mediaPlayer1400 = MediaPlayer.create(textView2.getContext(), R.raw.sound1400);
        //noon break
        mediaPlayer1530 = MediaPlayer.create(textView2.getContext(), R.raw.sound1530);
        //gte up and play
        mediaPlayer1600 = MediaPlayer.create(textView2.getContext(), R.raw.sound1600);
        
        mediaPlayer1750 = MediaPlayer.create(textView2.getContext(), R.raw.sound1750);
        //break
        mediaPlayer1800 = MediaPlayer.create(textView2.getContext(), R.raw.sound1800);
        //downstairs 
        mediaPlayer1900 = MediaPlayer.create(textView2.getContext(), R.raw.sound1900);
       
        mediaPlayer2100 = MediaPlayer.create(textView2.getContext(), R.raw.sound2100);
        //relax
        mediaPlayer2200 = MediaPlayer.create(textView2.getContext(), R.raw.sound2200);
        
        mediaPlayer2300 = MediaPlayer.create(textView2.getContext(), R.raw.sound2300);
       
        // 创建主线程Handler
        mainHandler = new Handler(Looper.getMainLooper());


    }

    /**
     * 启动定时器
     */
    public void startTimer() {
        timer = new Timer();
        Calendar calendar = Calendar.getInstance();


        calendar.set(Calendar.HOUR_OF_DAY, 7); // 设置为每天7点钟
        calendar.set(Calendar.MINUTE, 15);
        calendar.set(Calendar.SECOND, 0);
        Date executionTime0715 = calendar.getTime(); // 设置执行时间为当天7:15


        calendar.set(Calendar.HOUR_OF_DAY, 8); // 设置为每天点钟
        calendar.set(Calendar.MINUTE, 30);
        calendar.set(Calendar.SECOND, 0);
        Date executionTime0830 = calendar.getTime();

        calendar.set(Calendar.HOUR_OF_DAY, 9); // 设置为每天点钟
        calendar.set(Calendar.MINUTE, 30);
        calendar.set(Calendar.SECOND, 0);
        Date executionTime0930 = calendar.getTime();


        calendar.set(Calendar.HOUR_OF_DAY, 9); // 设置为每天点钟
        calendar.set(Calendar.MINUTE, 45);
        calendar.set(Calendar.SECOND, 0);
        Date executionTime0945 = calendar.getTime();

        calendar.set(Calendar.HOUR_OF_DAY, 11); // 设置为每天点钟
        calendar.set(Calendar.MINUTE, 20);
        calendar.set(Calendar.SECOND, 0);
        Date executionTime1120 = calendar.getTime();

        calendar.set(Calendar.HOUR_OF_DAY, 13); // 设置为每天点钟
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.SECOND, 0);
        Date executionTime1300 = calendar.getTime();

        calendar.set(Calendar.HOUR_OF_DAY, 14); // 设置为每天点钟
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.SECOND, 0);
        Date executionTime1400 = calendar.getTime();

        calendar.set(Calendar.HOUR_OF_DAY, 15); // 设置为每天点钟
        calendar.set(Calendar.MINUTE, 30);
        calendar.set(Calendar.SECOND, 0);
        Date executionTime1530 = calendar.getTime();


        calendar.set(Calendar.HOUR_OF_DAY, 16); // 设置为每天点钟
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.SECOND, 0);
        Date executionTime1600 = calendar.getTime();


        calendar.set(Calendar.HOUR_OF_DAY, 17); // 设置为每天点钟
        calendar.set(Calendar.MINUTE, 50);
        calendar.set(Calendar.SECOND, 0);
        Date executionTime1750 = calendar.getTime();


        calendar.set(Calendar.HOUR_OF_DAY, 18); // 设置为每天点钟
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.SECOND, 0);
        Date executionTime1800 = calendar.getTime();


        calendar.set(Calendar.HOUR_OF_DAY, 19); // 设置为每天点钟
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.SECOND, 0);
        Date executionTime1900 = calendar.getTime();

        calendar.set(Calendar.HOUR_OF_DAY, 21); // 设置为每天点钟
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.SECOND, 0);
        Date executionTime2100 = calendar.getTime();


        calendar.set(Calendar.HOUR_OF_DAY, 22); // 设置为每天点钟
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.SECOND, 0);
        Date executionTime2200 = calendar.getTime();

        calendar.set(Calendar.HOUR_OF_DAY, 23); // 设置为每天点钟
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.SECOND, 0);

        Date executionTime2300 = calendar.getTime();


        TimerTask task0715 = new TimerTask() {
            @Override
            public void run() {
                // 触发铃声动作
                mediaPlayer0715.start();

                // 更新UI
                mainHandler.post(new Runnable() {
                    @Override
                    public void run() {
                        textView2.setText("最近广播:" + "起床");
                    }
                });
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                String currentTime = sdf.format(System.currentTimeMillis());
                // 使用System.currentTimeMillis()代替new Date()
                textView_show.append("07:15已播报 " + currentTime);

            }
        };
        TimerTask task0830 = new TimerTask() {
            @Override
            public void run() {
                // 触发铃声动作
                mediaPlayer0830.start();

                // 更新UI
                mainHandler.post(new Runnable() {
                    @Override
                    public void run() {
                        textView2.setText("最近广播:" + "");
                    }
                });
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                String currentTime = sdf.format(System.currentTimeMillis());
                textView_show.append("08:30已播报 " + currentTime);

            }
        };
        TimerTask task0930 = new TimerTask() {
            @Override
            public void run() {
                // 触发铃声动作
                mediaPlayer0930.start();

                // 更新UI
                mainHandler.post(new Runnable() {
                    @Override
                    public void run() {
                        textView2.setText("最近广播:" + "休息");
                    }
                });
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                String currentTime = sdf.format(System.currentTimeMillis());
                textView_show.append("09:30已播报 " + currentTime);

            }
        };
        TimerTask task0945 = new TimerTask() {
            @Override
            public void run() {
                // 触发铃声动作
                mediaPlayer0945.start();

                // 更新UI
                mainHandler.post(new Runnable() {
                    @Override
                    public void run() {
                        textView2.setText("最近广播:" + "");
                    }
                });
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                String currentTime = sdf.format(System.currentTimeMillis());
                textView_show.append("09:45已播报 " + currentTime);

            }
        };

        TimerTask task1120 = new TimerTask() {
            @Override
            public void run() {
                // 触发铃声动作
                mediaPlayer1120.start();

                // 更新UI
                mainHandler.post(new Runnable() {
                    @Override
                    public void run() {
                        textView2.setText("最近广播:" + "厨房帮忙");
                    }
                });
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                String currentTime = sdf.format(System.currentTimeMillis());
                textView_show.append("11:20已播报 " + currentTime);

            }
        };
        TimerTask task1300 = new TimerTask() {
            @Override
            public void run() {
                // 触发铃声动作
                mediaPlayer1300.start();

                // 更新UI
                mainHandler.post(new Runnable() {
                    @Override
                    public void run() {
                        textView2.setText("最近广播:" + "休息");
                    }
                });
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                String currentTime = sdf.format(System.currentTimeMillis());
                textView_show.append("13:00已播报 " + currentTime);

            }
        };
        TimerTask task1400 = new TimerTask() {
            @Override
            public void run() {
                // 触发铃声动作
                mediaPlayer1400.start();

                // 更新UI
                mainHandler.post(new Runnable() {
                    @Override
                    public void run() {
                        textView2.setText("最近广播:" + "午觉");
                    }
                });
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                String currentTime = sdf.format(System.currentTimeMillis());
                textView_show.append("14:00已播报 " + currentTime);

            }
        };
        TimerTask task1530 = new TimerTask() {
            @Override
            public void run() {
                // 触发铃声动作
                mediaPlayer1530.start();

                // 更新UI
                mainHandler.post(new Runnable() {
                    @Override
                    public void run() {
                        textView2.setText("最近广播:" + "起床休息一会儿");
                    }
                });
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                String currentTime = sdf.format(System.currentTimeMillis());
                textView_show.append("15:30已播报 " + currentTime);

            }
        };
        TimerTask task1600 = new TimerTask() {
            @Override
            public void run() {
                // 触发铃声动作
                mediaPlayer1600.start();

                // 更新UI
                mainHandler.post(new Runnable() {
                    @Override
                    public void run() {
                        textView2.setText("最近广播:" + "");
                    }
                });
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                String currentTime = sdf.format(System.currentTimeMillis());
                textView_show.append("16:00已播报 " + currentTime);

            }
        };
        TimerTask task1750 = new TimerTask() {
            @Override
            public void run() {
                // 触发铃声动作
                mediaPlayer1750.start();

                // 更新UI
                mainHandler.post(new Runnable() {
                    @Override
                    public void run() {
                        textView2.setText("最近广播:" + "休息");
                    }
                });
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                String currentTime = sdf.format(System.currentTimeMillis());
                textView_show.append("17:50已播报 " + currentTime);

            }
        };
        TimerTask task1800 = new TimerTask() {
            @Override
            public void run() {
                // 触发铃声动作
                mediaPlayer1800.start();

                // 更新UI
                mainHandler.post(new Runnable() {
                    @Override
                    public void run() {
                        textView2.setText("最近广播:" + "下");
                    }
                });
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                String currentTime = sdf.format(System.currentTimeMillis());
                textView_show.append("18:00已播报 " + currentTime);

            }
        };
        TimerTask task1900 = new TimerTask() {
            @Override
            public void run() {
                // 触发铃声动作
                mediaPlayer1900.start();

                // 更新UI
                mainHandler.post(new Runnable() {
                    @Override
                    public void run() {
                        textView2.setText("最近广播:" + "英语");
                    }
                });
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                String currentTime = sdf.format(System.currentTimeMillis());
                textView_show.append("19:00已播报 " + currentTime);

            }
        };
        TimerTask task2100 = new TimerTask() {
            @Override
            public void run() {
                // 触发铃声动作
                mediaPlayer2100.start();

                // 更新UI
                mainHandler.post(new Runnable() {
                    @Override
                    public void run() {
                        textView2.setText("最近广播:" + "放松休息");
                    }
                });
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                String currentTime = sdf.format(System.currentTimeMillis());
                textView_show.append("21:00已播报 " + currentTime);

            }
        };
        TimerTask task2200 = new TimerTask() {
            @Override
            public void run() {
                // 触发铃声动作
                mediaPlayer2200.start();

                // 更新UI
                mainHandler.post(new Runnable() {
                    @Override
                    public void run() {
                        textView2.setText("最近广播:" + "上床");
                    }
                });
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                String currentTime = sdf.format(System.currentTimeMillis());
                textView_show.append("22:00已播报 " + currentTime);

            }
        };
        TimerTask task2300 = new TimerTask() {
            @Override
            public void run() {
                // 触发铃声动作
                mediaPlayer2300.start();

                // 更新UI
                mainHandler.post(new Runnable() {
                    @Override
                    public void run() {
                        textView2.setText("最近广播:" + "熄灯");
                    }
                });
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                String currentTime = sdf.format(System.currentTimeMillis());
                textView_show.append("23:00已播报 " + currentTime);

            }
        };


        long interval = 24 * 60 * 60 * 1000; // 一天的毫秒数

        long delay0715 = executionTime0715.getTime() - System.currentTimeMillis();
        if (delay0715 < 0) {
            delay0715 += interval; // 如果当前时间已经过了执行时间,则延迟到下一天的执行时间
        }
        long delay0830 = executionTime0830.getTime() - System.currentTimeMillis();
        if (delay0830 < 0) {
            delay0830 += interval; // 如果当前时间已经过了执行时间,则延迟到下一天的执行时间
        }
        long delay0930 = executionTime0930.getTime() - System.currentTimeMillis();
        if (delay0930 < 0) {
            delay0930 += interval; // 如果当前时间已经过了执行时间,则延迟到下一天的执行时间
        }
        long delay0945 = executionTime0945.getTime() - System.currentTimeMillis();
        if (delay0945 < 0) {
            delay0945 += interval; // 如果当前时间已经过了执行时间,则延迟到下一天的执行时间
        }
        long delay1120 = executionTime1120.getTime() - System.currentTimeMillis();
        if (delay1120 < 0) {
            delay1120 += interval; // 如果当前时间已经过了执行时间,则延迟到下一天的执行时间
        }
        long delay1300 = executionTime1300.getTime() - System.currentTimeMillis();
        if (delay1300 < 0) {
            delay1300 += interval; // 如果当前时间已经过了执行时间,则延迟到下一天的执行时间
        }
        long delay1400 = executionTime1400.getTime() - System.currentTimeMillis();
        if (delay1400 < 0) {
            delay1400 += interval; // 如果当前时间已经过了执行时间,则延迟到下一天的执行时间
        }
        long delay1530 = executionTime1530.getTime() - System.currentTimeMillis();
        if (delay1530 < 0) {
            delay1530 += interval; // 如果当前时间已经过了执行时间,则延迟到下一天的执行时间
        }
        long delay1600 = executionTime1600.getTime() - System.currentTimeMillis();
        if (delay1600 < 0) {
            delay1600 += interval; // 如果当前时间已经过了执行时间,则延迟到下一天的执行时间
        }
        long delay1750 = executionTime1750.getTime() - System.currentTimeMillis();
        if (delay1750 < 0) {
            delay1750 += interval; // 如果当前时间已经过了执行时间,则延迟到下一天的执行时间
        }
        long delay1800 = executionTime1800.getTime() - System.currentTimeMillis();
        if (delay0715 < 0) {
            delay0715 += interval; // 如果当前时间已经过了执行时间,则延迟到下一天的执行时间
        }
        long delay1900 = executionTime1900.getTime() - System.currentTimeMillis();
        if (delay1900 < 0) {
            delay1900 += interval; // 如果当前时间已经过了执行时间,则延迟到下一天的执行时间
        }
        long delay2100 = executionTime2100.getTime() - System.currentTimeMillis();
        if (delay2100 < 0) {
            delay2100 += interval; // 如果当前时间已经过了执行时间,则延迟到下一天的执行时间
        }
        long delay2200 = executionTime2200.getTime() - System.currentTimeMillis();
        if (delay2200 < 0) {
            delay2200 += interval; // 如果当前时间已经过了执行时间,则延迟到下一天的执行时间
        }
        long delay2300 = executionTime2300.getTime() - System.currentTimeMillis();
        if (delay2300 < 0) {
            delay2300 += interval; // 如果当前时间已经过了执行时间,则延迟到下一天的执行时间
        }

        timer.scheduleAtFixedRate(task0715, delay0715, interval);
        timer.scheduleAtFixedRate(task0830, delay0830, interval);
        timer.scheduleAtFixedRate(task0930, delay0930, interval);
        timer.scheduleAtFixedRate(task0945, delay0945, interval);
        timer.scheduleAtFixedRate(task1120, delay1120, interval);
        timer.scheduleAtFixedRate(task1300, delay1300, interval);
        timer.scheduleAtFixedRate(task1400, delay1400, interval);
        timer.scheduleAtFixedRate(task1530, delay1530, interval);
        timer.scheduleAtFixedRate(task1600, delay1600, interval);
        timer.scheduleAtFixedRate(task1750, delay1750, interval);
        timer.scheduleAtFixedRate(task1800, delay1800, interval);
        timer.scheduleAtFixedRate(task1900, delay1900, interval);
        timer.scheduleAtFixedRate(task2100, delay2100, interval);
        timer.scheduleAtFixedRate(task2200, delay2200, interval);
        timer.scheduleAtFixedRate(task2300, delay2300, interval);
    }
}
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">


    <TextView
        android:id="@+id/textView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="136dp"
        android:layout_marginTop="16dp"
        android:layout_marginEnd="137dp"
        android:text="等待首次播报..."
        android:textColor="#673AB7"
        android:textSize="20sp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/textView4" />

    <TextView
        android:id="@+id/textView4"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="125dp"
        android:layout_marginTop="16dp"
        android:layout_marginEnd="118dp"
        android:text="已启动广播程序"
        android:textColor="#673AB7"
        android:textSize="24sp"
        android:textStyle="bold"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/textView_time"
        android:layout_width="134dp"
        android:layout_height="85dp"
        android:layout_marginStart="136dp"
        android:layout_marginEnd="136dp"
        android:layout_marginBottom="24dp"
        android:text="时间"
        android:textAlignment="center"
        android:textColor="#673AB7"
        android:textSize="16sp"
        android:textStyle="bold"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.0"
        app:layout_constraintStart_toStartOf="parent" />

    <TextView
        android:id="@+id/textView_show"
        android:layout_width="318dp"
        android:layout_height="395dp"
        android:layout_marginStart="44dp"
        android:layout_marginTop="144dp"
        android:layout_marginEnd="44dp"
        android:maxLines="20"
        android:textAlignment="center"
        android:textColor="#673AB7"
        android:textSize="14sp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.0"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/textView4" />

    <TextView
        android:id="@+id/textView6"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="159dp"
        android:layout_marginTop="39dp"
        android:layout_marginEnd="156dp"
        android:text="播报记录"
        android:textAlignment="textStart"
        android:textColor="#673AB7"
        android:textSize="24sp"
        android:textStyle="bold"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/textView2" />

</androidx.constraintlayout.widget.ConstraintLayout>
plugins {
    id("com.android.application")
}

android {
    namespace = "com.example.mortal"
    compileSdk = 33

    defaultConfig {
        applicationId = "com.example.mortal"
        minSdk = 24
        targetSdk = 33
        versionCode = 1
        versionName = "1.0"

        testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
    }

    buildTypes {
        release {
            isMinifyEnabled = false
            proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro")
        }
    }
    compileOptions {
        sourceCompatibility = JavaVersion.VERSION_1_8
        targetCompatibility = JavaVersion.VERSION_1_8
    }
}

dependencies {
    implementation("androidx.appcompat:appcompat:1.6.1")
    implementation("com.google.android.material:material:1.8.0")
    implementation("androidx.constraintlayout:constraintlayout:2.1.4")
    testImplementation("junit:junit:4.13.2")
    androidTestImplementation("androidx.test.ext:junit:1.1.5")
    androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1")
}