android - 如何在 Xamarin 表单中从另一个应用程序启动应用程序
问题描述
我正在尝试启动一个我从我现在正在开发的另一个应用程序中创建的应用程序。问题是我一直在互联网上搜索并找到了一些东西,但它没有用,所以我在这里寻求帮助。
这就是我在要启动的应用程序上所做的:
在我的 xaml.cs 上:
public async void GoToDigDitApp(object sender, EventArgs e)
{
var appname = "digdit://";
var result = await DependencyService.Get<IAppHandler>().LaunchApp(appname);
}
我创建了一个接口:
public interface IAppHandler
{
Task<bool> LaunchApp(string uri);
}
在安卓项目中:
[assembly: Dependency(typeof(OpenAppAndroid))]
namespace SupervisingApp.Droid
{
[Activity(Label = "OpenAppAndroid")]
public class OpenAppAndroid : Activity, IAppHandler
{
public Task<bool> LaunchApp(string uri)
{
bool result = false;
try
{
var aUri = Android.Net.Uri.Parse(uri.ToString());
var intent = new Intent(Intent.ActionView, aUri);
Android.App.Application.Context.StartActivity(intent);
result = true;
}
catch (ActivityNotFoundException)
{
result = false;
}
return Task.FromResult(result);
}
}
}
这是我要启动清单的应用程序:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="1.0" package="com.companyname.Tab2" android:installLocation="auto">
<uses-sdk android:minSdkVersion="21" android:targetSdkVersion="28" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.CAMERA" />
<application android:label="Dig Dit" android:icon="@drawable/ic_launcher">
<activity android:icon="@drawable/ic_launcher" android:label="Dig Dit" android:name="digdit.urlentryclass">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="digdit" />
</intent-filter>
</activity>
</application>
</manifest>
现在我只对 Android 部分感兴趣,它似乎不起作用。我希望你们能帮助我。
解决方案
你可以使用PackageManager.GetLaunchIntentForPackage
.
试试下面的代码。com.companyname.app2
是 App2 的包名。
Intent intent = PackageManager.GetLaunchIntentForPackage("com.companyname.app2");
StartActivity(intent);
更新:
创建接口:
public interface IDpendencyService
{
Task<bool> Launch(string stringUri);
}
安卓实现:
public class DependencyImplementation : Activity, IDpendencyService
{
public Task<bool> Launch(string stringUri)
{
Intent intent = Android.App.Application.Context.PackageManager.GetLaunchIntentForPackage(stringUri);
if (intent != null)
{
intent.AddFlags(ActivityFlags.NewTask);
Forms.Context.StartActivity(intent);
return Task.FromResult(true);
}
else
{
return Task.FromResult(true);
}
}
}
主页的用法:
<StackLayout>
<!-- Place new controls here -->
<Label
FontAttributes="Bold"
FontSize="Large"
HorizontalOptions="Center"
Text="Welcome to App1!"
VerticalOptions="CenterAndExpand" />
<Button x:Name="GotoApp2" Text="GotoApp2" Clicked="GotoApp2_Clicked"></Button>
</StackLayout>
private void GotoApp2_Clicked(object sender, EventArgs e)
{
DependencyService.Get<IDpendencyService>().Launch("com.companyname.app2");
}
我已经在 GitHub 上上传了,你可以从StartAnotherApp_Xamarin.forms/App1
文件夹中下载以供参考。
https://github.com/WendyZang/Test.git
推荐阅读
- azure-aks - 从气流到 Azure Fileshare 的事务过多
- qt - Qt ActiveX 和 OneNote(桌面 2016 32 位)
- teamcity - 使用变量作为 TeamCity 属性的名称
- laravel - Laravel 分页减少链接数量
- pandas - 如何针对一个组重置索引?
- jquery - Jquery - 在 mouseenter / mouseleave 上缓和过渡
- websocket - 如何将 Cowboy (Erlang) websocket 连接到 webflow.io 生成的网页
- python - Economy Bot | discord.py rewrite | Leaderboard error - AttributeError: 'NoneType' object has no attribute 'name'
- python - Python / Pandas:如何在数据框中的每一列中查找特定值的出现次数?
- html - 如何使用 css 样式控制我在 html 中的图像?