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

在Android中从库项目调用应用程序活动,android,android-intent,android-activity,android-library,library-project,Android,Android Intent,Android Activity,Android Library,Library Project,嗯 所以我正在做一个UI元素的库项目。该库有一些基于ActionBarSherlock的活动,后者是android中操作栏的向后兼容库。在这些活动中,我希望在操作栏中有一个按钮,无论用户在库项目中使用哪个活动,它都会将用户带回家 一些术语。“库”是指我正在从事的Android UI库项目。“应用程序”指的是开发人员可能使用的包含库的任何客户 通常,当你做一个活动,你想打电话给另一个,你会这样做 intent = new Intent(this, WhateverMyActivityName.cl

所以我正在做一个UI元素的库项目。该库有一些基于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());
或者可能使用某种类型的intent操作,该操作将调用应用程序中的主活动
(intent.action\u main或intent.CATEGORY\u LAUNCHER)


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

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


您认为正确答案为“Intent.ACTION\u MAIN或Intent.CATEGORY\u LAUNCHER”的假设可能不准确。例如,某些应用程序必须是启动屏幕活动(这本身就是一个问题,但这与问题无关),而应用程序中的家庭提供功能不应该放在这个位置。

您可以使用文章中提到的代码获得活动列表。之后,通过resolveinfo循环并检查intenet筛选器,以找到具有所需的intent操作的活动。

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

Class.forName(“com.mypackage.mymain活动”)

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

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

“com.mypackage.myMainActivity”是主项目中存在的活动,我们需要从其库项目中调用它。

刚刚在意图文档操作中发现了这一点,使用category category\u HOME启动主屏幕。这是一件奇怪的事情。。通常我们创建库项目,以便在许多应用程序中重用它们。。独立于应用程序的代码就在那里。。从库项目调用特定的应用程序活动会限制其使用。@Krishnabhadra这是一个不寻常的用例,但是库设计有一个主按钮,我想不出任何方法来阻止库向应用程序中渗透。也许我应该将其配置为XML资源,以便开发人员可以指定他们想要调用的活动?也许(考虑到它是一个库,可能需要一些配置),我可以让开发人员将其类定义为XML资源。“然后再叫一个意图吗?”泛音:我想那可能行得通。就个人而言,我真的建议您只需让开发人员向您提供要使用的
意图
,因为他们可能希望对标志等进行一些控制。让他们提供意图。听起来干净多了。如果他们愿意,我也可以让他们禁用它。下一个任务是找到一个干净的方法来做到这一点。有什么建议吗?@OVERTONE:正如我所写的,“应用程序调用库中的某个方法,提供要调用的
意图
”。因为我们对您的库一无所知,所以很难提供更具体的建议。也许我误解了,但是这种方法不需要应用程序的包名吗?在这种情况下,我仍然需要找到开发人员应用程序的包名。@OVERTONE:由于您有来自开发人员应用程序的
上下文
(这就是您所调用的
startActivity()
on),您可以调用
getPackageName()
Context
上查找应用程序的程序包名称。您的上下文就在那里,从那里您可以获得程序包管理器并执行其他操作。这花了我几天的时间才弄清楚。非常感谢,这是唯一对我有效的解决方案。