android - 服务需要互联网连接

android - Service need internet connection

所以,我有一项服务应该通过 MQTT 将数据发送到我的服务器。这个发送数据的过程应该每 10 分钟发生一次,并且无论我的应用程序处于什么状态都必须完成 (Paused/Stopped/Destroyed)。因此,这里的结论是,即使 phone 处于空闲状态,我的服务也需要互联网连接才能正常运行。

我采用的方法是:使用 AlarmManagerWakefulBroadcastReceiver 到 运行 Service,如第一段所述。

步骤可以描述如下:

  1. 尝试连接到 MQTT 代理
  2. 连接成功后,做一些逻辑并向服务器发布消息
  3. 消息发布成功后,断开与代理的连接并清理资源

上面的子程序应该每10分钟执行一次。

现在的问题是,在空闲状态 3-4 分钟后,我的服务无法连接到 MQTT 代理,因为似乎没有互联网连接。 我通过以下方式检查了互联网连接:

ConnectivityManager connectivityManager 
      = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
Log.wtf(TAG, "internet: " + (activeNetworkInfo != null && activeNetworkInfo.isConnected());

如何为我的服务获取 Internet 访问权限?我唯一没有尝试过的是使用 evernote/android-job。但在此之前,我想获得一些信息,因为我怀疑我能解决这个问题的唯一方法是每次我的服务 运行 以某种方式获取互联网访问权限。

我浏览了很多关于这个主题的内容,但我所遇到的只是与 'How to check internet connection in background service' 有关的答案不是我需要的。我需要的是'每次我的服务运行s空闲时phone如何获取互联网连接? '

如果您需要代码片段或我在上面未能包含的其他信息,请询问我。提前致谢。

在下面的 23 API 中测试您的应用程序。因为超过 23,您的应用程序可能无法访问 Internet 数据,因为 **

"DOZE MODE"

**

因此,要克服该问题,用户必须允许您的应用在后台 运行。

发生这种情况是因为电池优化。所以请在 23 以下测试它,让我知道它是否有效。

每次我的服务运行时phone空闲时如何获取互联网连接?

您无法在 android 4.4 以上以编程方式打开/关闭移动数据。出于安全原因,它已被停止,相反,您可以使用对话框询问用户启用移动数据,然后他是否启用你可以完成你的任务。

因此,每次启动服务时,请要求用户启用移动数据。

但是您可以通过编程方式连接到 WiFi:

WifiManager wifiManager = (WifiManager)this.context.getSystemService(Context.WIFI_SERVICE);
wifiManager.setWifiEnabled(status);

并根据需要将 status 设置为 truefalse

你不能强迫phone上线,你是用户心血来潮。您最多只能检查 Internet 连接,但如果连接已关闭,您将无法打开它。

您最好的方法是使用 JobScheduler 或 Google GCM 网络管理器,请参阅:JobScheduler, GCM Network Manager

有了这些,您可以安排您的作业仅在网络可用时定期触发。如果您确实需要 10 分钟的时段和网络,您将必须通知用户以确保网络始终处于开启状态,但您仍然需要考虑网络是否关闭。

Android syncadapter 机制提供了一种有效的传输方式 data.You 可以在 sync adapter 阅读更多内容并且 Transfering data using sync adapter

使用 Sync Adapter。它将适时在后台同步您的数据,以防止不必要的电池消耗和服务费用。