Я провел целые выходные, экспериментируя с android_alarm_manager плагином во флаттере, и, наконец, он заработал после настройки firebase, , но не совсем .
Проблема 1 : AndroidAlarmManager.periodic
вызывается приблизительно 1 minute
независимо от установленной мной продолжительности ((5 secs
/ 15 secs
/ 30 Secs
).
Проблема 2 : В любом случае он используется для запуска каждую минуту в foreground
(даже если устройство locked
), но не работает, когда в background
(при нажатии home
).Хотя и работал пару минут при нажатии кнопки back
.
Фоновый запуск - это то, что ожидалось от этого плагина.Но я понятия не имею, почему он так странно себя ведет.Любая помощь будет оценена.Пожалуйста, дайте мне знать, если кто-то из вас сталкивался с той же проблемой, или я один.
Последовательность шагов :
- pubspec.yaml -
android_alarm_manager
, firebase_auth
, google_sign_in
. - Добавление
google-services.json
и com.google.gms.google-services
в оба build.gradle
файла. - Добавление тега
service
вфайл манифеста. - Создание класса
Application.java
в src и добавление того же (.Appplication
) в файл манифеста. - main.dart из пример файл
- ссылка
main.dart -
import 'dart:async';
import 'dart:isolate';
import 'package:android_alarm_manager/android_alarm_manager.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/widgets.dart';
final FirebaseAuth firebaseAuth = FirebaseAuth.instance;
FirebaseUser firebaseUser;
Future<void> ensureFirebaseUser() async {
if (firebaseUser == null) {
firebaseUser = await firebaseAuth.currentUser();
if (firebaseUser == null) {
firebaseUser = await firebaseAuth.signInAnonymously();
}
}
}
class HelloMessage {
HelloMessage(this._now, this._msg, this._isolate, this._user, this._token);
final DateTime _now;
final String _msg;
final int _isolate;
final FirebaseUser _user;
final String _token;
@override
String toString() {
return "[$_now] $_msg "
"isolate=$_isolate "
"user='$_user' "
"token=$_token";
}
}
void printHelloMessage(String msg) {
ensureFirebaseUser().then((_) {
firebaseUser.getIdToken().then((String idToken) {
print(HelloMessage(
DateTime.now(),
msg,
Isolate.current.hashCode,
firebaseUser,
idToken,
));
});
});
}
void printHello() {
printHelloMessage("Hello, world!");
}
void printGoodbye() {
printHelloMessage("Goodbye, world!");
}
bool oneShotFired = false;
void printOneShot() {
printHelloMessage("Hello, once!");
}
Future<void> main() async {
final int helloAlarmID = 0;
final int goodbyeAlarmID = 1;
final int oneShotID = 2;
// Start the AlarmManager service.
await AndroidAlarmManager.initialize();
printHelloMessage("Hello, main()!");
runApp(const Center(
child: Text('Hello, world!', textDirection: TextDirection.ltr)));
await AndroidAlarmManager.periodic(
const Duration(seconds: 5), helloAlarmID, printHello,
wakeup: true);
await AndroidAlarmManager.oneShot(
const Duration(seconds: 5), goodbyeAlarmID, printGoodbye);
if (!oneShotFired) {
await AndroidAlarmManager.oneShot(
const Duration(seconds: 5), oneShotID, printOneShot);
}
}
Консоль O / P -
I/flutter ( 4893): [2018-11-26 01:27:56.093322] Hello, world! isolate=289040868 user='FirebaseUser({uid: .......
I/flutter ( 4893): [2018-11-26 01:27:56.120643] Goodbye, world! isolate=289040868 user='FirebaseUser({uid: .....
I/flutter ( 4893): [2018-11-26 01:27:56.123499] Hello, once! isolate=289040868 user='FirebaseUser({uid: ......
I/flutter ( 4893): [2018-11-26 01:28:57.860115] Hello, world! isolate=289040868 user='FirebaseUser({uid: ......
I/flutter ( 4893): [2018-11-26 01:30:00.037481] Hello, world! isolate=289040868 user='FirebaseUser({uid: .....
I/flutter ( 4893): [2018-11-26 01:31:08.422318] Hello, world! isolate=289040868 user='FirebaseUser({uid: .....
I/flutter ( 4893): [2018-11-26 01:32:08.545903] Hello, world! isolate=289040868 user='FirebaseUser({uid: .....
Хотя я до сих пор не понимаю, почему firebase
используется с этим плагином, похоже, что я все сделал правильно, кстати.Спасибо.