【问题标题】:Android AlarmManager details?Android AlarmManager 详细信息?
【发布时间】:2011-07-30 18:49:29
【问题描述】:

我正在开发我的第一个 Android 应用程序,但在使用 AlarmManager 时遇到了问题。我的应用程序安排了一个警报来检查一些 URL 的数据。好吧,有时当警报运行时,我在 logcat 中收到“ANR”错误(我假设这代表应用程序没有响应,通过我手机上的对话框)。在以下日志条目之后,该错误显示了手机上运行的每个进程以及一些统计信息:

07-30 14:11:07.442: WARN/ActivityManager(2735): Timeout of broadcast BroadcastRecord{48d749d8 null} - receiver=android.os.BinderProxy@49088bc0
07-30 14:11:07.442: WARN/ActivityManager(2735): Receiver during timeout: ResolveInfo{48d74950 com.shaddow.courseChecker.CourseAlarm p=0 o=0 m=0x0}
07-30 14:11:07.477: INFO/Process(2735): Sending signal. PID: 25006 SIG: 3
07-30 14:11:07.477: INFO/dalvikvm(25006): threadid=3: reacting to signal 3
07-30 14:11:07.567: INFO/dalvikvm(25006): Wrote stack traces to '/data/anr/traces.txt'

接着是一堆更多的 SIG 3 到每个进程的样子,然后:

07-30 14:11:08.118: ERROR/ActivityManager(2735): ANR in com.shaddow.courseChecker
07-30 14:11:08.118: ERROR/ActivityManager(2735): Reason: Broadcast of Intent { flg=0x4 cmp=com.shaddow.courseChecker/.CourseAlarm (has extras) }
07-30 14:11:08.118: ERROR/ActivityManager(2735): Load: 0.65 / 2.76 / 2.49
07-30 14:11:08.118: ERROR/ActivityManager(2735): CPU usage from 420741ms to 26ms ago:

我认为这是由于代码在下载 html 页面时卡住了太久?在这一切发生之后,我的 onReceive() 执行良好。

至于修复它...我是否必须在 onReceive() 的单独线程中运行我的代码才能不向用户发送 ANR?如果我这样做,它会允许手机在执行完成之前进入睡眠状态吗?或者,我应该使用部分唤醒锁启动服务吗?

【问题讨论】:

    标签: android broadcastreceiver alarmmanager


    【解决方案1】:

    我是否必须在 onReceive() 的单独线程中运行我的代码才能不向用户发送 ANR?

    是的。更准确地说:

    • 写一个IntentService,你在onHandleIntent()做下载工作
    • 让您的AlarmManager 警报通过getService() PendingIntent 启动该服务

    如果您打算在设备处于睡眠状态的情况下完成这项工作,使用_WAKEUP 警报,您将需要考虑使用我的WakefulIntentService 并遵循在执行此工作时保持设备唤醒所需的模式 - - 该网站上的demo/ 项目说明了这一点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-07-23
      • 2013-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多