安卓:如何启动库项目中定义的活动。

5

我正在开发一个使用androidVNC Viewer作为库项目的Android应用程序,但我无法从androidVNC启动活动(发现活动异常)。

另外,我该如何打包一个库项目并将其用作一个apk?

更新

我正在使用以下意图进行调用:

Intent call= new Intent("android.androidVNC.androidVNC.LAUNCH");
startActivity(call);

更新2 使用以下代码后,我认为我可以启动该活动,但是遇到了this(java.lang.NoSuchFieldError:android.androidVNC.R $ id.textIP)错误...

注:该错误可能是由于缺少所需的字段或库文件导致的。请确保您已正确安装并链接了所需的库文件。
Intent vnc_call = new Intent(getApplicationContext(), androidVNC.class);
            vnc_call.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            startActivity(login);

在检查了R.java、androidVNC原始文件和androidVNC作为库时(在生成的Java文件下)...我发现textip在原始R.java中存在,但在调用项目的R.java生成的Java文件中不存在。 logcat的输出(前几行)如下:
04-05 01:34:18.135: W/dalvikvm(479): 无法解析Landroid/androidVNC/AbstractConnectionBean的超类; (256) 04-05 01:34:18.135: W/dalvikvm(479): 类'Landroid/androidVNC/AbstractConnectionBean;'的链接失败 04-05 01:34:18.135: W/dalvikvm(479): 无法解析Landroid/androidVNC/ConnectionBean的超类; (8) 04-05 01:34:18.135: W/dalvikvm(479): 类'Landroid/androidVNC/ConnectionBean;'的链接失败 04-05 01:34:18.145: W/dalvikvm(479): VFY: 找不到签名中引用的类(Landroid/androidVNC/ConnectionBean;) 04-05 01:34:18.155: W/dalvikvm(479): 无法解析Landroid/androidVNC/AbstractConnectionBean的超类; (256) 04-05 01:34:18.155: W/dalvikvm(479): 类'Landroid/androidVNC/AbstractConnectionBean;'的链接失败 04-05 01:34:18.155: W/dalvikvm(479): 无法解析Landroid/androidVNC/ConnectionBean的超类; (8) 04-05 01:34:18.155: W/dalvikvm(479): 类'Landroid/androidVNC/ConnectionBean;'的链接失败 04-05 01:34:18.187: W/dalvikvm(479): 无法解析Landroid/androidVNC/AbstractConnectionBean的超类; (256) 04-05 01:34:18.187: W/dalvikvm(479): 类'Landroid/androidVNC/AbstractConnectionBean;'的链接失败 04-05 01:34:18.187: W/dalvikvm(479): 无法解析Landroid/androidVNC/ConnectionBean的超类; (8)

有任何线索吗?


你在清单文件中声明了吗? - MByD
是的,我已经声明了它。 - Sanyprashant
你使用的是哪个 Android SDK 版本,r17? - yorkw
SDK修订版16...和API 9... - Sanyprashant
2个回答

8
即使库项目有自己的 AndroidManifest.xml,在构建时也不会将其内容添加到您的构建中。如果您打算使用库中声明的任何内容,这些内容必须复制到您实际的应用程序清单中。这包括活动、广播接收器、服务、权限等。

2
根据您更新的代码,您不是通过其类名启动活动,而是基于其操作来启动它。您在清单中的活动条目是否包括一个<intent-filter>部分,并带有诸如<action android:name="android.androidVNC.androidVNC.LAUNCH" />的操作?如果没有,这就是为什么您无法找到该活动的原因。您可以更改清单以在意图过滤器中声明操作(您可能还需要向过滤器添加<category android:name="android.intent.category.DEFAULT" />,我不确定),或更改定义Intent的方式。 - mah
Android Studio现在按照您的期望合并AndroidManifest.xml文件和资源。因此,您现在可以在库AndroidManifest.xml中定义库活动。 - respectTheCode
@mah 你确定需要在清单文件中定义广播接收器吗?我曾经在一个库项目中使用 BroadcastReceiver 来获取 USB 通知,但它既没有在主应用程序的清单文件(即使用该库的应用程序)中定义,也没有在库的清单文件中定义。但是,由于 Android 的 USB 行为非常奇怪,所以它能够正常工作可能只是 USB 的一个怪癖。 - Brian Reinhold
@BrianReinhold 我不知道今天的情况如何,但我回答三年前的状态是,你必须声明一个静态BR为infest(而库清单是不够的),或者你可以在运行时安装一个动态BR。当它应该在没有任何东西启动应用程序来运行动态安装之前被激活时,需要一个静态接收器。 - mah
@mah 我明白了。我的BR是动态的,只有在服务启动时才会生效。这可能是原因。我有两个,一个用于捕获BT事件,另一个用于捕获USB事件。 - Brian Reinhold
显示剩余2条评论

2
假设lib和app有不同的命名空间:
当将lib-manifest-info与app-manifest合并时,按照mah所描述的方式,您是否在activity中包含了不同的命名空间?
    <application ... >
        <activity
            android:name=".MyActivity" >...

to

    <application ... >
        <activity
            android:name="my.namespace.MyActivity" >...

使用最新的Eclipse-Android工具1.7版本可能会有所帮助。请参阅如何在Android中使用可重用的GUI元素小部件资源获取详细信息。


即使布局名称也不应相同。 - Dhrupal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接