【问题标题】:Broadcast receiver vs activity with alarmmanager广播接收器与警报管理器的活动
【发布时间】:2014-08-08 21:21:13
【问题描述】:
我正在使用带有 AlarmManager 的广播接收器,但有时需要很长时间才能唤醒,这会导致应用功能出现问题
PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "");
wl.acquire();
and releases after launching activity
我正在考虑改变它。
你能说出什么是最好的方法吗?
使用广播接收器执行一些计算,然后启动活动(到目前为止,在我的情况下唤醒锁定问题)。
直接启动 Activity,并在设置内容视图之前计算天气以继续此 Activity 或终止
【问题讨论】:
标签:
android
android-activity
broadcastreceiver
alarmmanager
wakelock
【解决方案1】:
我正在使用带有 AlarmManager 的广播接收器,但有时需要很长时间才能唤醒,这会导致应用功能出现问题
我不知道任何其他类型的组件会以某种方式比BroadcastReceiver 更快地启动。当然,我希望 Activity 的启动速度比 BroadcastReceiver 慢。
并在启动活动后发布
WakeLock 对您没有好处,因为在您的onReceive() 调用期间已经有一个WakeLock(假设这是一个清单注册的BroadcastReceiver)。
此WakeLock 有用的唯一方法是,如果您从活动的onCreate() 中释放它,以尝试使设备保持足够长的时间以使活动启动。
你能说出什么是最好的方法吗?
这取决于“计算”是什么。 onReceive() 在主应用程序线程上调用。与在主应用程序线程上调用的所有方法一样,您希望onReceive() 在几毫秒内返回。如果您的“计算”肯定只需要几毫秒,请坚持使用BroadcastReceiver。如果“计算”需要更长的时间,您需要考虑将这项工作委托给IntentService,并让IntentService 在需要时启动活动。
关于“很多秒”,请记住,您的 AlarmManager 事件可能不准确,这取决于您设置它们的方法、您的 targetSdkVersion 是什么以及您的 Android 版本正在运行。