3

アクティビティがバックグラウンドにあるとき、またはアクティビティがまったくないときに、Android から Dart コードを呼び出そうとしています。たとえば、alarmmanager がトリガーされたとき。

これは私のダーツコードです:

void main() async {
  WidgetsFlutterBinding.ensureInitialized();

  runApp(MyApp());

  const MethodChannel _kChannel =
      MethodChannel('mychannel');
  _kChannel.setMethodCallHandler((call) {
    if (call.method == 'method1') {
      return ...;
    }
    if (call.method == 'method2') {
      return ...;
    }
    return Future.value();
  });
}

Java から:

Application.channel.invokeMethod(method, arguments, new MethodChannel.Result() {...});

channel私のメインアクティビティから初期化される静的変数です。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    GeneratedPluginRegistrant.registerWith(this);

    Application.channel = new MethodChannel(getFlutterView(), CHANNEL_ID);
}

これは、アクティビティがフォアグラウンドにあるときに機能します。しかし、バックグラウンドにあるときは、次の通知を受け取ります。FlutterView.send called on a detached view, channel=mychannel

呼び出しは実行されません。バックグラウンドで Android から Dart を呼び出すにはどうすればよいですか?

編集

私のユースケースは純粋に Android のユースケースです。これは基本的に次の流れです。

  1. alarmmanager が起動し、ブロードキャスト イベントが受信されます。Dit はライブラリなしでネイティブに実行されます。これは主に、アプリがアクティブでないときに発生します。
  2. ブロードキャストレシーバーで、Firebase からいくつかのデータを読み取り、通知を設定します。
  3. Firebase からのデータに基づいて新しいアラームをスケジュールします。

flutter/dart 内では、Firebase からデータを取得するためのビジネス ロジックを既に取得しています。明らかに、私はそのすべてを再び書きたくありませんが、今は Java で書きます。

私は、alarmmanager プラグインとローカル通知プラグインを使用したくありません。どちらも異なる分離で実行され、問題が発生するためです。

4

2 に答える 2