我需要在网络状态发生变化时唤醒应用程序,即使不在后台运行也是如此。
在Android N之前,我在Manifest中注册了网络状态更改
<receiver android:name=".receiver.NetworkStateChangeReceiver">
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
</intent-filter>
</receiver>
对于Android N,这是不推荐的。我知道仍然可以在Manifest中注册,但是以编程方式注册,但只要应用程序在后台运行,它就可以正常工作。 - &GT;但我需要一个在应用程序完全关闭时也能正常工作的解决方案。
我现在尝试的是使用服务扩展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)
。但是当我将我的安卓手机锁定在我的桌面上一小时(它连接到wifi)并且没有移动或任何任务在一小时内被调用约40次!
任何人都可以向我解释为什么经常调用此任务?网络状态是否经常在一小时内改变,或者我使用OneoffTask
错误?
附加问题:我通常希望每次设备从未连接状态切换到连接状态时执行任务,我不会被迫使用GcmNetworkManager。有没有更好的方法在Android上实现这一点(不使用推送或任何外部服务)?