从一个应用程序运行另一个应用程序中的某些内容



(标题有点奇怪,因为"code"one_answers";app")

我有两个Android应用程序,一个是普通的无权限应用程序,一个是系统应用程序,具有关闭系统的权限。从我的正常应用程序,我想启动关机。我知道包的名称,我完全控制这两个应用程序。

从一个应用程序到另一个应用程序运行代码的最简洁的方法是什么?

一种方法是Service,然后我可以从intent.setComponent(...); startService(intent)开始,但作为Service意味着一些背景活动正在进行,这不是我的情况。

另一种方法是BroadcastReceiver,但这不允许我针对特定的组件,它需要一个标识符,其目的在概念上也被其他应用程序接收。

有更好的拟合语义的另一种方法吗?

但作为一个服务意味着一些后台活动正在进行,这不是我的情况。

使用AIDL的Service只是一种进程间通信(IPC)机制。该通信的接收者如何响应该通信取决于它。

此外,你有一些后台活动正在进行。你写:

从我的正常应用程序,我想启动关机

关闭设备"后台活动",至少在我的理解中是这样。

另一种方法是BroadcastReceiver,但这不允许我针对特定的组件

当然有。您可以在广播Intent上使用setComponent(),就像绑定到Service、启动Service或启动Activity一样。

使用setComponent()也有缺点,特别是两个代码库之间的依赖关系。基本上,ComponentName成为API契约的一部分,并且由于它映射到Java类名,因此您重构该类(新名称,新包)的能力受到限制。但是,没有什么可以阻止您使用setComponent()

例如,我在这篇博文中描述了使用setComponent()进行广播。在这种情况下,我通过PackageManager推导ComponentName的值,但这只是为这个特定的示例服务。

有更好的拟合语义的另一种方法吗?

对于单个交互,"fire and forget";之类的事情,你不需要任何形式的确认,我会发送一个显式广播(即,Intent的广播,使用ComponentName来识别接收者)。我肯定会使用signature级别的权限来保护它。

虽然CommonsWare的答案很好,并且带有自定义权限的显式广播通常是一种方法,但在这种特殊情况下,我遇到了一个问题。

应用程序不能接收广播,直到他们已经开始了一个活动,因为在此之前,他们一直处于"停止"状态。状态。因此,只有BroadcastReceiver的应用程序将无法工作。

由于我需要有一个活动,我把关闭代码在活动。

相关内容

  • 没有找到相关文章