hiko1129's note

Flutter × AndroidでIntentの受信を画面遷移(Activity表示)無しで受け取る方法

2019/10/22

はじめに

Androidで画面遷移無し(Activityを表示しない)でIntentを受け取る方法は、AndroidでIntent受信時に画面遷移せず(Activityを表示せず)にToastを表示する方法に書いてある通り、Activityを透明にして通常のIntentの受信を行えば良いです。

Flutterで画面遷移無しで受け取ったIntentの内容を処理する

AndroidでIntent受信時に画面遷移せず(Activityを表示せず)にToastを表示する方法の処理に加えて

  • MainActivityのインスタンス変数に渡す
  • MethodChannelを用いてFlutter側から取得する
    を行うことで、Flutter側で値を利用できます。

MainActivityのインスタンス変数に値を設定するようにして、MethodChannel経由でアクセスできるようにする。

  • onCreate, onResumeでインスタンス変数に値を設定するようにする。
  • MethodChannelをonCreateで設定する

    class MainActivity: FlutterActivity() {
    private var sharedUrls: List<String>? = null // この値にsharedPreferences経由で値をする
    
    override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    GeneratedPluginRegistrant.registerWith(this)
    
    updateSharedUrls()
    
    MethodChannel(flutterView, "app.channel.shared.data").setMethodCallHandler { call, result ->
      if (call.method.contentEquals("getSharedUrls")) {
        result.success(sharedUrls)
      }
    }
    }
    
    override fun onResume() {
    super.onResume()
    
    updateSharedUrls()
    }
    
    private fun updateSharedUrls() {
    val prefs = getSharedPreferences("Article", Context.MODE_PRIVATE)
    val urls = prefs.getStringSet("urls", hashSetOf<String>())
    sharedUrls = urls.toList() // Intentを受信した側で一時的に保存しておいたものをインスタンス変数に格納する
    }
    }

MethodChannel経由でIntentで受け取った値を取得する

const platform = MethodChannel('app.channel.shared.data');
var urls = await platform.invokeMethod('getSharedUrls');

* MethodChannel自体についての説明についてはこちら

参考


hiko1129

hiko1129
Twitter GitHub Qiita Qrunch Blog