(标题有点奇怪,因为"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
的应用程序将无法工作。
由于我需要有一个活动,我把关闭代码在活动。