在设定的时间从睡眠中唤醒应用程序

2023-12-02

我想让我的应用程序进入睡眠状态,然后在设定的时间唤醒它。我让它睡觉但不会醒来。

这设置了唤醒锁:

private void setWakeLock(){
    System.out.println("wakelock");
    PowerManager pm = (PowerManager)context.getSystemService(Context.POWER_SERVICE);
    wl = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK |
            PowerManager.ACQUIRE_CAUSES_WAKEUP
            | PowerManager.ON_AFTER_RELEASE, "DoNotDimScreen");
    wl.acquire();
}

这设置了唤醒/睡眠时间的警报:

private void setWakeSleep(){
    java.util.Calendar c = java.util.Calendar.getInstance();
    c.set(java.util.Calendar.HOUR_OF_DAY, 17);
    c.set(java.util.Calendar.MINUTE, 53);
    c.set(java.util.Calendar.MILLISECOND, 0);
    Intent sleepIntent = new Intent("SLEEP_INTENT");
    PendingIntent sleepPendingIntent = PendingIntent.getBroadcast(this, 0, sleepIntent, PendingIntent.FLAG_UPDATE_CURRENT);
    AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
    alarmManager.set(AlarmManager.RTC_WAKEUP, c.getTimeInMillis(), sleepPendingIntent);

    c.set(java.util.Calendar.HOUR_OF_DAY, 18);
    c.set(java.util.Calendar.MINUTE, 14);
    c.set(java.util.Calendar.MILLISECOND, 0);
    Intent wakeIntent = new Intent("WAKE_INTENT");
    PendingIntent wakePendingIntent = PendingIntent.getBroadcast(this, 0, wakeIntent, PendingIntent.FLAG_UPDATE_CURRENT);
    AlarmManager alarmManager2 = (AlarmManager) getSystemService(ALARM_SERVICE);
    alarmManager2.set(AlarmManager.RTC_WAKEUP, c.getTimeInMillis(), wakePendingIntent);
}

这是广播接收器:

private BroadcastReceiver receiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        Time updateHour = new Time();
        updateHour.set(System.currentTimeMillis());         
        if (intent.getAction().equals("SLEEP_INTENT")) {
            System.out.println("sleep");
            wl.release();
        }
        if (intent.getAction().equals("WAKE_INTENT")) {         
            wl.acquire();
            System.out.println("wake");
            //initialise();
        }
    }
};

非常感谢任何帮助!


首先,你不需要唤醒锁;这些是为了防止设备进入睡眠状态,这是高度反社交的,除非您的应用程序确实需要它(它会耗尽电池)。

其次,如果您在 18:14 之后调用设置唤醒时间的代码将会失败,因为您现在将定义过去的时间。我们暂时忽略它。

接下来,您的意图操作应该类似于“org.user1797190.WAKE_INTENT”,而不是简单的“WAKE_INTENT”,这可能会导致冲突。如果您预计公开此意图,请考虑在以下网址注册:http://openintents.org。但这也不是你的问题。

您不需要alarmManager2——系统中只有一个警报管理器,因此只需重复使用第一个即可。

我从未听说过让应用程序本身进入“睡眠”状态。您的意思是您希望该应用程序消失,然后稍后再回来吗?

这就是我要做的。完全忘记“SLEEP_INTENT”。只需安排一个“WAKE_INTENT”,然后调用 finish()。您的应用程序将直接离开屏幕。

我会完全忘记广播接收器。相反,我会使用 getActivity() 而不是 getBroadcast() 来获取将重新启动活动的挂起意图。修改您的清单,以便您的 WAKE_INTENT 将进入该活动。另外,您应该将“android:launchMode”属性设置为“singleTask”,这样就不会创建活动的多个实例。您还需要实施onNewIntent()如果您的活动到达时已经在运行,则处理唤醒意图。

最后,如果您的活动是创建意图的同一应用程序的一部分,那么您根本不需要命名意图;您可以按类别创建它们。不过,您需要另一种方式让接收者知道这是唤醒意图。

所以,把它们放在一起:

您的清单应包含:

<activity android:name=".TestActivity" android:launchMode="singleTask">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

您的代码应包含:

/**
 * Arrange for the activity to return at a specific time.
 * Call finish() after calling this method().
 * This function can be called from anywhere that has a valid Context.
 */
public static void scheduleWakeup(Context ctx, long timeMillis) {
    if (DEBUG) Log.d(TAG, "Scheduling wakeup for " + timeMillis);
    Intent intent = new Intent(ctx, TestActivity.class);
    intent.putExtra("wakeup", true);
    PendingIntent pi = PendingIntent.getActivity(ctx, 0, intent,
                          PendingIntent.FLAG_UPDATE_CURRENT);
    AlarmManager mgr = (AlarmManager) ctx.getSystemService(Context.ALARM_SERVICE);
    mgr.cancel(pi);    // Cancel any previously-scheduled wakeups
    mgr.set(AlarmManager.RTC_WAKEUP, timeMillis, pi);
}

...

protected void onCreate(Bundle state) {
    Intent intent = getIntent();
    if (intent.getBooleanExtra("wakeup", false)) {
        // We were woken up by the alarm manager
    }
    ...
}

protected void onNewIntent(Intent intent) {
    if (intent.getBooleanExtra("wakeup", false)) {
        // We were woken up by the alarm manager, but were already running
    }
}

这与我在自己的应用程序中所做的非常接近,并且对我来说非常有效。

当然,您必须亲自测试一下。 Log.d() 是你的朋友。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在设定的时间从睡眠中唤醒应用程序 的相关文章

  • Android短音的正确播放方法?

    我正在创建一个应用程序 屏幕上将有多个图像 这些图像将是按钮 点击时会播放短促的声音 我对此进行了研究 只能找到我当前用来播放声音的方法 这似乎根本没有响应 我希望声音能够快速播放并且能够响应多次快速点击 我不确定这在 Android 中是
  • Cheesesquare:enterAlways 会产生错误的布局

    Adding enterAlways到 Cheesesquare 演示的滚动标志
  • 从响应中获取标头(Retrofit / OkHttp 客户端)

    我正在使用 Retrofit 与 OkHttp 客户端和 Jackson 进行 Json 序列化 并希望获取响应的标头 我知道我可以扩展 OkClient 并拦截它 但这发生在反序列化过程开始之前 我基本上需要的是获取标头以及反序列化的 J
  • 如何正确释放Android MediaPlayer

    我正在尝试向我的 Android 应用程序添加一个按钮 当点击该按钮时它会播放 MP3 我已经让它工作了 但没有办法释放 mediaPlayer 对象 因此即使在我离开活动后它仍然会继续播放 如果我在react 方法之外初始化MediaPl
  • 如何在 Linux 内核中定义并触发我自己的新软中断?

    我想在 Linux 内核中创建自己的软中断 这是正确的方法吗 In the init我想触发该模块的softirq我将添加一个调用 394 void open softirq int nr void action struct softir
  • Recyclerview 动态部分不使用任何第三个库

    我想将标头添加到 recyclerview 我正在尝试使用来实现它 Override public int getItemViewType int position depends on your problem if position 0
  • 如何使用 Google Maps for Android V2 处理地图移动结束?

    我想在地图中心更改后立即对地址进行地理编码 如何使用新的 Android 版 Google 地图 V2 处理地图移动 我说的是用户用手指拖动地图的情况 查看新的地图 API Override public void onMapReady G
  • 将现有 VARCHAR 列与 Room 结合使用

    我正在尝试将现有的数据库与 Android Room 一起使用 但是 我的一个表有一个 VARCHAR 列 Room 似乎只支持 TEXT 不支持 VARCHAR 而且 sqlite 不允许修改列类型 那么 有没有办法使用Room中现有的带
  • 通过 WhatsApp 发送消息

    由于我发现了一些较旧的帖子 表明 Whatsapp 不支持此功能 我想知道是否发生了变化 以及是否有办法打开与我通过意图发送的号码进行 Whatsapp 聊天 UPDATE请参阅https faq whatsapp com en andro
  • 如何更改终端的默认目录?

    我想更改 Android Studio v2 2 2 终端的默认目录 当我打开终端时 它基于项目的目录 C 项目路径 我经常需要使用adb shell 所以我必须导航到 SDK 路径 平台工具 才能使用 adb 命令 是否可以更改终端的默认
  • 当它的父级是 ConstraintLayout 时设计 CardView 吗?

    我在编辑包含Relativelayout的Cardview内的RelativeLayout时搞砸了 ConstraintLayout会将相对布局的wrap content更改为0并添加工具 layout editor absoluteX 1
  • 从 BroadcastReceiver 类调用活动方法

    我知道我可以做一个内部接收器类来调用接收器中的任何方法 但我的主要活动太大了 要做的事情也很多 因此 我需要一个扩展广播接收器的类 但它不是内部类 并且可以从我的主要活动中调用一种方法 我不知道是否可能 但我的活动是家庭活动和 single
  • 如何在谷歌地图android上显示多个标记

    我想在谷歌地图android上显示带有多个标记的位置 问题是当我运行我的应用程序时 它只显示一个位置 标记 这是我的代码 public class koordinatTask extends AsyncTask
  • 使用片段时应用程序崩溃

    我正在处理碎片和 我的代码中有一个我找不到的问题 logcat 指向我的一个片段中的这段代码 Override public View onCreateView LayoutInflater inflater ViewGroup conta
  • 对于一个单元格,RecyclerView onBindViewHolder 调用次数过多

    我正在将 RecyclerView 与 GridLayoutManager 一起使用 对于网格中的每个项目 我需要调用 REST api 来检索数据 然后 从远程异步获取数据后 我使用 UIL 加载 显示图像 一切似乎都很好 但我发现 on
  • Android 中如何通过彩信发送图片?

    我正在开发多媒体应用程序 我正在通过相机捕获一张图像 并希望将该图像和文本发送到其他号码 但我不知道如何通过彩信发送图像 MMS 只是一个 http post 请求 您应该使用执行请求额外的网络功能 final ConnectivityMa
  • 如何在 Android 中从 WorkManager 取消工作?

    我已经保存了 WorkManagerUUID转换成String在领域数据库中 这是代码 Constraints constraints new Constraints Builder setRequiredNetworkType Netwo
  • 在命令行上卸载 Android SDK 的选定部分

    这与 卸载旧的 Android SDK 版本 https stackoverflow com questions 15182377 uninstall old android sdk versions 除非我想在无头 Linux CI 服务
  • Android 后台倒计时器

    我有一个 Android 应用程序 它管理一个倒计时器 类 CountDownTimer 它显示在应用程序屏幕中 以显示到达 00 00 还剩多少时间 我现在的问题是 当我按主页按钮或启动另一个应用程序时 应用程序 计时器不会在后台运行 所
  • Android 屏幕方向错误

    我使用的是 Android HTC HERO 2 1 版本 我写的活动

随机推荐

  • mvc3,编辑器模板,css 类,最大长度和大小

    我有一个编辑器模板如下 但 class maxlength 和 size 属性未获取源代码 using System Globalization model DateTime Html TextBox Model null Model Ha
  • GCC 常量变量的弱属性

    我有一个关于 const 变量的弱属性的问题 我用 gcc 编译了以下几个文件 main c include
  • Powershell - 每月计划任务触发器

    我目前正在通过 Powershell 自动创建计划任务 并且我正在使用New ScheduledTaskAction New ScheduledTaskTrigger and Register ScheduledTask命令 现在 我有一些
  • 删除所有已安装的 OpenCV 库

    我正在运行 Kubuntu 11 10 带有 KDE 4 8 在阅读这一切之前 我只想从我的系统中删除 OpenCV 的所有痕迹 这样我就可以重新开始 整个故事 我首先安装了 python opencv 和 libopencv 我认为是 2
  • Javascript 中函数声明中的双冒号?

    今天我发现了这段代码片段 我找不到anything相关解释此语法 真的是JavaScript吗 这是对的吗 如果不是 代码应该是什么样子 这是一个没
  • 更新到 laravel 5.4 后出现会话错误

    从laravel 5 3更新到5 4后 我在vendor中遇到了错误 错误是 Symfony Component Debug Exception FatalThrowableError 调用 var www ostadbank com ve
  • Android BLE扫描模式设置间隔

    我正在编写一个小型测试应用程序来评估蓝牙模块 该应用程序当前正在使用积极的匹配模式和低延迟扫描模式进行扫描 我们控制了蓝牙模块的广告间隔 并正在尝试评估需要多少广告才能触发android中的回调 有谁知道与低延迟 平衡和低功耗扫描模式设置相
  • 使用 Java 在 GUI 编程中混合 awt 和 swing

    我在 SO 上读到混合 awt 和 swing 对于 Java 中的 GUI 编程来说并不是一个好的方法 但我无法找到任何在使用 swing 时不使用某些 awt 组件的示例 例如 即使使用 swing 我遇到的大多数示例也会使用 awt
  • MySQL:如何查询父子关系?

    假设有如下表记录 TABLE foo foo id foo parent id 1 NULL 2 NULL 3 1 4 2 5 1 6 1 7 2 8 1 9 NULL
  • Log4J 2 查找值在加载/呈现之前在配置中使用

    我正在使用 SystemPropertiesLookup 查找来配置我的 Log4J2 配置 系统属性被设置为我的主要方法中的第一行 问题是 当 Log4J 加载配置时 尚未调用 main 方法 因此系统属性尚未填充 这是我的 log4j2
  • 模板类 - 无法解析的外部符号[重复]

    这个问题在这里已经有答案了 我经常收到这个错误 但我不知道为什么 有人可以帮我找到原因吗 编辑 删除代码 将实现 您的方法定义 与类声明一起放入标头中 请参阅这在 C 常见问题解答中 一些编译器支持 export 关键字来按照您的方式执行此
  • 获取上次打开的 MS Word 文档对象

    我有一个从 MS Word 2003 模板 dot 中的 VBA AutoNew 子函数调用的 python 脚本 因此每次从此 Word 模板创建文档时它都会运行 第三方应用程序从此模板创建文档 第三方应用程序如何设置文档存在许多格式问题
  • 多态类中的虚拟析构函数

    我知道只要有一个多态基类 该基类就应该定义一个虚拟析构函数 这样当一个指向派生类对象的基类指针被删除时 它会先调用派生类的析构函数 如果我在这里错了 请纠正我 另外 如果基类析构函数是非虚拟的 则删除指向派生对象的基类指针将是未定义的行为
  • 如何在 .NET MAUI Flyout Shell 应用程序中自定义标题?

    如何缩小标题间距 当我更改汉堡图标时 其图标颜色始终为白色 怎么了 我可以设置标题字体大小和字体系列吗 在 Android 上可以设置contentInsetLeft contentInsetStart contentInsetStartW
  • 如何在 Python 中对文本文件中的数字求和

    我有一个代码依赖于我读取一个文本文件 在有数字的地方打印数字 在有字符串而不是数字的地方打印特定的错误消息 然后将所有数字相加并打印它们的总和 然后只保存编号到新的文本文件 我已经尝试这个问题几个小时了 我得到了下面写的内容 我不知道为什么
  • PyQt/PySide中连接点击信号时lambda和partial的区别

    当将一组按钮中的多个单击信号连接到带有参数的单个槽函数时 我遇到了信号槽问题 lambda and functools partial可以使用如下 user user button clicked connect lambda callus
  • 如何在 IntelliJ 中调试多线程应用程序?

    我在 IntelliJ IDEA 14 0 2 中遇到了一个关于多线程和断点的奇怪问题 断点之后的代码会在断点处停止之前执行 import java util concurrent atomic AtomicInteger public c
  • 使用 jQuery、JSON 和 AJAX 填充下拉列表

    就像标题所说 我正在尝试使用 jQuery JSON 和 AJAX 创建一个下拉菜单 尽管我熟悉理论但尚未将其付诸实践 任何建议 演示代码片段或教程将不胜感激 因为我希望有一个最好的开始 提前致谢 您需要执行 getJSON 调用以在 do
  • 无法使用 Flask 从下拉列表中获取在 python 中选择的值

    这个问题可能是重复的 但我已经检查了此类相关问题的所有答案 但无法解决 我试图从由数字组成的下拉菜单中获取值 然后我想将数字与值进行比较并根据比较显示文本 Eg if value selected from dropdown gt 3 di
  • 在设定的时间从睡眠中唤醒应用程序

    我想让我的应用程序进入睡眠状态 然后在设定的时间唤醒它 我让它睡觉但不会醒来 这设置了唤醒锁 private void setWakeLock System out println wakelock PowerManager pm Powe