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

C# 如何从我的应用程序强制停止不同的Android服务?,c#,android,xamarin,xamarin.android,C#,Android,Xamarin,Xamarin.android,首先,让我说,我知道这是不好的做法,不好,可能不允许(技术上)等等,等等。。。强制停止我的应用程序中的其他服务 然而,有一些用例可以保证这种需求。例如,在我的例子中,我的应用程序安装了一个第三方服务,因为我引用了它(“它”是一个条形码扫描SDK)。SDK声明我必须调用方法来调用 GetScannerService(); 我观察到,这个调用要么启动服务,要么抓取已经运行的实例 此外,在我的应用程序的onStop和onDestroy期间必须进行一些调用,这些调用将有效地停止此第三方服务 综上所述,

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

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

GetScannerService();
我观察到,这个调用要么启动服务,要么抓取已经运行的实例

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

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

因此,当这种情况发生时,如果我手动转到running services列表并找到它(再次,有时它在缓存中)并单击force stop,这将修复问题,我的应用程序将再次按预期工作…直到它再次发生

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

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

到目前为止,我可以得到所有正在运行的服务的列表,并且可以在列表中看到有问题的服务。这意味着我还可以访问有关正在运行的服务的很多信息。但是,我所尝试的并不奏效。我曾试图终止后台进程,但没有成功,该服务仍在列表中

以下是我迄今为止所尝试的:

   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);
    }
private void按钮\u单击(对象发送者,事件参数e)
{
var am=(ActivityManager)this.Application.ApplicationContext.GetSystemService(Context.ActivityService);
var taskList=am.GetRunningServices(serviceListLimit);
List serviceNames=新列表();
foreach(任务列表中的变量t)
{
serviceNames.Add(t.Service.PackageName);
}
var adapter=new ArrayAdapter(这个,Android.Resource.Layout.SimpleListItem1,serviceNames);
适配器=适配器;
if(serviceNames.Contains(emdkServiceName))
testKillService(am、emdkClass);
}
私有void testKillService(ActivityManager am,类emdkClass)
{
am.killbackgroundprocesss(emdkServiceName);
}
因此,我可以列出它们并在列表中查看它们,还可以获取列表中项目的详细信息。有人知道我如何强制停止吗?

您可以使用该类:


您可以从中获取“pid”

谢谢你的回复,我今天有机会尝试一下。它似乎有效(没有例外),但实际上并没有终止进程,它仍然在列表中。我首先得到了您提到的pid,在断点期间,我可以看到我确实捕获了我关心的进程(我看到了类名、pid等)。然后我调用Android.OS.Process.KillProcess(pid);但它不会死!!!注意,有一个Java.Lang.Process,但不是这个。我还检查了清单中的权限。除非我漏掉了一个,否则我想我都拿到了。还有其他想法吗?事实上,我正在阅读该进程。只有当进程的UID与我的UID匹配时,KillProcess才会终止该进程。这可能是罪魁祸首。我的SDK调用确实启动了此过程,但我无法确定它是否与我的应用程序具有相同的UID。这可能就是为什么安卓操作系统(作为一种安全功能)并没有真正杀死它。但是,我也了解到,如果您指定权限KILL_BACKGROUND_进程,您可以使用ActivityManager.killbackgroundprocesss(name),我已经这样做了,但它也不起作用。也许我没有正确指定名称?我认为这里的主要问题是这些服务上的
START\u-STICKY
标志。如果您检查所有kill实现,我认为其中至少有一个应该终止服务。但由于该服务是以粘性启动的,因此操作系统每次都会重新启动它。您可以在
logcat
中检查它。如果您检查“未”终止服务的PID(例如,在控制台中使用
top
命令),它与您之前终止的服务不同。
void killProcess (int pid)