首先,让我说,我知道这是不好的做法,不好,可能不允许(技术上)等,等等...强制停止我的应用程序的另一项服务。
但是,有一些用例可以满足这种需求。例如,在我的例子中,我的应用程序安装了一个第三方服务,因为我引用了它(“它”是条形码扫描 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);
}
因此,我可以列出它们并在列表中查看它,还可以获取有关列表中项目的详细信息。有人知道我如何强制停止它吗?
最佳答案
关于c# - 如何从我的应用程序强制停止不同的 Android 服务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39650362/