4

我正在开发一个应用程序,当设备连接到互联网时,它将在后台按顺序将我的所有数据库记录上传到服务器。

为此,我编写了一个BroadcastReceiver监听网络连接的程序。当这个接收器被触发时,我正在启动后台服务来上传记录。

这是我的代码。

public class NetworkChangeReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(final Context context, final Intent intent) {
       AppUtils.checkInternetConnection(context));
        //If the device has the internet connection and if there are any pending records to upload to server then start the service for uploading the records.
        if (AppUtils.checkInternetConnection(context)) {
            if (Database.getInstance().getTotalRecordsCount() > 0) {
                context.startService(new Intent(context, SurveyUploadService.class));
            }
        } else {
            context.stopService(new Intent(context, SurveyUploadService.class));
        }
    }
}

现在我的疑问是

1. 我可以使用JobScheduler做同样的事情吗?
2. 什么是更好的(我的或使用 JobScheduler 的)方法,为什么?

4

1 回答 1

5

我不知道您对 BroadcastReceiver 使用的是哪个动作,但我猜它是CONNECTIVITY_CHANGE动作。如果您使用它,请从侧面阅读以下有关Android 7.0 行为更改的文本:

为了缓解这些问题,Android 7.0 应用了以下优化:

  • 面向 Android 7.0 的应用不会收到 CONNECTIVITY_ACTION 广播,即使它们有清单条目来请求这些事件的通知。如果正在运行的应用程序通过 BroadcastReceiver 请求通知,它们仍然可以在其主线程上侦听 CONNECTIVITY_CHANGE。

  • 应用无法发送或接收 ACTION_NEW_PICTURE 或 ACTION_NEW_VIDEO 广播。此优化会影响所有应用,而不仅仅是针对 Android 7.0 的应用。

如果您的应用使用这些意图中的任何一个,您应该尽快移除对它们的依赖,以便您可以正确定位 Android 7.0 设备。Android 框架提供了多种解决方案来减少对这些隐式广播的需求。例如,JobScheduler API 提供了一种强大的机制来在满足指定条件(例如连接到未计量的网络)时调度网络操作。您甚至可以使用 JobScheduler 对内容提供者的更改做出反应。

所以最好使用 JobScheduler API。

这是JobScheduler 的示例

于 2016-10-13T14:13:37.710 回答