Flutter App 在另一个应用程序中打开(重复应用程序)
Flutter App opens in another application(duplicate application)
我在 flutter 应用程序中使用 app links 和 uni_links 库。
有个问题
每当我在另一个应用程序(如 Google 日历)中单击我的应用程序 link 时,OS 会再次打开我的应用程序。
不知怎的,我有一个副本。
这是我的屏幕截图,说明究竟发生了什么:
我只想打开我最后一个存在于后台的应用程序。
我应该怎么做才能解决这个问题?
嗯根据this answer,
我应该将 manifest.xml
中的 MainActivity
的 android:launchMode="singleTop"
更改为 android:launchMode="singleTask"
。
如果您使用 uni_links,对于 android:launchMode="singleTask"
,您必须使用 _handleIncomingLinks
来接收新的 intent
StreamSubscription? _sub;
void _handleIncomingLinks() {
if (!kIsWeb) {
// It will handle app links while the app is already started - be it in
// the foreground or in the background.
_sub = uriLinkStream.listen((Uri? uri) {
if (!mounted) return;
print('got uri: $uri');
}, onError: (Object err) {
if (!mounted) return;
print('got err: $err');
});
}
}
如果使用 android:launchMode="singleTop"
,您必须使用 _handleInitialUri
来接收新的 intent
bool _initialUriIsHandled = false;
Future<void> _handleInitialUri() async {
if (!_initialUriIsHandled) {
_initialUriIsHandled = true;
try {
if (!mounted) return;
final uri = await getInitialUri();
if (uri != null) {
//todo
}
} on PlatformException {
// Platform messages may fail but we ignore the exception
print('falied to get initial uri');
} on FormatException catch (err) {
if (!mounted) return;
print('malformed initial uri');
}
}
}
有关方法的更多详细信息,请查看 this sample
我在 flutter 应用程序中使用 app links 和 uni_links 库。
有个问题 每当我在另一个应用程序(如 Google 日历)中单击我的应用程序 link 时,OS 会再次打开我的应用程序。
不知怎的,我有一个副本。 这是我的屏幕截图,说明究竟发生了什么:
我只想打开我最后一个存在于后台的应用程序。
我应该怎么做才能解决这个问题?
嗯根据this answer,
我应该将 manifest.xml
中的 MainActivity
的 android:launchMode="singleTop"
更改为 android:launchMode="singleTask"
。
如果您使用 uni_links,对于 android:launchMode="singleTask"
,您必须使用 _handleIncomingLinks
来接收新的 intent
StreamSubscription? _sub;
void _handleIncomingLinks() {
if (!kIsWeb) {
// It will handle app links while the app is already started - be it in
// the foreground or in the background.
_sub = uriLinkStream.listen((Uri? uri) {
if (!mounted) return;
print('got uri: $uri');
}, onError: (Object err) {
if (!mounted) return;
print('got err: $err');
});
}
}
如果使用 android:launchMode="singleTop"
,您必须使用 _handleInitialUri
来接收新的 intent
bool _initialUriIsHandled = false;
Future<void> _handleInitialUri() async {
if (!_initialUriIsHandled) {
_initialUriIsHandled = true;
try {
if (!mounted) return;
final uri = await getInitialUri();
if (uri != null) {
//todo
}
} on PlatformException {
// Platform messages may fail but we ignore the exception
print('falied to get initial uri');
} on FormatException catch (err) {
if (!mounted) return;
print('malformed initial uri');
}
}
}
有关方法的更多详细信息,请查看 this sample