GcmNetworkManager OneoffTask经常调用,问题检测Android N上的网络状态更改

时间:2017-05-29 10:30:37

标签: android gcm-network-manager gcmtaskservice

我需要在网络状态发生变化时唤醒应用程序,即使不在后台运行也是如此。

在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上实现这一点(不使用推送或任何外部服务)?

0 个答案:

没有答案