当前位置: 首页 > web >正文

android设计——功能临时开启与永久管控

摘要:本文基于android平台,设计一种框架并实现对功能的管控和临时的开启。首先,使用SharedPreferences来保存默认状态,因为需要持久化存储,即使在重启或掉电后也能恢复。默认状态是永久开启或关闭,所以需要有一个地方存储当前的默认状态:表示是永久开启还是永久关闭。其次,创建一个BroadcastReceiver,监听指定的广播动作。当接收到广播时,解析三个参数,并进行参数校验。例如,检查mode是否为“permanent”或“temporary”,status是否为“enable”或“disable”,time是否为有效的正整数(当mode是临时且status是开启时)。根据当前的默认状态和接收到的参数,执行相应的逻辑。最后,处理临时任务的生命周期。例如,当设备重启或掉电时,临时任务会被取消,但默认状态保持不变。因此,在应用启动时,应该检查是否有正在进行的临时任务,但根据需求,重启后不需要处理未完成的倒计时,直接恢复默认状态即可。另外,当处于临时开启状态时,如果再次收到临时开启的请求,需要取消现有的倒计时,重新开始新的倒计时。这需要管理当前的倒计时实例,可能使用一个成员变量来持有CountDownTimer,并在需要时取消它。

在AndroidManifest.xml注册广播接收器:

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /><receiver android:name=".MyReceiver"android:exported="true"><intent-filter><action android:name="android.intent.action.BOOT_COMPLETED" /><action android:name="android.intent.settings.XXX_XXX" /></intent-filter>
</receiver><receiverandroid:name=".MyReceiver$BootReceiver"android:enabled="true"android:exported="true"><intent-filter><action android:name="android.intent.action.BOOT_COMPLETED" /></intent-filter>
</receiver>

实现代码(详见注释说明):

管控逻辑:

  1. 功能默认永久关闭
  2. 功能处于永久开启状态时:
    (1) 收到永久关闭请求时,永久关闭
    (2) 收到永久开启/临时开启请求时,显示已永久开启
  3. 功能处于永久关闭状态时:
    (1) 收到永久开启请求时,永久开启
    (2) 收到临时开启请求时,临时开启,倒计时,显示信息(临时开启,功能持续时间n分钟)
  4. 功能处于临时开启状态时:
    (1) 收到临时开启请求时,刷新计时时间,显示信息(功能已经处于临时开启状态,更新持续时间n分钟)
    (2) 收到永久开启/关闭请求时,永久开启/关闭
    (3) 倒计时时间到或者重启设备或者掉电后,开机恢复默认状态
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.CountDownTimer;
import android.widget.Toast;public class MyReceiver extends BroadcastReceiver {private static final String PREF_NAME = "xxx_config";private static final String KEY_MODE = "permanent_mode";  // 只保存永久状态private static final String KEY_STATUS = "permanent_status";// 临时任务相关(内存存储)private static CountDownTimer currentTimer;private static String tempBaseStatus; // 临时状态的基础状态@Overridepublic void onReceive(Context context, Intent intent) {if (!"android.intent.settings.XXX_XXX".equals(intent.getAction())) return;// 解析参数String mode = intent.getStringExtra("mode");String status = intent.getStringExtra("status");int time = intent.getIntExtra("time", 0);if (!validateParams(mode, status, time)) {Toast.makeText(context, "参数错误", Toast.LENGTH_SHORT).show();return;}SharedPreferences sp = context.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE);String savedMode = sp.getString(KEY_MODE, "permanent");String savedStatus = sp.getString(KEY_STATUS, "disable");handleCommand(context, mode, status, time, sp, savedStatus);}private boolean validateParams(String mode, String status, int time) {if (!"permanent".equals(mode) && !"temporary".equals(mode)) return false;if (!"enable".equals(status) && !"disable".equals(status)) return false;if ("temporary".equals(mode) && "enable".equals(status) && time <= 0) return false;return true;}private void handleCommand(Context context, String cmdMode, String cmdStatus, int time,SharedPreferences sp, String savedStatus) {// 当前是否有临时任务boolean hasTempTask = (currentTimer != null);if ("permanent".equals(cmdMode)) {handlePermanentCommand(context, cmdStatus, sp, savedStatus, hasTempTask);} else {handleTemporaryCommand(context, cmdStatus, time, sp, savedStatus, hasTempTask);}}private void handlePermanentCommand(Context context, String cmdStatus, SharedPreferences sp, String savedStatus,boolean hasTempTask) {if (hasTempTask) {cancelCurrentTimer();revertToSavedState(context, sp);}if (!savedStatus.equals(cmdStatus)) {updatePermanentState(sp, cmdStatus);if ("enable".equals(cmdStatus)) {performEnableAction(context);} else {performDisableAction(context);}} else {Toast.makeText(context, "状态未变化", Toast.LENGTH_SHORT).show();}}private void handleTemporaryCommand(Context context, String cmdStatus, int time,SharedPreferences sp, String savedStatus,boolean hasTempTask) {if (!"enable".equals(cmdStatus)) return;if (hasTempTask) {cancelCurrentTimer();} else {tempBaseStatus = savedStatus; // 记录基础状态}startTemporaryTask(context, time, sp);performEnableAction(context);}private void startTemporaryTask(Context context, int time, SharedPreferences sp) {currentTimer = new CountDownTimer(time * 1000L, 1000) {public void onTick(long millisUntilFinished) {}public void onFinish() {revertToSavedState(context, sp);currentTimer = null;}}.start();}private void revertToSavedState(Context context, SharedPreferences sp) {String savedStatus = sp.getString(KEY_STATUS, "disable");if ("disable".equals(savedStatus)) {performDisableAction(context);}}private void updatePermanentState(SharedPreferences sp, String status) {sp.edit().putString(KEY_MODE, "permanent").putString(KEY_STATUS, status).apply();}private void cancelCurrentTimer() {if (currentTimer != null) {currentTimer.cancel();currentTimer = null;}}// 开机状态恢复public static class BootReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {SharedPreferences sp = context.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE);String status = sp.getString(KEY_STATUS, "disable");if ("enable".equals(status)) {performEnableAction(context);} else {performDisableAction(context);}}}// 实际功能操作(示例)private static void performEnableAction(Context context) {// 系统级操作Toast.makeText(context, "功能已启用", Toast.LENGTH_SHORT).show();}private static void performDisableAction(Context context) {// 系统级操作Toast.makeText(context, "功能已禁用", Toast.LENGTH_SHORT).show();}
}
http://www.xdnf.cn/news/8459.html

相关文章:

  • FastJson1.2.24反序列化原理
  • 【Hadoop】Hadoop 的入门概述
  • 光子计算落地里程碑:实验级OSS芯片实现MNIST高效分类,登顶《Nature》子刊
  • STM32基本定时器的启动和停止
  • 多维数据助力企业网络安全
  • questions and answers_1
  • GitHub 趋势日报 (2025年05月22日)
  • Gemini 2.5 Pro 一次测试
  • 高项公式英文解析记忆
  • 大模型量化与双重量化(2)-- 代码示例与解释
  • Neo4j入门第二期(Spring Data Neo4j的使用)
  • Oracle 的 MOVE 操作是否重建表?
  • 【学习笔记】Sophus (Python) 使用文档
  • C#调用第三方C++版本SDK过程
  • windows bat 在目录下(包括子目录)搜索批量指定文件名称复制到另一个文件夹内
  • ES6 新增 API 方法
  • ​​3D 几何建模工具库​Open CASCADE(OCCT)简单介绍。
  • 如何评估物联网框架的交互体验?
  • springboot SnailJob client(客户端) 启动失败
  • 机器学习与深度学习:区别与联系
  • 【数据集】全球首个10米分辨率精细分类土地覆盖数据集GLC_FCS10
  • 鸿蒙ArkTS-发请求第三方接口显示实时新闻列表页面
  • 带您了解工业级网络变压器的浪涌等级测试有哪些条件?
  • mysql底层数据结构
  • 怎么判断一个Android APP使用了React Native 这个跨端框架
  • 【Golang】部分语法格式和规则
  • matlab时间反转镜算法
  • 2025年电工杯A题第一版本Q1-Q4详细思路求解+代码运行
  • day24Node-node的Web框架Express
  • C# Windows Forms应用程序-001