Android--简易倒计时

1 设计任务

1.1 研究背景

Android倒计时是一种非常常见的功能,它可以在很多应用中被使用,比如倒计时闹钟、计时器、倒计时游戏等等。它的研究背景可以追溯到计时和倒计时的概念,这些概念和需求是人类社会生活中不可或缺的一部分。在数字化时代,我们需要更加精确、方便、快速和易用的计时和倒计时工具,因此研究和开发Android倒计时功能具有很大的现实意义。

1.2 研究目的

Android倒计时的目的是实现一种高效、精确、易用和可扩展的倒计时功能,使得用户可以方便地设置、启动、暂停和重置倒计时,并且可以根据自己的需求定制倒计时的样式和功能。同时,Android倒计时还可以为开发者提供一种方便的接口,使得他们可以快速地集成倒计时功能到自己的应用中。

1.3 研究意义

本课程设计旨在设计一个基于Android平台的简易倒计时应用程序。该应用程序需连接SQLite数据库和广播接收器,支持用户进行倒计时操作,实现倒计时功能并将倒计时时间信息保存到数据库中,同时在倒计时结束时以广播形式通知用户。

1.4 研究内容

倒计时的主要研究内容在倒计时功能模块和广播接收器功能模块,利用updateCountdownText方法来更新UI界面上的倒计时时间,利用countdowntimer方法实现倒计时功能。 利用SQLiteHelper方法,并在其中实现数据库的创建和版本更新。

2 系统相关技术

2.1 广播接收器

在 Android 中,广播接收器(BroadcastReceiver)是一种组件,用于接收系统或应用程序发送的广播消息,广播接收器可以用于实现系统级别的事件处理,如启动应用程序、接收短信、接收电话等。

广播接收器需要通过注册来接收广播消息。注册可以通过 AndroidManifest.xml 文件中的 <receiver> 元素或者代码动态注册,本系统使用代码动态注册的方法。当广播接收器接收到广播消息时,系统会自动调用其 onReceive() 方法,通过该方法可以实现对广播消息的处理。

广播接收器可以接收系统内置的广播消息,如倒计时结束后发送“倒计时结束”的提示信息,同时,应用程序也可以通过发送自定义的广播消息来实现应用程序内部的事件通知和处理。

2.2 SQLite数据库

SQLite是一款轻型的数据库,是遵守ACID关系型数据库管理系统,它包含在一个相对小的C库中。它是D.RichardHipp建立的公有领域项目。它的设计目标是嵌入式的,而且已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows、Linux、Unix等等主流的操作系统,同时能够跟很多程序语言相结合。

SQLite是一个嵌入式库并且实现了零配置、无服务端和事务功能的SQL数据库引擎。它在广泛领域内被使用,而且单线程读写性能与MySQL比肩,并且保证ACID性。SQLite的存储后端是采用Btree实现,多个连接可以并发操作,但是同一时间只允许一个写着存在。SQLite在硬盘上一个数据库一个文件,每个数据库文件头部保存有这个数据库的元信息,包括版本,大小,Btree根节点位置等等。SQLite将一个数据库以Page为单位进行管理和读写,每一个Page默认为512字节,通常可以看做一个硬盘sector大小。

3 系统分析

3.1 可行性分析

在实现 Android 倒计时功能时,需要确保代码正确、高效地处理时间单位并考虑到设备资源的使用限制。只有这样才能保证此类应用程序功能具有可靠性和用户友好性。从可行性角度分析,实现 Android 倒计时功能是完全可行的,并且相对容易实现。这得益于 Android 平台提供了非常丰富的工具和技术支持,使得开发者能够轻松地将此类功能集成到应用程序中。应避免设计过于复杂或长时间运行的倒计时功能,否则可能会占用设备的资源、降低电池续航时间或影响设备的其他功能。

3.1.1 技术可行性

在开发过程中,利用Android Studio开发工具进行设计,UI设计直接利用控件进行布局,设计比较容易,可视化强,数据库的设计使用SQLite数据库,该数据库为轻型的数据库,简单易懂。

3.1.2 操作可行性

该倒计时安卓应用程序的操作相对简单,用户可以通过设置倒计时时间、开始倒计时、暂停倒计时等功能来控制应用程序。在开发过程中需要考虑用户体验,确保应用程序的操作流畅、易于理解。

3.1.3经济可行性

从经济角度来看,开发一个倒计时安卓应用程序的成本相对较低,主要包括开发人员的工资、开发工具的购置等成本。但是,该应用程序如果能够在市场上得到广泛的应用,将带来一定的收益。因此,从经济可行性的角度来看,这个设计是有潜力的。

3.1.4 法律可行性

在开发过程中,需要确保该应用程序不会侵犯他人的知识产权,如专利、商标等。此外,还需要遵守相关法律法规,如个人信息保护法等。因此,从法律可行性的角度来看,开发一个倒计时安卓应用程序需要严格遵守相关法律法规。

3.2 需求分析

我们了解到一些记忆力不好或者是没有固定目标激励的用户的痛苦,他们需要有一个人在他们忙的不可开交焦头烂额的时候提醒他们接下来要做的事,或者是一些有重大事件的用户提醒,给他们一些压力和固定目标,但是现有的方案并没有很好地解决这些需求,我们这款倒计时是为了让他们记住一些重要的场合时间以及目标而设计。

4 系统设计

4.1 系统总体设计

Android倒计时系统是一款基于Android平台的倒计时应用,主要功能是帮助用户记录倒计时事件。其主要设计包括用户界面设计、功能设计和数据库设计。用户界面设计方面,系统需要提供直观的倒计时器UI界面,包括数字、颜色、字体、按钮等,以方便用户进行倒计时设置和操作。功能设计方面,系统主要包括倒计时时间的设置、广播接收器的设置。数据库设计方面,系统需要将倒计时器的设置信息存储到本地数据库中,以便用户下次启动应用时能够恢复之前的设置。总体来说,安卓倒计时系统的设计应该注重用户体验,提供简单易用的功能和直观的操作界面,以提高用户的满意度和使用体验。

4.2 系统详细设计

4.2.2计时器功能设计

在MainActivity类中调用CountDownTimer,实现倒计时功能,用户可以通过时间选择器设置倒计时,并使用updateCountdownText()方法来更新UI界面上的倒计时时间[4]。当倒计时结束时,程序将会向SQLite数据库中插入数据,并通过广播方式通知用户倒计时已结束。

4.3 数据库设计

在MainActivity类中调用SQLiteHelper,并在其中实现数据库的创建和版本更新方法。在MainActivity中实例化数据库连接对象,通过该对象实现数据库的操作,该模块用于存储用户设置的倒计时事件信息。同时也负责从数据库中读取倒计时事件信息,以供用户查看或修改。

5 系统实现

5.1 用户界面实现

用户界面使用Android提供的布局文件实现,并通过Java代码控制逻辑。用户输入的信息通过界面控件保存到SQLite数据库中。实现效果如图4.1所示。

图4.1 倒计时取时器

5.2 倒计时功能实现

倒计时功能实现通过继承Android提供的CountDownTimer类来实现。当用户设置倒计时事件时,倒计时事件信息存储到数据库中,并且启动后台服务,跟踪倒计时事件。倒计时功能实现界面如图4.2所示。

图4.2 倒计时功能实现界面

6 系统测试

6.1 测试目的

为了发现和解决倒计时功能中可能出现的缺陷和问题,从而验证应用程序在不同情况下功能的正确性、可靠性和稳定性,以确保应用程序能够正常工作并满足用户的需求。此外,测试还可以发现应用程序的潜在缺陷和漏洞,并提供修复建议,从而提高应用程序的质量和可靠性。软件测试是检验软件问题的主要措施和方法,可以有效辨别软件隐藏的技术不足和问题。

6.2 测试方法

黑盒测试和白盒测试是软件测试中的两种常见方法。黑盒测试是指在不考虑内部代码或结构的情况下,通过对软件系统的输入和输出进行测试来评估软件的功能和性能。测试人员只需要通过输入数据和观察输出结果来判断软件是否符合预期的行为。白盒测试是指测试人员需要了解软件的内部结构、代码和算法,并通过检查程序的内部逻辑来评估软件的质量和性能。白盒测试通常需要测试人员具有编程和软件开发方面的知识。

黑盒测试和白盒测试通常都是软件测试中的重要组成部分,它们可以相互补充来评估软件的整体质量。黑盒测试可以帮助测试人员评估软件系统的实际用户体验和功能,而白盒测试可以帮助测试人员评估软件代码的可靠性和安全性。本系统采用黑盒测试的方法。

6.3 测试内容

在进行Android倒计时程序的黑盒测试时,主要目的是使用户使用稳定和方便,测试人员需要测试以下内容:

倒计时功能是否正常工作;用户界面的布局和显示效果是否符合预期;应用程序的性能是否满足要求,包括启动时间、响应时间和资源占用等;应用程序的稳定性是否满足要求,包括长时间运行和多任务切换等;应用程序在不同的Android版本和设备上的兼容性。

7 设计总结和心得体会

7.1 设计总结

本课程设计通过Android Studio设计开发了一款基于Android平台的简易倒计时应用程序,能够简单易懂地实现倒计时功能和关键数据的存储,将倒计时保存在SQLite数据库中,以方便用户随时查看。本课程设计还对程序的UI界面、模型层、控制器层等进行了详细分析和设计,最终实现了预期的软件功能,并成功完成了测试,达到了预期效果。

7.2 心得体会

本课程设计让我对Android Studio的开发有了更全面的认识和理解,通过对MVC架构模式的学习和实践,我能够更加规范和清晰地对应用程序的开发进行规划和设计,将软件以各个模块进行划分并完成相应的任务,不仅能够提高代码的可维护性和可扩展性,也能够对开发过程进行更有效的管理和优化。

参考文献

[1] 王雯雪,李凤银,王雯雨.基于Android的手机时间管理App的设计与实现[J].电脑知识与技术,2020,16(02):63-64+72.

[2]李大国,陈文,刘涛.安卓平台上基于机器视觉的仪表识别[J].信息技术,2020,44(05):108-111+116.

[3]胡恒,谢彩云.Android应用开发优化[J].信息与电脑(理论版),2021,31(20):84-85.

[4]李国才.基于Android的数据库学习系统设计[J].电脑编程技巧与维护,2021(11):69-70+78.

[5]龚昌.浅谈白盒测试与黑盒测试在软件测试中的应用[J].信息与电脑.2021(1).

[6] 王琦.探析计算机软件测试方法[J].科学技术创新,2021(04):93-94.

[7]王韦刚,张睿.基于Android的参数转换器的设计与实现[J].电子设计工程,2021,35(09):108-113.

主要代码如下:

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/white">
     <TextView
         android:id="@+id/tv_countdown"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_centerInParent="true"
         android:textSize="50sp"
         android:textColor="@android:color/holo_red_light"
         android:text="00:00:00" />
     <Button
         android:id="@+id/btn_set"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_below="@+id/tv_countdown"
         android:layout_centerHorizontal="true"
         android:layout_marginTop="20dp"
         android:text="设置倒计时" />
</RelativeLayout>

MainActivity.java

package com.example.myapplication;//可自行更改不同的包

import android.app.PendingIntent;
import android.app.TimePickerDialog;
import android.content.BroadcastReceiver;
import android.content.ContentValues;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.TimePicker;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.NotificationCompat;
import androidx.core.app.NotificationManagerCompat;

public class MainActivity extends AppCompatActivity {

    private TextView tvCountdown;
    private Button btnSet;
    private CountDownTimer countDownTimer;
    private long timeLeftInMillis;
    private SQLiteDatabase database;

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

        tvCountdown = findViewById(R.id.tv_countdown);
        btnSet = findViewById(R.id.btn_set);

        // 创建或打开数据库
        database = SQLiteDatabase.openOrCreateDatabase(getFilesDir().getPath() + "/countdown.db", null);

        // 创建倒计时表
        database.execSQL("CREATE TABLE IF NOT EXISTS countdown (id INTEGER PRIMARY KEY AUTOINCREMENT, time INTEGER)");

        // 设置按钮点击事件
        btnSet.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                showTimePickerDialog();
            }
        });
        //注册广播接收器
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction(Intent.ACTION_TIME_TICK); // 系统每分钟发出的广播
        intentFilter.addAction("com.example.countdown"); // 自定义广播
        registerReceiver(receiver, intentFilter);
    }

    // 显示时间选择器对话框
    private void showTimePickerDialog() {
        TimePickerDialog timePickerDialog = new TimePickerDialog(MainActivity.this, new TimePickerDialog.OnTimeSetListener() {
            @Override
            public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
                startCountdown(hourOfDay, minute);
            }
        }, 0, 0, true);
        timePickerDialog.show();
    }

    // 开始倒计时
    private void startCountdown(int hour, int minute) {
        // 计算剩余时间的毫秒数
        timeLeftInMillis = (hour * 60 + minute) * 60 * 1000;

        // 存储倒计时到数据库中
        ContentValues values = new ContentValues();
        values.put("time", timeLeftInMillis);
        database.insert("countdown", null, values);

        // 开始倒计时
        countDownTimer = new CountDownTimer(timeLeftInMillis, 1000) {
            @Override
            public void onTick(long millisUntilFinished) {
                timeLeftInMillis = millisUntilFinished;
                updateCountdownText();
            }

            @Override
            public void onFinish() {
                showCountdownFinishedNotification();
                deleteCountdownFromDatabase();
                Intent intent = new Intent("com.example.countdown");
                sendBroadcast(intent);
            }
        }.start();
    }

    // 更新倒计时文本
    private void updateCountdownText() {
        int hours = (int) (timeLeftInMillis / 1000 / 3600);
        int minutes = (int) ((timeLeftInMillis / 1000) % 3600 / 60);
        int seconds = (int) (timeLeftInMillis / 1000 % 60);

        tvCountdown.setText(String.format("%02d:%02d:%02d", hours, minutes, seconds));
    }

    // 显示倒计时结束通知
    private void showCountdownFinishedNotification() {
        Intent intent = new Intent(MainActivity.this, MainActivity.class);
        PendingIntent pendingIntent = PendingIntent.getActivity(MainActivity.this, 0, intent, 0);
        NotificationCompat.Builder builder = new NotificationCompat.Builder(MainActivity.this, "default")
                .setSmallIcon(R.mipmap.ic_launcher)
                .setContentTitle("倒计时结束")
                .setContentText("您设置的倒计时已经结束")
                .setContentIntent(pendingIntent)
                .setAutoCancel(true);

        NotificationManagerCompat notificationManager = NotificationManagerCompat.from(MainActivity.this);
        notificationManager.notify(1, builder.build());
    }
    // 广播接收器

    private BroadcastReceiver receiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            if (Intent.ACTION_TIME_TICK.equals(intent.getAction())) {                // 系统每分钟的广播,可以在这里做一些需要每分钟执行的操作
            } else if ("com.example.countdown".equals(intent.getAction())) {                // 自定义广播,倒计时结束时触发
                Toast.makeText(MainActivity.this, "倒计时结束", Toast.LENGTH_SHORT).show();
            }
        }
    };
    // 从数据库中删除倒计时
    private void deleteCountdownFromDatabase() {
        database.delete("countdown", null, null);
    }

    @Override
    protected void onResume() {
        super.onResume();

        // 从数据库中取出倒计时
        Cursor cursor = database.rawQuery("SELECT * FROM countdown", null);
        if (cursor.moveToFirst()) {
            timeLeftInMillis = cursor.getLong(cursor.getColumnIndex("time"));
            countDownTimer = new CountDownTimer(timeLeftInMillis, 1000) {
                @Override
                public void onTick(long millisUntilFinished) {
                    timeLeftInMillis = millisUntilFinished;
                    updateCountdownText();
                }

                @Override
                public void onFinish() {
                    showCountdownFinishedNotification();
                    deleteCountdownFromDatabase();
                }
            }.start();
        }
    }

    @Override
    protected void onPause() {
        super.onPause();

        // 保存当前倒计时到数据库中
        ContentValues values = new ContentValues();
        values.put("time", timeLeftInMillis);
        database.update("countdown", values, null, null);

        // 取消倒计时
        if (countDownTimer != null) {
            countDownTimer.cancel();
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();

        // 关闭数据库
        database.close();
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_65089091/article/details/131069180
今日推荐