如何从我的应用强制停止其他Android服务?

时间:2016-09-22 23:30:44

标签: c# android xamarin xamarin.android

首先,我要说我知道这是不好的做法,不好,可能不允许(技术上)等等......强行停止我的应用程序中的其他服务。

但是,有一些用例需要保证。在我的情况下,例如,我的应用程序安装了第三方服务,因为我引用它("它是条形码扫描SDK)。 SDK声明我必须将方法调用到名为

的方法
GetScannerService();

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

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

所有这一切,我已经看到这种服务陷入奇怪状态的情况。我无法控制此包中的代码(和错误)。是的,我已经联系过他们,但到目前为止还没有成功让他们解决根本原因。当它停留在这种状态时,我可以在正在运行的服务列表中看到它(有时它会在缓存的列表中列出),但是当我的应用程序调用GetScannerService时,它会抛出一个异常,基本上说服务无法启动。 ..但它已经是。

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

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

我从技术上知道这是不允许的,但我也读过,即使你没有root,也有办法做到这一点。

到目前为止,我可以获取所有正在运行的服务的列表,我可以在列表中看到有问题的服务。这意味着我还可以访问有关正在运行的服务的大量信息。但是,我所尝试的并不起作用。我已经尝试过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);
    }

因此,我可以列出它们并在列表中查看它,并获取有关列表中项目的详细信息。有谁知道我怎么强行阻止它?

1 个答案:

答案 0 :(得分:1)

您可以使用Process类:

void killProcess (int pid)

你可以从ActivityManager.RunningAppProcessInfo获得“pid”。