使用JobScheduler替代BroadcastReceiver和Service

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 的)?为什么?


你尝试过实现Job Service吗? - Yvonne Marggraf
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 示例

CONNECTIVITY_CHANGE和CONNECTIVITY_ACTION有什么区别? - Kartheek
1
如果你在这里看 https://developer.android.com/reference/android/net/ConnectivityManager.html#CONNECTIVITY_ACTION,你会发现 CONNECTIVITY_ACTION 是一个常量的名称,其值为 "android.net.conn.CONNECTIVITY_CHANGE"。 - Chris
太好了,谢谢。 - Kartheek
这是否意味着从目标版本N开始,无法在后台检查CONNECTIVITY_CHANGE? - Rafael Ruiz Muñoz
如果您使用隐式广播接收器,即作为清单的一部分,则建议使用作业调度程序。 - siva

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接