首先,我要说我知道这是不好的做法,不好,可能不允许(技术上)等等......强行停止我的应用程序中的其他服务。
但是,有一些用例需要保证。在我的情况下,例如,我的应用程序安装了第三方服务,因为我引用它("它是条形码扫描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);
}
因此,我可以列出它们并在列表中查看它,并获取有关列表中项目的详细信息。有谁知道我怎么强行阻止它?
答案 0 :(得分:1)