如何从我的应用程序中强制停止不同的Android服务

本文关键字:服务 Android 我的 应用程序 | 更新日期: 2023-09-27 18:08:18

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

然而,有一些用例可以保证这种需求。以我为例,有一个第三方服务被我的应用程序安装,因为我引用了它("它"是一个条形码扫描SDK)。SDK声明我必须调用方法来调用

GetScannerService();

我观察到这个调用要么启动服务,要么在它已经运行的情况下获取它的实例。

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

说了这么多,我看到过这个服务在一个奇怪的状态下卡住的情况。我无法控制这个包中的代码(和bug)。是的,我已经联系了他们,但到目前为止还没有成功让他们解决根本原因。当它处于这种状态时,我可以在运行服务列表中看到它(有时它在缓存的列表中列出),但是当我的应用程序调用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);
    }

所以,我可以列出它们,并在列表中看到它,以及在列表中获取项目的详细信息。有人知道我怎么能强行停止它吗?

如何从我的应用程序中强制停止不同的Android服务

您可以使用Process类:

void killProcess (int pid)

你可以从ActivityManager.RunningAppProcessInfo中获得"pid"。