应用可以通过明确的意图在另一个应用中启动组件吗?

时间:2016-02-10 17:22:05

标签: android android-intent

App A可以通过显式意图启动App B中的组件吗?

我知道明确意图的一般用法是在同一个应用程序中启动一个组件。隐含意图用于跨越流程边界。

情景:

  1. App B定义并使用自定义权限" foo"
  2. App A使用     PackageManager API用于标识App B(定义了" foo"的应用程序)

    App A可以通过明确意图启动App B中的组件吗?

  3. 我不认为这是可能的,因为明确的意图需要 - 应用程序包和组件名称。

      

    if(PackageManager.PERMISSION_GRANTED == packageManager                       .checkPermission("富&#34 ;,                               pk.packageName))
                          results.add("包名:" + pk.applicationInfo.packageName +"类名:   &#34 + pk.applicationInfo.classNa);           }

    类名为null。因此,根据我的理解,仅通过依赖PackageManager API,就无法通过显式意图进行应用程序间通信。在Android 5中,您只能通过显式意图调用AIDL服务,但在开发时调用者需要知道暴露AIDL的应用程序的包和组件名称。我的理解是否正确?

3 个答案:

答案 0 :(得分:1)

  

App A可以在App B中启动一个组件吗?

App A可以试试。 App A是否会成功取决于几个方面,包括是否导出组件以及组件是否受权限保护。

  

我不认为这是可能的,因为明确的意图需要 - 应用程序包和组件名称。

应用程序ID和组件名称都是字符串。应用可以使用字符串。正确获取应用程序ID和组件名称可能需要一些工作,具体取决于App A和App B之间的关系。

作为反例,在Android 5.0+上绑定到服务的唯一方法是通过显式Intent。因此,如果App A希望绑定到App B导出的服务,App A别无选择,只能创建一个明确的Intent

答案 1 :(得分:0)

没办法。如果你想要启动应用程序之外的东西,你必须声明一个隐含的意图。否则android将在你的包中找到它,可能不会找到任何东西并崩溃。

答案 2 :(得分:0)

来自文档:

  

您通常会使用明确的意图来启动您的组件   自己的应用程序,因为您知道活动或服务的类名   你想要开始。

在"意图类型" - http://developer.android.com/guide/components/intents-filters.html

所以,通常你不会......但是你可以做到这一点,但这并不简单。要创建正确的显式意图,您将需要应用程序上下文和类。

获取另一个应用程序的上下文:

 createPackageContext (String packageName, int flags)

http://developer.android.com/reference/android/content/Context.html#createPackageContext(java.lang.String,%20int)

对于课程,您可以申请“活动”。和'服务'包管理器中的类。您也可以尝试使用反射。您还可以使用包的完全限定字符串名称并假设它是正确的和/或不会更改。如果需要,可以在应用程序中包含该类的存根,从而获得对它的引用(如果您可以访问源或存根库)。

如果有权限限制,则需要请求权限。