从 Android 中的库项目中调用应用程序活动
Posted
技术标签:
【中文标题】从 Android 中的库项目中调用应用程序活动【英文标题】:Calling an Application Activity from a Library Project in Android 【发布时间】:2012-09-13 19:52:55 【问题描述】:好的,
所以我正在制作一个 UI 元素库项目。该库有一些基于 ActionBarSherlock 的活动,ActionBarSherlock 是 android 中操作栏的向后兼容库。在这些活动中,我希望在操作栏中有一个按钮,无论他们在图书馆项目中使用哪个活动,它都会将用户带回家。
一些术语。 “库”指的是我正在处理的 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 中的库项目中调用应用程序活动的主要内容,如果未能解决你的问题,请参考以下文章