我有一个活动来演示有关服务器的信息ping结果。每秒完成此工作,并运行如下代码:
pingRunnable = new Runnable() {
@Override
public void run() {
pingMethod();
resultsNotification();
handler.postDelayed(this, 1000);
}
};
另一方面,我必须在通知中实时显示一些结果,并且做到了,但是有一个问题,首先是设备在10分钟内锁定,应用和活动被OS破坏后,通知停止处于停滞状态。然后我尝试使用以下代码对其进行修复:
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "My Tag");
wl.acquire();
wl.release();
实际上,我使用wl.release();像这样:
@Override
protected void onDestroy() {
wl.release();
super.onDestroy();
}
当我这样做时会变得更好,但是当设备锁定时,这又在几个小时后再次发生。 现在,我不知道如何确切地控制这些服务(background(Runnable)和foreground(Notification)),以便长时间保持活动状态,例如两三天甚至更长时间。
答案 0 :(得分:0)
首先,您不应该使用活动来进行此类工作,建议您使用服务。要智能地完成此类工作,您可以在Android框架中使用多种选择,最近使用的是新的WorkManager组件。这些服务应使您能够控制安排背景工作的时间,例如仅在存在有效的网络连接时运行,并允许您选择工作应运行的时间段。
https://developer.android.com/topic/libraries/architecture/workmanager/advanced
第二,每秒进行一次轮询将对电池寿命产生巨大影响-如果这样做,您的应用很可能会被标记为不良公民,并且很可能会被卸载。
您应该考虑一般而言轮询对于您的用户是否是最佳选择。使用云消息传递可以提高您的应用程序需要完成的工作量,即,您可以在服务器数据更改时仅发出通知,从而避免了手动轮询的麻烦。 https://firebase.google.com/docs/cloud-messaging/