【问题标题】:Is there any way to call onPerformSync() when there is no internet connection on device当设备上没有互联网连接时,有什么方法可以调用 onPerformSync()
【发布时间】:2018-12-17 16:42:29
【问题描述】:

这似乎是一个奇怪的问题,但当设备上没有互联网连接时,我仍然想调用 onPerformSync()定期同步。我在这里进行了一些讨论,发现设备处于离线模式时不会调用 onPerformSync。但是,在没有互联网连接时是否有任何方法或解决方法来调用 onPerformSync

【问题讨论】:

  • 如果您没有连接到互联网,您希望如何从互联网获取数据?
  • 不,我不需要在没有互联网的情况下与服务器同步数据,实际上我正在做一些其他的周期性基本操作并从 onPerformSync 调用它们......有没有方式?
  • 使用 Threads 或 AlarmManager 以其他方式实现它。
  • 不,你不能这样做,使用AlarmManager进行周期性操作
  • 但是在一些自定义的安卓手机中,比如 MIUI,当你从最近清除应用程序时,应用程序不再存在于内存中,所以你的警报管理器或 gcm 之类的东西在那里不起作用。

标签: android android-syncadapter


【解决方案1】:

syncadapter without internet connection复制我的答案

如果不修改 AOSP 或更改 rAm 回答的设计,则无法实现此目的。

我的回答是针对那些愿意修改 AOSP 的人:

Google 执行如下:

作业是由 SyncManager.java 使用网络约束安排的

final int networkType = syncOperation.isNotAllowedOnMetered() ?
                JobInfo.NETWORK_TYPE_UNMETERED : JobInfo.NETWORK_TYPE_ANY;

        JobInfo.Builder b = new JobInfo.Builder(syncOperation.jobId,
                new ComponentName(mContext, SyncJobService.class))
                .setExtras(syncOperation.toJobInfoExtras())
                .setRequiredNetworkType(networkType)
                .setPersisted(true)
                .setPriority(priority);

但是 NETWORK_TYPE_ANY 映射到 JobStatus.java 中的 CONSTRAINT_CONNECTIVITY

switch (job.getNetworkType()) {
    case JobInfo.NETWORK_TYPE_NONE:
        // No constraint.
        break;
    case JobInfo.NETWORK_TYPE_ANY:
        requiredConstraints |= CONSTRAINT_CONNECTIVITY;
        break;

有两种解决方案:

1。 首先删除对互联网连接的检查,只检查常规连接

  diff --git a/services/core/java/com/android/server/job/controllers/ConnectivityController.java b/services/core/java/com/android/server/job/controllers/ConnectivityController.java
    index 4d5a920..6680c4e 100644
    --- a/services/core/java/com/android/server/job/controllers/ConnectivityController.java
    +++ b/services/core/java/com/android/server/job/controllers/ConnectivityController.java
    @@ -118,7 +118,8 @@ public final class ConnectivityController extends StateController implements
                     && !info.isRoaming();

             boolean changed = false;
    -        changed |= jobStatus.setConnectivityConstraintSatisfied(connectionUsable);
    +        //change to AOSP  : use connected instead of connectionUsable - since connection maybe considered usable within enterprise without NET_CAPABILITY_VALIDATED
    +        changed |= jobStatus.setConnectivityConstraintSatisfied(connected);
             changed |= jobStatus.setMeteredConstraintSatisfied(metered);
             changed |= jobStatus.setUnmeteredConstraintSatisfied(unmetered);
             changed |= jobStatus.setNotRoamingConstraintSatisfied(notRoaming);

2。 其次是您需要有条件地向 SyncManager.java 添加替代条件 我添加了充电条件,因为我使用的自定义设备始终在充电 - 这可以更改为任何其他条件 - 但需要一个额外的条件。

diff --git a/services/core/java/com/android/server/content/SyncManager.java b/services/core/java/com/android/server/content/SyncManager.java
index 205e828..81f9a8c 100644
--- a/services/core/java/com/android/server/content/SyncManager.java
+++ b/services/core/java/com/android/server/content/SyncManager.java
@@ -1539,6 +1539,13 @@ public class SyncManager {
                 .setRequiredNetworkType(networkType)
                 .setPersisted(true)
                 .setPriority(priority);
+                
+        if (syncOperation.owningPackage.contains("com.example.yourcompany")) {
+           //Change to AOSP : Custom accounts need to sync wihout access to public internet
+           Slog.i(TAG, "set JobInfo.NETWORK_TYPE_NONE for "+syncOperation.target.toString());
+           b.setRequiredNetworkType(JobInfo.NETWORK_TYPE_NONE);
+           b.setRequiresCharging(true);
+       }

         if (syncOperation.isPeriodic) {
             b.setPeriodic(syncOperation.periodMillis, syncOperation.flexMillis);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-21
    • 2017-09-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多