c# - 如何从我的应用程序强制停止不同的 Android 服务?

标签 c# android xamarin xamarin.android

首先,让我说,我知道这是不好的做法,不好,可能不允许(技术上)等,等等...强制停止我的应用程序的另一项服务。

但是,有一些用例可以满足这种需求。例如,在我的例子中,我的应用程序安装了一个第三方服务,因为我引用了它(“它”是条形码扫描 SDK)。 SDK 声明我必须调用方法来调用

GetScannerService();

我观察到此调用将启动服务或获取实例(如果它已经在运行)。

此外,在我的应用程序的 onStop 和 onDestroy 期间必须执行一些调用,这将有效地停止此第三方服务。

总而言之,我见过此服务卡在奇怪状态的案例。我无法控制此包中的代码(和错误)。是的,我已经联系过他们,但到目前为止未能让他们解决根本原因。当它停留在这种状态时,我可以在正在运行的服务列表中看到它(有时它会在缓存的服务列表中列出)但是当我的应用程序调用 GetScannerService 时,它​​会抛出一个异常,基本上说明服务无法启动。 ..但它已经是。

因此,当发生这种情况时,如果我手动到正在运行的服务列表并找到它(同样,有时它在缓存中)并单击强制停止,这将解决问题并且我的应用程序再次按预期工作......直到它再次发生。

因此,我希望并且需要让我的应用程序控制此服务。这个想法是在启动时,当我第一次调用 GetScannerService 时,如果它返回异常,我基本上会强制停止它,以便我可以再次调用并启动它。换句话说,我想将强制停止功能自动化。

我知道从技术上讲这是不允许的,但我也读到有一些方法可以做到这一点,即使你没有根。

到目前为止,我可以获得所有正在运行的服务的列表,并且可以在我的列表中看到有问题的服务。这意味着我还可以访问有关正在运行的服务的大量信息。但是,我尝试过的方法不起作用。我已尝试 KillBackgroundProcesses 但没有成功,该服务仍在列表中。

到目前为止,这是我尝试过的:

   private void Button_Click(object sender, EventArgs e)
    {
        var am = (ActivityManager)this.Application.ApplicationContext.GetSystemService(Context.ActivityService);
        var taskList = am.GetRunningServices(serviceListLimit);

        List<string> serviceNames = new List<string>();


        foreach(var t in taskList)
        {
            serviceNames.Add(t.Service.PackageName);
        }

        var adapter = new ArrayAdapter<string>(this, Android.Resource.Layout.SimpleListItem1, serviceNames);

        services.Adapter = adapter;

        if (serviceNames.Contains(emdkServiceName))
            testKillService(am, emdkClass);
    }



    private void testKillService(ActivityManager am, Class emdkClass)
    {
        am.KillBackgroundProcesses(emdkServiceName);
    }

因此,我可以列出它们并在列表中查看它,还可以获取有关列表中项目的详细信息。有人知道我如何强制停止它吗?

最佳答案

您可以使用 Process类:

void killProcess (int pid)

您可以从 ActivityManager.RunningAppProcessInfo 中获取“pid” .

关于c# - 如何从我的应用程序强制停止不同的 Android 服务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39650362/

相关文章:

c# - Entity Framework : update user fails

C# 使用日历参数调用 Java Web 服务

c# - 使用 Mapper 与隐式运算符有什么优势吗?

php - 用于使用 Google Cloud 消息传递的 API 的数据结构

android - BiometricPrompt 类在 Xamarin Android 中不可用

c# - 每当用户导航到 Xamarin.Android 中的页面时如何创建方法

c# - 如何在 lambda 表达式中放入两个条件

android - 获取没有标题/通知栏的窗口大小

android - Google Play 发布商帐户已终止,其他开发者可以发布我的应用吗?

ios - 当我上下滚动 UICollectionView 时, View 高度约束设置不正确