首页 > 解决方案 > 如何在 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 部分感兴趣,它似乎不起作用。我希望你们能帮助我。

标签: androidandroid-intentandroid-activityxamarin.forms

解决方案


你可以使用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


推荐阅读