从 Android 中的库项目中调用应用程序活动

Posted

技术标签:

【中文标题】从 Android 中的库项目中调用应用程序活动【英文标题】:Calling an Application Activity from a Library Project in Android 【发布时间】:2012-09-13 19:52:55 【问题描述】:

好的,

所以我正在制作一个 UI 元素库项目。该库有一些基于 ActionBarSherlock 的活动,ActionBarSherlockandroid 中操作栏的向后兼容库。在这些活动中,我希望在操作栏中有一个按钮,无论他们在图书馆项目中使用哪个活动,它都会将用户带回家。

一些术语。 “库”指的是我正在处理的 Android UI 库项目。 “应用程序”是指开发人员可能使用包含的库的任何客户。

通常,当您进行一项活动并想调用另一个活动时,您会这样做。

intent = new Intent(this, WhateverMyActivityName.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);

足够简单。但这是棘手的一点。 Android 库几乎不知道什么应用程序正在使用它们。所以 'WhateverMyActivityName.class' 是无用的,因为无法预测开发人员应用程序将调用他们的活动。

我需要更换

intent = new Intent(this, WhateverMyActivityName.class);

类似这样的东西

intent = new Intent(this, getApplication().MainActivity().getClass());

或者可能使用某种意图操作来调用应用程序中的主 Activity (Intent.ACTION_MAIN or Intent.CATEGORY_LAUNCHER)

简而言之:如何从库项目中获取应用程序主要活动?

【问题讨论】:

刚刚在 Intent 文档 ACTION_MAIN 中找到了这个,类别为 CATEGORY_HOME -- 启动主屏幕。 这是一件很奇怪的事情。通常我们创建库项目,以便我们可以将它们重用于许多应用程序。应用程序独立代码去那里..从库项目调用特定的应用程序活动限制它的用法.. @Krishnabhadra 这是一个不寻常的用例,但图书馆设计有一个主页按钮,我想不出任何办法来阻止图书馆向应用程序流血。也许我应该将它配置为 XML 资源,以便开发人员可以指定他们想要调用的活动? 【参考方案1】:

我们可以使用反射来获取类对象。

Class.forName("com.mypackage.myMainActivity")

将此代码添加到库项目中调用,

try 
      Intent myIntent = new Intent(this,Class.forName("com.mypackage.myMainActivity"));
      startActivity(myIntent );
 catch (ClassNotFoundException e) 
     e.printStackTrace();

“com.mypackage.myMainActivity”是 Main 项目中的 Activity,我们需要从它的 Library 项目中调用它。

【讨论】:

我花了好几天才弄明白。非常感谢,这是唯一对我有用的解决方案。【参考方案2】:

应用程序调用库中的某个方法,提供要调用的Intent,或提供要调用的活动的Class。您的图书馆在某个地方存储并使用它。

您认为正确答案是“Intent.ACTION_MAIN 或 Intent.CATEGORY_LAUNCHER”的假设可能不准确。例如,一些应用程序具有启动屏幕活动(这本身就是一个问题,但这是题外话),这不是应用程序中的家庭可供性应该去的地方。

【讨论】:

也许(考虑到它是一个库并且可能需要一些配置)我可以让开发人员将他们的类定义为 xml 资源。然后调用一个意图? @OVERTONE:我想这可行。就个人而言,我真的建议您让开发人员提供Intent 以供您使用,因为他们可能希望对标志等进行一些控制。 让他们提供意图。这听起来更干净。如果他们愿意,我也可以让他们禁用它。下一个任务是找到一种干净的方法来做到这一点。有什么建议吗? @OVERTONE:正如我所写,“应用程序调用库中的某些方法,提供要调用的Intent”。由于我们对您的图书馆一无所知,因此很难提供更具体的建议。【参考方案3】:

您可以使用this 帖子中提到的代码获取活动列表。之后通过 resolveinfo 循环并检查 intenet 过滤器以找到具有所需意图操作的活动。

【讨论】:

也许我理解错了,但这种方法不需要应用程序的包名吗?在这种情况下,我仍然需要找到开发者应用程序的包名。 @OVERTONE: 因为你有一个来自开发者应用程序的Context(你在上面调用startActivity()),你可以在那个Context上调用getPackageName()来找到包名的应用程序。 你在那里有上下文,从那里你可以得到包管理器并做剩下的事情。

以上是关于从 Android 中的库项目中调用应用程序活动的主要内容,如果未能解决你的问题,请参考以下文章

Android - 父活动应确定子活动调用它

如何从 android 活动启动 Unity 应用程序?

Grails 项目在运行时不会从其自己的 lib 目录中的库中解析依赖关系

Android:处理同步网络调用

ANDROID:从解析中检索图像到 android 活动

如何根据Android应用程序中的日期更改主要活动中的图像