sendWakefulWork 并不总是用 cwac-wakeful-1.1.0 调用

2023-12-08

我有一个问题困扰了很长时间,我发现了 CWAC-wakeful,它可以解决我所有的问题。我想... :'( 简而言之,为了解决这个问题,我实现了一个最简单的应用程序,它每 60 秒安排一次警报并每次记录一次。 这是我的代码:

主要活动 :

package com.par.hasard.mysimpleapplication;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button button = (Button)findViewById(R.id.myExportButton);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                MyLogManager.copyLogToClipboard(view.getContext());
                MyLogManager.emptyLogFile(view.getContext());
            }
        });
        try {
            MyLogManager.createLogFile(this);
            MyLogManager.write(this, "Application launched\n");
            MyAlarmPlanner.planAlarm_v2(this);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

我的闹钟计划:

package com.par.hasard.mysimpleapplication;

import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.os.SystemClock;
import android.widget.Toast;
import com.commonsware.cwac.wakeful.WakefulIntentService;
import java.io.IOException;

public class MyAlarmPlanner {
    public static void planAlarm_v2(Context context) throws IOException {
        MyLogManager.write(context, "Beginning of planAlarm_v2\n");
        WakefulIntentService.scheduleAlarms(new MyAppListener(), context, true);
        MyLogManager.write(context, "End of planAlarm_v2\n");
    }
}

我的应用程序监听器:

package com.par.hasard.mysimpleapplication;

import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Context;
import android.os.SystemClock;

import com.commonsware.cwac.wakeful.AlarmReceiver;
import com.commonsware.cwac.wakeful.WakefulIntentService;

import java.io.IOException;

public class MyAppListener implements WakefulIntentService.AlarmListener {
    @Override
    public void scheduleAlarms(AlarmManager alarmManager, PendingIntent pendingIntent, Context context) {
        try {
            MyLogManager.write(context, "Beginning of scheduleAlarms\n");
            alarmManager.setExact(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime()+60000, pendingIntent);
            MyLogManager.write(context, "End of scheduleAlarms\n");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void sendWakefulWork(Context context) {
        try {
            MyLogManager.write(context, "Beginning of sendWakefulWork\n");
            WakefulIntentService.sendWakefulWork(context, MyAppService.class);
            MyLogManager.write(context, "End of sendWakefulWork\n");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    public long getMaxAge(Context context) {
        return (AlarmManager.INTERVAL_FIFTEEN_MINUTES * 2);
    }
}

我的应用服务:

package com.par.hasard.mysimpleapplication;
import android.content.Intent;
import com.commonsware.cwac.wakeful.WakefulIntentService;
import java.io.IOException;

public class MyAppService extends WakefulIntentService {
    public MyAppService(){
        super("MyAppService");
    }

    @Override
    protected void doWakefulWork(Intent intent) {
        try {
            MyLogManager.write(this, "Beginning of doWakefulWork\n");
            MyAlarmPlanner.planAlarm_v2(this);
            MyLogManager.write(this, "End of doWakefulWork\n");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

显现 :

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.par.hasard.mysimpleapplication">
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />


    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <receiver android:name="com.par.hasard.mysimpleapplication.MySimpleWakefulReceiver">
            <intent-filter android:priority="1">
                <action android:name="com.par.hasard.mysimpleapplication.REGULAR_ALARM" />
            </intent-filter>
        </receiver>

        <receiver android:name="com.commonsware.cwac.wakeful.AlarmReceiver">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED"/>
            </intent-filter>

            <meta-data
                android:name="com.commonsware.cwac.wakeful"
                android:resource="@xml/wakeful"/>
        </receiver>
        <service android:enabled="true" android:name="com.par.hasard.mysimpleapplication.MySimpleWakefulService" />
        <service android:enabled="true" android:name="com.par.hasard.mysimpleapplication.MyAppService" />
    </application>

</manifest>

唤醒.xml:

<WakefulIntentService
    listener="com.par.hasard.mysimpleapplication.MyAppListener"
    />

所有这些工作都很完美,但有时,它不会记录任何内容。我认为这是由于我的手机(索尼 Xperia)的睡眠模式造成的。但在其他手机上似乎也有同样的行为。 这是日志的示例:

18/12 2h47m37s304 => Beginning of sendWakefulWork
18/12 2h47m37s311 => End of sendWakefulWork
18/12 2h47m37s316 => Beginning of doWakefulWork
18/12 2h47m37s317 => Beginning of planAlarm_v2
18/12 2h47m37s320 => Beginning of scheduleAlarms
18/12 2h47m37s322 => End of scheduleAlarms
18/12 2h47m37s323 => End of planAlarm_v2
18/12 2h47m37s324 => End of doWakefulWork
18/12 2h48m37s332 => Beginning of sendWakefulWork
18/12 2h48m37s338 => End of sendWakefulWork
18/12 2h48m37s347 => Beginning of doWakefulWork
18/12 2h48m37s348 => Beginning of planAlarm_v2
18/12 2h48m37s350 => Beginning of scheduleAlarms
18/12 2h48m37s351 => End of scheduleAlarms
18/12 2h48m37s352 => End of planAlarm_v2
18/12 2h48m37s353 => End of doWakefulWork
18/12 3h35m6s293 => Beginning of sendWakefulWork    //nothing before ??
18/12 3h35m6s298 => End of sendWakefulWork
18/12 3h35m6s319 => Beginning of doWakefulWork
18/12 3h35m6s327 => Beginning of planAlarm_v2
18/12 3h35m6s331 => Beginning of scheduleAlarms
18/12 3h35m6s338 => End of scheduleAlarms
18/12 3h35m6s340 => End of planAlarm_v2
18/12 3h35m6s345 => End of doWakefulWork
18/12 3h36m7s307 => Beginning of sendWakefulWork
18/12 3h36m7s313 => End of sendWakefulWork
18/12 3h36m7s319 => Beginning of doWakefulWork
18/12 3h36m7s320 => Beginning of planAlarm_v2
18/12 3h36m7s322 => Beginning of scheduleAlarms
18/12 3h36m7s323 => End of scheduleAlarms
18/12 3h36m7s324 => End of planAlarm_v2
18/12 3h36m7s325 => End of doWakefulWork

有人能帮我吗 ?


就时间差距而言,您很可能在 Android 6.0+ 设备上体验打瞌睡模式,或者某些制造商在旧设备上提供的等效模式(例如索尼的 STAMINA 模式)。除了将您的应用程序添加到适当的白名单(例如,对于打瞌睡,设置 > 应用程序 >(齿轮图标) > 特殊访问 > 电池优化)之外,您几乎无能为力。

欢迎您切换到setExactAndAllowWhileIdle()但是,在 API 级别 23 以上的设备上:

  • 你不会每分钟都得到控制(我认为仅限于每9分钟)

  • 当您获得控制权时,您将无法访问互联网(这可能是您真正尝试做的任何事情所必需的)

  • 这对于制造商特定的 6.0 之前的设备没有帮助(因为该方法不存在)

总的来说,设计您的应用程序来处理打瞌睡模式,而不是假设它将在后台获得太多控制权,是一种更可靠的方法。

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

sendWakefulWork 并不总是用 cwac-wakeful-1.1.0 调用 的相关文章

  • 在应用程序简历中隐藏软键盘

    我有一个 Android 应用程序 使用 Xamarin 用 C 编写 我已将应用程序简化为包含 TextView 和用于横幅广告的 Google admod AdView 的 LinearLayout 我不希望软键盘出现在应用程序中 这不
  • 使用 Android 前台服务为 MediaPlayer 创建通知

    问题就在这里 我目前正在开发一个应用程序 该应用程序必须提供 A 广播播放器 来自 URL 的 AAC 直播 还有一个播客播放器 来自 URL 的 MP3 流 该应用程序必须能够在后台运行 Android 服务 并通过以下方式向用户公开持续
  • 如何将安卓手机从睡眠状态唤醒?

    如何以编程方式将 Android 手机从睡眠状态唤醒 挂起至内存 我不想获取任何唤醒锁 这意味着手机在禁用 CPU 的情况下进入 真正的 睡眠状态 我想我可以使用某种RTC 实时时钟 机制 有人有例子吗 Thanks 为了让Activity
  • Delphi XE7 Android 全屏(隐藏软键)

    如何在XE7中全屏显示 隐藏顶部 标题 和底部 软键 工具栏 在 XE6 中 我可以通过在应用程序部分写入来调整 AndroidManifest 以使我的应用程序全屏显示并且没有操作栏 android theme android style
  • Android Studio 在编译时未检测到支持库

    由于 Android Studio 将成为 Android 开发的默认 IDE 因此我决定将现有项目迁移到 Android studio 中 项目结构似乎不同 我的项目中的文件夹层次结构如下 Complete Project gt idea
  • 已经使用 AsyncTask doInBackground 但新数据未显示

    我使用 AsyncTask 创建一个聊天室来接收消息 因此它总是检查即将到来的消息并将其显示给客户端 但代码似乎无法按我希望的方式工作 在客户端只显示所有旧数据 新数据不显示 因为当我尝试从服务器发送消息时 新数据没有显示在客户端中 我对这
  • TextView 之间有分隔线

    我正在尝试在 android studio 中创建以下布局 因为我对 android 东西还很陌生 所以我第一次尝试使用 LinearLayout 并认为这可能无法实现 现在我正在尝试使用RelativeLayout 我已经用颜色创建了这个
  • 更新到材质 1.2.0 后,材质按钮上缺少圆角半径属性

    这是我的材质按钮代码
  • 从 Firebase 数据库填充微调器

    public class MainActivity extends AppCompatActivity DatabaseReference reference Spinner areaSpinner ArrayList
  • minHeight 有什么作用吗?

    在附图中 我希望按钮列与图像的高度相匹配 但我也希望按钮列有一个最小高度 它正确匹配图像的高度 但不遵守 minHeight 并且会使按钮向下滑动 我正在为按钮列设置这些属性
  • 检查 Android 手机上的方向

    如何查看Android手机是横屏还是竖屏 当前配置用于确定要检索的资源 可从资源中获取Configuration object getResources getConfiguration orientation 您可以通过查看其值来检查方向
  • Android相机意图:如何获取全尺寸照片?

    我正在使用意图来启动相机 Intent cameraIntent new Intent android provider MediaStore ACTION IMAGE CAPTURE getParent startActivityForR
  • 材质设计图标颜色

    应该是哪种颜色 暗 材质图标 在官方文档上 https www google com design spec style icons html icons system icons https www google com design s
  • Android 设备上的静默安装

    我已经接受了一段时间了 在 Android 上静默安装应用程序是不可能的 也就是说 让程序安装捆绑为 APK 的应用程序 而不提供标准操作系统安装提示并完成应用程序安装程序活动 但现在我已经拿到了 Appbrain 快速网络安装程序的副本
  • 下载后从谷歌照片库检索图像

    我正在发起从图库中获取照片的意图 当我在图库中使用 Nexus 谷歌照片应用程序时 一切正常 但如果图像不在手机上 在 Google Photos 在线服务上 它会为我下载 选择图像后 我将图像发送到另一个活动进行裁剪 但在下载的情况下 发
  • Android中webview的截图方法

    我在 webview 中的 html5 canvas 上画了一些线 并尝试使用下面的代码截取 webview 的屏幕截图 WebView webView WebView findViewById R id webview webView s
  • Android:有没有办法以毫安为单位获取设备的电池容量?

    我想获取设备的电池容量来进行一些电池消耗计算 是否可以以某种方式获取它 例如 三星 Galaxy Note 2 的电池容量为 3100mAh 谢谢你的帮助 知道了 在 SDK 中无法直接找到任何内容 但可以使用反射来完成 这是工作代码 pu
  • 使用 Espresso 检查 EditText 的字体大小、高度和宽度

    如何使用 Espresso 检查 EditText 的字体大小 高度和宽度 目前要分割我使用的文本 onView withId R id editText1 perform clearText typeText Amr 并阅读文本 onVi
  • 在webview android中加载本地html文件

    我正在尝试在 android 的 webview 中加载 html 文件的内容 但是 它给了我 网页不可用错误 如果我尝试使用谷歌或雅虎等网站 它们就会起作用 html文件位于src gt main gt assests gt index
  • 如何删除因 Google Fitness API 7.5.0 添加的权限

    将我的 play services fitness api 从 7 0 0 更新到 7 5 0 后 我注意到当我将新版本上传到 PlayStore 时 它 告诉我正在添加一个新权限和 2 个新功能 我没有这样做 有没有搞错 在做了一些研究来

随机推荐

  • 用于没有固定列的 HTML 动态布局的 CSS?

    我想设置这样的布局 两列都是动态的 一个由内容设置 第二个由第一列和最小宽度设置 我找到了许多解决方案 其中列的宽度是固定的 但它没有解决这个问题 看看我想要在屏幕上实现什么 我应该使用什么CSS 对于这样的东西有不同的方法 一个简单的方法
  • 将 vertex.label 放置在 igraph 中的圆形布局之外

    我有一个圆形布局 igraph 我希望顶点标签显示在圆形区域之外 尝试玩周围vertex label cex and vertex label degree但没有用 请指教 vertex label degree需要一些认真的 但简单的 调
  • matplotlib 动画保存不遵守 blit=True 但它似乎在 plt.show() 中工作得很好

    我对 Python 很陌生 正在尝试使用 matplotlib 对文本进行动画处理 使用几个在线示例得出以下代码 import matplotlib pyplot as plt import matplotlib animation as
  • 如何在 Mac OS X 中获取指向二进制部分的指针?

    我正在编写一些代码 将一些数据结构存储在一个特殊的命名二进制部分中 这些都是同一结构的实例 分散在许多 C 文件中 并且不在彼此的范围内 通过将它们全部放在指定的部分中 我可以迭代它们 这与 GCC 和 GNU ld 完美配合 由于缺少而在
  • 核心数据设计——如何同时拥有应用数据和用户数据?

    我遇到的情况是 我有一组随我的应用程序附带的基本信息 用户可以添加或编辑此信息 但有时 我需要能够更新基础数据 我不想触及用户更改 添加 我看过这个问题 但所使用的类比有点陌生 这一定是一个常见问题 我希望听到此类混合数据集的实践和经验 我
  • 如何使用多项逻辑回归解决多标签分类问题?

    我必须根据其他属性来预测学生所在的课程类型 prog是一个分类变量 指示学生所在课程的类型 普通 1 学术 2 或 职业 3 Ses是一个分类变量 表示某人的社会经济阶层 低 1 中 2 和 高 3 read write math scie
  • 在R中绘制频率密度直方图

    使用 R 任何人都可以告诉我如何绘制一个简单的直方图 并且以下数据的箱之间没有间隙 Class Width Freq Dist 0 lt x lt 5 0 2 5 lt x lt 15 0 1 15 lt x lt 20 1 2 20 lt
  • 主键和外键

    我有3张桌子 Student Loan Book StudentID LoanID BookID 我需要设置哪些外键 以便在给出学生姓名时 搜索该学生的所有贷款并显示书籍详细信息 这是从如此模糊的要求开始的 CREATE TABLE dbo
  • 如何处理用户离开对话

    我们有使用 OnMembersAddedAsync 方法的欢迎示例 但没有示例显示如何处理用户离开对话 我尝试覆盖 OnMembersRemovedAsync 但它似乎没有被调用 至少当我使用机器人框架模拟器时 我需要在用户离开 离开对话时
  • Holoviews 相关热图和回归图的点击流

    我想为 DataFrame 制作一个相关热图 并为每对变量制作一个回归图 我已尝试阅读所有文档 但仍然很难连接两个图 以便当我点击热图时 可以显示相应的回归图 这是一些示例代码 import holoviews as hv from hol
  • Javascript Promise 中的resolve和reject实际上做了什么

    起初 我认为resolve只需将参数传递给函数即可then 所以我尝试了这个 const promise new Promise resolve reject gt resolve new Promise resolve gt resolv
  • Jython:如何使用文件“jython-2.7-b1.jar”

    我是 Jython 新手 我从这里下载了一个jar文件http www jython org downloads html 下载 Jython 2 7beta1 jython jar 安装程序 不带捆绑 python 文件的独立版本 当我运
  • 在 C++ 中集成 swf

    有没有办法制作包含 swf 的 C GUI 应用程序 swf 文件非常小 并且比 gif 或其他类型的动画更容易制作 因此如果能够包含它们就太好了 一些图书馆的推荐 免费甚至开源 您可以在应用程序中托管 Flash 播放器本身 您只需实现您
  • linux下如何合并相似的行

    我的 Linux 系统上有一个文件 test txt 其中包含以下格式的数据 first second third fourth 10 first second third fourth 20 fifth sixth seventh eig
  • Python Tkinter 中的图像问题

    我一直在尝试将图像包含在我的 Tkinter 小部件中 但似乎没有任何效果 这是我的代码 from Tkinter import from PIL import Image root Tk image Image open images m
  • 如何在Python中将字符串转换为列表?

    l Hello my name is Apple l1 Hello my name is Apple type l 回报str但我希望它是一个列表 如l1 is 如何将该字符串转换为通用列表 the ast模块有一个literal eval
  • 循环未完成保存 pdf [重复]

    这个问题在这里已经有答案了 我正在写一个循环 循环的目的是创建许多图并将它们保存为PDF 选择数据的子集后 我执行以下操作 pdf path to the desired filename width 16 height 7 some gg
  • Swift 默认 AlertViewController 打破约束

    我正在尝试使用带有样式的默认 AlertViewController actionSheet 由于某种原因 警报会导致约束误差 只要alertController不是通过按钮触发 显示 整个视图就不存在约束错误 难道这是一个Xcode 的错
  • 如何逐行分析 cython 函数

    我经常努力寻找自己的瓶颈cython代码 我怎样才能了解个人资料cython逐行函数 罗伯特 布拉德肖 Robert Bradshaw 帮助我获得了罗伯特 科恩 Robert Kern 的line profiler工具工作于cdef函数 我
  • sendWakefulWork 并不总是用 cwac-wakeful-1.1.0 调用

    我有一个问题困扰了很长时间 我发现了 CWAC wakeful 它可以解决我所有的问题 我想 简而言之 为了解决这个问题 我实现了一个最简单的应用程序 它每 60 秒安排一次警报并每次记录一次 这是我的代码 主要活动 package com