重新启动后,试图在android中重新安排以前的报警通知的代码?登录我的手机?

重新启动后,试图在android中重新安排以前的报警通知的代码?登录我的手机?,android,android-studio,Android,Android Studio,我正在尝试,但是,它不工作在模拟器或在我的手机上,所以我有问题的模拟器日志和电话,并重新启动模拟和调试 我在底部有一些非常有趣的笔记,让我很困惑 我正在使用API 24和pixel 3模拟器以及真正的三星8手机 我做典型的添加到 <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> 对于模拟,我单击play按钮并观看我的应用程序出现。然后我按住电源按钮,它只在我真

我正在尝试,但是,它不工作在模拟器或在我的手机上,所以我有问题的模拟器日志和电话,并重新启动模拟和调试

我在底部有一些非常有趣的笔记,让我很困惑

我正在使用API 24和pixel 3模拟器以及真正的三星8手机

我做典型的添加到

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
对于模拟,我单击play按钮并观看我的应用程序出现。然后我按住电源按钮,它只在我真的只想重新启动时给我一个“关机”选项…奇怪,所以我关机了。这似乎完全退出了模拟,当我在Android Studio中再次单击模拟器上的play时,它就会记录下来

08/06 19:17:40: Launching 'app' on Pixel 3 API 24.
$ adb shell am start -n "app.mykeepintouch.kit/app.mykeepintouch.kit.MainActivity" -a android.intent.action.MAIN -c android.intent.category.LAUNCHER
...
D/MainActivity: onCreate: starting
没有启动日志可供我重新注册通知问题1:模拟器能否正确模拟此情况?

接下来,我的真实手机-嗯,我猜也是一样,但也许我至少可以在手机上查看一些日志?我遇到的帖子谈到了将日志转储到sd卡,但我已经连接到android studio,所以我认为我可以以某种方式将日志转储到android studio

编辑:我也在那篇文章中使用。我做了一个git克隆,导入了这个项目,选择了API 24,并在PollReceiver中添加了一个日志。它在我上床睡觉的时候起作用,而在我今天早上跑步的时候第二次跑步就不起作用了。我会在调试我想到的随机场景时添加更多信息

怪异场景1:如果我打开了两个android studio项目,打开我的个人应用程序,然后在我的项目之后打开示例链接应用程序,我会看到一个祝酒词“Alarms scheduled”。不过,在5秒后警报响起之前,我在PollReceiver上找不到任何日志。我本来希望在启动时看到PollReceiver的日志,但直到5秒后才看到。之后的另一次运行没有产生任何日志(除了弹出的toast消息,所以我知道它运行的代码…非常奇怪)。我在ScheduledServiceDemoActivity中添加了一条日志消息,现在我无法一次复制0条这样的日志

怪异场景2:我重新启动手机(或者它一直启动我的应用程序,场景1一直工作)。然后我只启动示例链接应用程序,什么都没有发生。我等了90秒什么也没等

这可能就是为什么它在我昨晚睡觉前起作用的原因,就像我在场景1中那样

最后的猜测:我永远无法让PollReceiver在启动时启动。ScheduledServiceDemoActivity似乎是真正的入口点,我从来没有在我的上述代码中添加过服务,因为我不想要一个……只是想得到启动以重新安排警报的通知这就引出了一个可能的结论ScheduledServiceDemoActivity在启动时会在某些设备上触发,而PollReceiver在启动时会在其他设备上触发?如果是这样,什么模拟器可以模拟其他启动场景

编辑(我有另一个想法)在我的三星手机上,我检查了权限,虽然我在清单中添加了这4行,但只有三行权限

<!-- So we can make a phone call out -->
<uses-permission android:name="android.permission.CALL_PHONE" />
<!-- so we can send a text -->
<uses-permission android:name="android.permission.SEND_SMS" />
<!-- So we can reschedule alarms that went off while powered off -->
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<!-- read contacts so they can easily choose their friends -->
<uses-permission android:name="android.permission.READ_CONTACTS" />

接收引导不在那里。这就是问题所在吗?或者手机没有向用户列出接收引导已完成,因为这可能会让人困惑

谢谢,
Dean

尝试将其添加到清单中的意图过滤器中:

<receiver android:name=".biz.alarm.BootupReceiver" >
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED" />
            <action android:name="android.intent.action.QUICKBOOT_POWERON"/>
        </intent-filter>
    </receiver> 


当我在一些设备上遇到类似的问题时,它帮助了我。

嗯,我找到了答案

我不知道你必须在谷歌上搜索版本。

你应该调查一下 据我所知,无论手机是否处于睡眠状态,它都会在指定时间执行

您回答了他们自己的问题,但因为该答案使用了WorkManager API,该API“用于可延迟的工作,即不需要立即运行,并且即使应用程序退出或设备重新启动,也需要可靠运行”()我觉得使用AlarmManager是处理您似乎要做的事情的最佳方式

但是,需要注意的是,这仍然需要在每次启动时重新注册警报,鉴于OP的问题和担忧,这似乎很困难,但我已经在下面介绍了这些问题。不过,如果你在警报触发后启动,你应该小心你该怎么做。例如,假设您正在制作一个提醒应用程序,希望能够在提醒被触发前关闭手机,并在提醒被触发后5分钟开机。你还在触发通知吗?您是否与AlarmManager重新安排?你只是把这一切都忽略了吗?如果您确实触发了它,您希望它在用户解锁设备之前触发还是在用户解锁设备之后触发

上面的问题会改变具体的实现,但是基本原理是一样的

  • 向系统注册意向接收器
    和。ScheduledServiceDemoActivity是通过在Android Studio中运行或按下启动器上的图标启动应用程序时打开的,但BroadcastReceiver也是应用程序的另一个入口点。在这种情况下,当Android发送一个意图并完成动作“启动”时,会触发该事件。ScheduledServiceDemoActivity将永远不会在引导时启动。捆绑的AVD可以正确地模拟启动场景,它将触发PollReceiver

    编辑(我有另一个想法)在我的三星手机上,我检查了权限,虽然我在清单中添加了这4行,但只有三行权限

    <!-- So we can make a phone call out -->
    <uses-permission android:name="android.permission.CALL_PHONE" />
    <!-- so we can send a text -->
    <uses-permission android:name="android.permission.SEND_SMS" />
    <!-- So we can reschedule alarms that went off while powered off -->
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
    <!-- read contacts so they can easily choose their friends -->
    <uses-permission android:name="android.permission.READ_CONTACTS" />
    
    
    
    接收引导不在那里。这就是问题所在吗?或者手机没有向用户列出接收引导已完成,因为这可能会让人困惑

    M
    <receiver android:name=".biz.alarm.BootupReceiver" >
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
                <action android:name="android.intent.action.QUICKBOOT_POWERON"/>
            </intent-filter>
        </receiver>