我有一个Android应用程序,我在其中实现了一个在Android Manifest中声明为“导出”的服务。此设备上安装了许多不同的应用程序,这些应用程序正在尝试启动此导出的服务。所有这些都使用此代码来启动导出的服务:
MY_ACTION = "com.phantom.foobar.action.xyz"
PACKAGE_NAME = "com.phantom.foobar"
CLASS_NAME = "com.phantom.foobar.IpcService"
public static void startSaveUrlAction(Context context, String foo, String bar) {
Intent intent = new Intent(MY_ACTION);
intent.setClassName(PACKAGE_NAME, CLASS_NAME);
intent.putExtra(FOO, foo);
intent.putExtra(BAR, bar);
context.startService(intent);
}
Manifest文件中应用程序标记内的服务描述:
<service
android:name=".IpcService"
android:exported="true" />
现在问题是一些应用程序能够启动它而一些不能启动它。这是无法启动该服务的应用程序的logcat信息:
01-02 16:04:05.574 1385 2698 W ActivityManager: Unable to start service Intent { cmp=another.music.player/com.phantom.foobar.IpcService } U=0: not found
01-02 16:04:05.575 1385 2699 W ActivityManager: Unable to start service Intent { cmp=another.music.player/com.phantom.foobar.IpcService } U=0: not found
如果我没错,{ cmp=another.music.player/com.phantom.foobar.IpcService }
这是由{ cmp = package_name/class_name }
组成的组件名称。即使我已将PACKAGE_NAME
指定为com.phantom.foobar
,但它正在尝试启动错误的意图。在这种情况下,another.music.player
是尝试启动导出服务的应用程序的包名称。
这只适用于某些应用程序。我想知道为什么会这样。是否有任何属性或某些东西(可以在Android Manifest中设置的某种属性)可以阻止应用程序在包外启动意图?
抽象细节:
我正在使用Xposed Framework,它允许我挂钩其他应用程序的方法。我已经从Android API中获取了一个方法。现在每当在其他应用程序中调用该方法时,我从该应用程序中提取一些信息并使用其上下文,我开始导出com.phantom.foobar
的IntentService,从而使用上面给定的函数将信息传递给我的应用程序。