XAMARIN Android 应用程序,如何获取已安装应用程序的列表作为 MVVM 中的服务?

Cod*_*ack 2 android xamarin.forms visual-studio-2019

  1. 我想加载 Android 手机上已安装应用程序的列表。
  2. 我正在尝试利用 MVVM 框架构建 Xamarin Forms 应用程序。
  3. 我正在使用 Visual Studio 2019 Pro 和 Xamarin Forms

我一直在寻找相关文章Android.App.Application.Context.PackageManager.GetInstalledApplications,但我一直无法弄清楚如何获得对它的参考。

Sel*_*och 6

您可以使用依赖服务来实现这一点。我将详细介绍,以便其他刚接触 Xamarin 的人也能理解。

首先我们将创建我们的模型。您可以将其命名为InApp.cs共享目录。

public class InApp
{
    public string AppName { get; set; }
    public string PackageName { get; set; }

    public InApp(string appName, string packageName)
    {
        AppName = appName;
        PackageName = packageName;
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我们可以在文件夹中创建依赖服务Android。将其命名为AndroidService.cs.

public class AndroidService : IAndroidService
{
    public List<InApp> GetIntalledApps()
    {
        List<InApp> inApps = new List<InApp>();
        IList<ApplicationInfo> apps = Android.App.Application.Context.PackageManager.GetInstalledApplications(PackageInfoFlags.MatchAll);
        for (int i = 0; i < apps.Count; i++)
        {
            inApps.Add(new InApp(apps[i].LoadLabel(Android.App.Application.Context.PackageManager), apps[i].PackageName));
        }
        return inApps;
    }
}
Run Code Online (Sandbox Code Playgroud)

上面的代码将获取已安装的应用程序,然后创建List我们上面创建的模型并返回它。

在运行时,Xamarin 应该知道在哪里查找依赖服务,因此我们应该将其添加到AndroidService上面创建的类的名称空间之上。

[assembly: Xamarin.Forms.Dependency(typeof(AndroidService))]
Run Code Online (Sandbox Code Playgroud)

IAndroidServiceAndroid是将在运行时访问文件夹类的接口AndroidService。我们将在 Shared 目录中创建此类。我们可以将其命名为IAndroidService.cs.

public interface IAndroidService
{
    List<InApp> GetIntalledApps();
}
Run Code Online (Sandbox Code Playgroud)

现在我们已经完成了依赖服务的实现。下一部分是创建ListView并添加从我们的 Android 服务返回的已安装应用程序列表。

由于我们在 中执行此操作MVVM,因此我们现在将创建一个视图模型。

InstalledAppViewModel.cs在共享目录中创建。

public class InstalledAppViewModel: INotifyPropertyChanged
{
    private ObservableCollection<InApp> installedApps;
    public ObservableCollection<InApp> InstalledApps
    {
        get { return installedApps; }
        set
        {

            installedApps = value;
        }
    }

    public InstalledAppViewModel()
    {
        List<InApp> listOfInstalledApps = DependencyService.Get<IAndroidService>().GetIntalledApps();
        InstalledApps = new ObservableCollection<InApp>(listOfInstalledApps);
    }

    public event PropertyChangedEventHandler PropertyChanged;
}
Run Code Online (Sandbox Code Playgroud)

上面,我们已经完成了依赖注入并将方法的返回值添加GetInstalledApps到我们的Observable列表中。

现在在您的MainPage.Xaml.Cs绑定视图模型中。

BindingContext = new InstalledAppViewModel();
Run Code Online (Sandbox Code Playgroud)

在您的MainPage.Xaml.

 <ListView ItemsSource="{Binding InstalledApps}">
<ListView.ItemTemplate>
    <DataTemplate>
        <ViewCell>
            <StackLayout Orientation="Vertical">
                <StackLayout Orientation="Horizontal" VerticalOptions="CenterAndExpand">
                    <Label Text="{Binding AppName}" FontSize="Medium" />
                </StackLayout>
            </StackLayout>
        </ViewCell>
    </DataTemplate>
</ListView.ItemTemplate>
Run Code Online (Sandbox Code Playgroud)

ItemSource列表视图属性中,您将绑定Observable我们在视图模型类中创建的列表。