技术社区里的运营一枚 2023-01-31 07:38 采纳率: 50%
浏览 48
已结题

开发新软件的想法可行度高吗?

是否现在市面上有手机解开锁屏后,在5/40/45后可以提醒关闭或自动息屏的软件或程序❔
①5分钟关闭可以控制要搜点什么东西结果不停的刷下去了,45分钟是为了缓解眼疲劳
②最好在例如五分钟这样的短时间设置时,可以选择是否开启桌面悬浮窗倒计时
目的:和forest差不多也是时间管理。但没有那么死板,短处当然也是没那么强制

  • 写回答

2条回答 默认 最新

  • m0_54204465 2023-01-31 09:06
    关注

    想法是可行的。成功的关键在于实现简单易用的提醒功能和减少眼疲劳的短时间设置选项。

    分解如下:
    获取当前屏幕解锁时间:在手机系统中通过API获取当前屏幕解锁的时间。在安卓系统中,可以通过使用安卓开发包中的"android.provider.Settings.System"类来获取当前屏幕解锁时间。该类中有一个名为"getLong"的方法,可以从系统设置中获取给定键的长整型值。

    import android.provider.Settings;
    ...
    long screenUnlockTime = Settings.System.getLong(getContentResolver(), Settings.System.SCREEN_OFF_TIMEOUT);
    
    

    需要在代码中请求访问系统设置的权限,才能访问和使用该API。

    判断时间间隔:判断当前时间和解锁时间的差值,如果差值大于5分钟,就弹出提醒

    import java.util.Date;
    
    public class TimeDifference {
        public static void main(String[] args) {
            Date unlockTime = getUnlockTime(); // 获取解锁时间
            Date currentTime = new Date(); // 获取当前时间
    
            long difference = currentTime.getTime() - unlockTime.getTime();
            long differenceMinutes = difference / (60 * 1000);
    
            if (differenceMinutes >= 5) {
                showReminder(); // 弹出提醒
            }
        }
    
        private static Date getUnlockTime() {
            // TODO: 在手机系统中通过API获取当前屏幕解锁的时间
            return new Date();
        }
    
        private static void showReminder() {
            // TODO: 弹出提醒
        }
    }
    
    

    弹出提醒:使用系统通知或者弹出对话框等方式弹出提醒

    Android 中使用 Notification来实现

    private void showNotification(Context context, String title, String content) {
        NotificationCompat.Builder builder = new NotificationCompat.Builder(context, "channel_id")
                .setSmallIcon(R.mipmap.ic_launcher)
                .setContentTitle(title)
                .setContentText(content)
                .setPriority(NotificationCompat.PRIORITY_DEFAULT);
    
        NotificationManagerCompat notificationManager = NotificationManagerCompat.from(context);
        notificationManager.notify(1, builder.build());
    }
    
    // 调用
    showNotification(this, "提醒", "已经 5 分钟了,请注意休息!");
    
    

    在 Android 中弹出对话框的代码

    private void showDialog(Context context, String title, String message) {
        AlertDialog.Builder builder = new AlertDialog.Builder(context);
        builder.setTitle(title)
                .setMessage(message)
                .setPositiveButton("确定", null)
                .show();
    }
    
    // 调用
    showDialog(this, "提醒", "已经 5 分钟了,请注意休息!");
    
    

    用户选择:给用户提供关闭提醒或息屏的选择,使用对话框作为提醒方式

    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setTitle("提醒");
    builder.setMessage("您的手机已经解锁超过5分钟,请考虑关闭或息屏。");
    builder.setPositiveButton("关闭", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            // 用户选择关闭,在此处执行相应的操作
        }
    });
    builder.setNegativeButton("息屏", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            // 用户选择息屏,在此处执行相应的操作
        }
    });
    builder.show();
    
    
    

    在设定的时间(例如5分钟)后,如果用户选择息屏,则执行息屏操作,可以在弹出提醒的代码后继续加入如下代码:

    if user_choice == "sleep":
        # Code to put the device to sleep/turn off the screen
    
    

    自定义提醒时间:允许用户设置自己喜欢的提醒时间,而不是固定的5分钟。

    import android.app.Activity;
    import android.app.AlertDialog;
    import android.content.DialogInterface;
    import android.os.Bundle;
    import android.widget.EditText;
    
    public class MainActivity extends Activity {
    
        private int customInterval;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            showInputDialog();
        }
    
        private void showInputDialog() {
            final EditText input = new EditText(this);
            new AlertDialog.Builder(this)
                    .setTitle("自定义提醒间隔")
                    .setView(input)
                    .setPositiveButton("确定", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            customInterval = Integer.parseInt(input.getText().toString());
                            // 在这里调用判断时间间隔的代码,并使用 customInterval 作为时间间隔
                        }
                    })
                    .setNegativeButton("取消", null)
                    .show();
        }
    }
    
    

    启动 MainActivity 时弹出一个输入框,用户可以输入任意整数,然后点击 "确定" 按钮,输入的数字将被存储在 customInterval 变量中,并在后面的判断时间间隔的代码中使用。

    时间提醒选项:允许用户选择是否收到提醒,以及如何收到提醒(例如通知,对话框,声音提醒等)。

    private void showNotificationOptions() {
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setTitle("选择提醒方式");
    
        CharSequence[] items = {"通知", "对话框", "声音提醒"};
        builder.setSingleChoiceItems(items, -1, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                switch (which) {
                    case 0:
                        showNotification();
                        break;
                    case 1:
                        showDialog();
                        break;
                    case 2:
                        playSound();
                        break;
                    default:
                        break;
                }
            }
        });
        builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                // Do nothing
            }
        });
        builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                // Do nothing
            }
        });
        builder.show();
    }
    
    private void showNotification() {
        NotificationCompat.Builder builder = new NotificationCompat.Builder(this, "default")
                .setSmallIcon(R.drawable.ic_launcher)
                .setContentTitle("提醒")
                .setContentText("请休息一下")
                .setPriority(NotificationCompat.PRIORITY_DEFAULT);
    
        NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this);
        notificationManager.notify(1, builder.build());
    }
    
    private void showDialog() {
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setTitle("提醒");
        builder.setMessage("请休息一下");
        builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                // Do nothing
            }
        });
        builder.show();
    }
    
    private void playSound() {
        Uri soundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
        Ringtone ringtone = RingtoneManager.getRingtone(this, soundUri);
        ringtone.play();
    }
    
    

    该代码显示一个选择提醒方式的对话框,允许用户选择是否收到提醒以及如何收到提醒。也可以使用SharedPreferences存储用户设置,并在需要时读取。

    private void saveReminderSetting(boolean isReminderEnabled, String reminderType) {
        SharedPreferences sharedPreferences = getSharedPreferences("reminder_settings", MODE_PRIVATE);
        SharedPreferences.Editor editor = sharedPreferences.edit();
        editor.putBoolean("is_reminder_enabled", isReminderEnabled);
        editor.putString("reminder_type", reminderType);
        editor.apply();
    }
    
    private void loadReminderSetting() {
        SharedPreferences sharedPreferences = getSharedPreferences("reminder_settings", MODE_PRIVATE);
        isReminderEnabled = sharedPreferences.getBoolean("is_reminder_enabled", true);
        reminderType = sharedPreferences.getString("reminder_type", "notification");
    }
    
    

    可以在需要时通过调用以下代码以打开和关闭提醒:

    if (isReminderEnabled) {
        // Show reminder
        if (reminderType.equals("notification")) {
            showNotification();
        } else if (reminderType.equals("dialog")) {
            showDialog();
        } else if (reminderType.equals("sound")) {
            playSound();
        }
    }
    
    

    自动息屏功能:如果用户选择,可以在达到预定时间时自动息屏,以缓解眼疲劳。

    private PowerManager powerManager;
    private PowerManager.WakeLock wakeLock;
    
    //在达到预定时间时获取电源锁,使屏幕保持醒着
    private void acquireWakeLock() {
        if (wakeLock == null) {
            powerManager = (PowerManager) getSystemService(POWER_SERVICE);
            wakeLock = powerManager.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "MyWakelockTag");
            wakeLock.acquire();
        }
    }
    
    //在用户选择时释放电源锁,使屏幕息屏
    private void releaseWakeLock() {
        if (wakeLock != null) {
            wakeLock.release();
            wakeLock = null;
        }
    }
    
    

    代码中的 acquireWakeLock 方法在达到预定时间时获取电源锁,使屏幕保持醒着; releaseWakeLock 方法在用户选择时释放电源锁,使屏幕息屏。
    统计功能:统计用户使用手机的时间,并给出建议,例如在固定时间休息,以提高生产力和良好的视力保健。

    private long startTime;
    private long endTime;
    private long totalUsage;
    private long averageUsage;
    private int restSuggestionInterval = 60; // in minutes
    
    public void startTracking() {
        startTime = System.currentTimeMillis();
    }
    
    public void stopTracking() {
        endTime = System.currentTimeMillis();
        totalUsage += (endTime - startTime) / 1000 / 60; // convert to minutes
        averageUsage = totalUsage / numOfTracks;
        if (totalUsage > restSuggestionInterval) {
            // show suggestion to take a break
        }
    }
    
    

    小结:①获取当前屏幕解锁时间:通过 Android 系统的 KeyguardManager API 可以判断屏幕是否处于解锁状态,并通过 PowerManager API 获取当前屏幕亮着或熄灭的时间。

    ②判断时间间隔:通过 Java 内置的 Calendar 类,可以方便的计算两个时间的差值,如果差值大于预定的分钟数,则表示屏幕已经解锁超过指定时间。

    ③弹出提醒:可以使用 Android 系统的 Notification API 弹出系统通知,也可以通过对话框 API 弹出自定义对话框。

    ④用户选择:通过对话框 API 弹出选择对话框,并监听用户的点击事件,根据用户选择的结果作出相应的操作,例如关闭提醒或息屏。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 2月9日
  • 已采纳回答 2月1日
  • 创建了问题 1月31日

悬赏问题

  • ¥15 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错
  • ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
  • ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载
  • ¥15 c#逐行读取txt文本,但是每一行里面数据之间空格数量不同
  • ¥50 如何openEuler 22.03上安装配置drbd
  • ¥20 ING91680C BLE5.3 芯片怎么实现串口收发数据
  • ¥15 无线连接树莓派,无法执行update,如何解决?(相关搜索:软件下载)
  • ¥15 Windows11, backspace, enter, space键失灵