Flutter android_alarm_manager插件不会定期运行

时间:2019-05-06 20:31:32

标签: android flutter

我正在尝试在Flutter中创建后台计时器,该计时器每n秒调用一次。调用AndroidAlarmManager.periodic应该每2秒运行一次printHello函数,但是看起来它是以更大的间隔随机调用的。我在做什么错了?


        <main class="py-4">
            @yield('content')

        </main>
    </div>

</body>

 <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.0/jquery.min.js"></script> 
            <script src="{{ asset('js/app.js') }}" ></script>
    <script type="text/babel" src="{{ asset('js/login.js') }}" ></script>

2 个答案:

答案 0 :(得分:0)

您无法通过AlarmManager频繁安排警报:

  

注意:从API 19(Build.VERSION_CODES.KITKAT)开始,警报传递是不准确的:操作系统将转移警报,以最大程度地减少唤醒和电池消耗。有一些新的API支持需要严格交付保证的应用程序。请参见setWindow(int,long,long,android.app.PendingIntent)和setExact(int,long,android.app.PendingIntent)。 targetSdkVersion早于API 19的应用程序将继续看到以前的行为,在该行为中,所有警报均在请求时准确地传递。

请参阅:https://developer.android.com/reference/android/app/AlarmManager

答案 1 :(得分:0)

@kashlo,在main()中添加以下代码

void funTimerMain() async  {

  // A few things that you can do with funTimerMain:

  // No 1. Do something you want, e.g.
  intCounter += 1;  // intCounter is a GLOBAL VARIABLE (Integer), which was initialized to 0
  print('intCounter: ' + intCounter.toString());

  // No 2. Use the following lines only if you use Redux to manage state
  // strCurPage is a GLOBAL VARIABLE (String) that stores which 'page' the user is currently navigating
  if (strCurPage == 'PageHome') {
    // storeHome is the Redux 'STORE' that keep track of the state of Page Home
    // The following line 'Refresh/Re-render' page Home (like a 'setState' in Page Home)
    // i.e. you can 'setState' page Home in an external event, like in this timer function
    storeHome.dispatch(Actions.Increment);
  }

  // No 3. Send a message to server every 5 seconds (Instead of 1 second!), using socket.io
  // timLastHeartBeat is a Global Variable (Integer) that was initialized to DateTime.now().millisecondsSinceEpoch;
  if (DateTime.now().millisecondsSinceEpoch - timLastHeartBeat > 5000) {
    socket.emit('HeartBeat', [intCounter]);
    timLastHeartBeat = DateTime.now().millisecondsSinceEpoch;
  }


  // recall this timer every 1 second
  new Future.delayed(new Duration(milliseconds: 1000), () async { 
    funTimerMain(); 
  }); 
}


// runApp!
runApp(MyApp());


// call the timer for the first time
funTimerMain();

问题1:何时不行。 1、2、3在funTimerMain中运行吗?回答1:当该应用位于前台(即用户使用该应用)或当该应用位于后台时(即用户按下主屏幕按钮或切换到另一个应用)。

问题2:何时不行。 1、2停下来跑?回答2:当该应用被用户或Android系统杀死(例如被节电程序杀死)

问题3:何时不行。 3停下来跑?回答3:与回答2相同,此外,当用户关闭屏幕时。从Android开始? (我忘记了确切的版本),当用户关闭屏幕时,不允许网络访问。

如您所见,funTimerMain每1秒(或x秒)运行一次,但是funTimerMain内部的每个任务可以每y秒运行一次。 (其中y> = x,或者最好是y = Nx,N是整数)

当我第一次使用这项技术时,我以为效率会很糟糕,但是当我在真实的手机中运行该应用程序时,我不会注意到手机的任何延迟。因此,我认为通过设置适当的x和y值,您可以拥有一个响应式应用程序。

您也可以在funTimerMain中使用“ await”,但是请记住,如果“ await之后的功能”没有返回,则计时器将暂停!