我需要应用程序在网络状态发生变化时唤醒,即使不在后台运行也是如此。
在 Android N 之前,我在 Manifest 中注册了一个网络状态更改
<receiver android:name=".receiver.NetworkStateChangeReceiver">
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
</intent-filter>
</receiver>
这在 Android N 上已被弃用。我知道它仍然可以不在 Manifest 中注册它,而是以编程方式注册它,但只要应用程序在后台运行,它就可以工作。-> 但我需要一个在应用程序完全关闭时也能工作的解决方案。
我现在尝试的是有一个服务扩展GcmTaskService
它看起来像这样:
public class NetworkChangeService extends GcmTaskService {
public static String TAG = "networkChangeTask";
private static long ONE_DAY_IN_SECONDS = 3600L * 24L;
@Override
public int onRunTask(TaskParams taskParams) {
// do my task here like syncing stuff
scheduleTask(this);
return GcmNetworkManager.RESULT_SUCCESS;
}
public static void scheduleTask(Context context) {
OneoffTask task = new OneoffTask.Builder()
.setService(NetworkChangeService.class)
.setTag(TAG)
.setExecutionWindow(1L, ONE_DAY_IN_SECONDS)
.setRequiredNetwork(Task.NETWORK_STATE_CONNECTED)
.setPersisted(true)
.setUpdateCurrent(true)
.build();
GcmNetworkManager.getInstance(context).schedule(task);
}
@Override
public void onInitializeTasks() {
super.onInitializeTasks();
// Re-schedule periodic task on app upgrade.
scheduleTask(this);
}
}
基本思想是安排一个在网络变化时触发的任务,如果它确实在未来网络状态再次变化时重新安排该任务。
乍一看,这似乎有效,onRunTask(TaskParams taskParams)
每次在我调试时网络发生变化时都会调用它。但是当我把我的安卓手机锁在我的桌子上一小时(并且它连接到无线网络)并且没有移动或任何东西时,该任务在一小时内被调用了大约 40 次!
谁能向我解释为什么这个任务经常被调用?网络状态真的会在一小时内经常发生变化,还是我用OneoffTask
错了?
附加问题:我通常希望每次设备从未连接状态切换到已连接状态时执行一项任务,我没有被迫使用 GcmNetworkManager。有没有更好的方法在 android 上实现这一点(不使用推送或任何外部服务)?