【问题标题】:iOS BackgroundFetch equivalent in AndroidAndroid 中的 iOS Background Fetch 等价物
【发布时间】:2015-11-10 03:56:18
【问题描述】:

我想知道是否有适用于 iOS 的 Android 对应 BackgroundFetch 功能。

我希望使用 Cordova 的 Android 应用每 15 分钟左右唤醒一次,检查更新并执行一些其他杂项任务。

在 iOS 中,我可以通过使用 cordova-background-fetch 插件来做到这一点。

由于该插件没有安卓版本,我很乐意自己编写;但我首先想知道如何在 Android 中实现这样的功能。有什么建议吗?

【问题讨论】:

    标签: android ios cordova


    【解决方案1】:

    在 Android 中,您可以将 AlarmManger 设置为每 X 毫秒唤醒一次并运行 PendingIntent

    这段代码看起来像这样。

    AlarmManager mgr=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
    Intent i=new Intent(context, OnAlarmReceiver.class);
    PendingIntent pi=PendingIntent.getBroadcast(context, 0, i, 0);
    
    mgr.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,
                        SystemClock.elapsedRealtime()+60000,
                        PERIOD,
                        pi);
    

    Android 在后台运行的默认IntentService 有一些限制。

    您还可以查看外部库WakefulIntentService (https://github.com/commonsguy/cwac-wakeful)。我用它和AlarmManager 一起运行后台任务。

    更新

    OnAlarmReceiver 类

    public class OnAlarmReceiver extends BroadcastReceiver {
    
        public static String TAG = "OnAlarmReceiver";
    
        @Override
        public void onReceive(Context context, Intent intent) {
            Log.d(TAG, "Waking up alarm");
            WakefulIntentService.sendWakefulWork(context, YourService.class); // do work in the service class
        }
    
    }
    

    你的服务类

    public class YourService extends WakefulIntentService {
    
          public static String TAG = "YourService";
    
          public YourService() {
              super("YourService");
          }
    
          @Override
          protected void doWakefulWork(Intent intent) {
              Log.d(TAG, "Waking up service");
    
            // do your background task here
          }
    }
    

    【讨论】:

    • 这似乎是一个很好的起点。我通过扩展BroadcastReceiver 实现了OnAlarmReceiver 类。我是否需要在某处致电registerReceiver 来收听第三行广播的意图?在WakefulIntentService 的代码库中找不到registerReceiver,我很困惑。
    • @MikeC 我用完整的例子更新了答案。您还必须在 Manifest 文件中定义您的服务和接收器以使其工作。
    • 我最终没有使用WakefulIntentService,但感谢您为我指明了正确的方向。
    • 顺便说一句,当应用程序终止时,如何清除AlarmManager #setRepeating 设置的意图?如果答案很复杂,我很乐意发布一个单独的问题。
    【解决方案2】:

    您可以使用AlarmManager。除此之外,您还可以使用AccountManager

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-13
      • 1970-01-01
      • 2018-05-18
      • 2017-07-16
      • 1970-01-01
      • 2011-04-26
      • 2012-08-30
      • 2014-09-30
      相关资源
      最近更新 更多