我在Android Studio中有一个Android应用程序。我在应用程序中添加了一个库。按钮,视图和活动在库中定义。当我单击按钮时,我需要导航到应用程序中定义的活动。
通常,为了导航到另一个页面,我们使用了意图,如下所示:
Intent intent = new Intent(MainActivity.this, Activity.class);
startActivity(intent);
但这不是从库中调用应用程序活动的充分方法。
问题是图书馆和应用程序是独立的;他们有不同的包裹。因此,库中无法识别应用程序中的活动。
如何处理库和应用程序之间的通信?
答案 0 :(得分:3)
执行此操作的常规方法是:
Intent intent = new Intent();
intent.setComponent(new ComponentName("com.my.package","com.my.package.activity.ActivityName");
startActivity(intent);
这是对库中活动的明确引用。您应该确保在启动此Activity时捕获ActivityNotFoundException,因为当系统中不存在Activity时可能会发生这种情况。
理想情况下,在构建此Intent时,您应该确保可以使用PackageManager API解决它。
但是你应该尽量避免使用硬编码软件包,但是当涉及到图书馆时,有时候你无法做出选择。
还有一点需要注意的是,在库中,您需要确保导出Activity,以便您可以在应用程序之外访问它。
是否可以启动活动 其他应用程序的组件 - " true"如果它可以,并且"假"如果 不。如果" false",则活动只能由组件启动 具有相同用户ID的相同应用程序或应用程序。该 默认值取决于活动是否包含意图过滤器。 没有任何过滤器意味着只能调用活动 通过指定其确切的类名。这意味着活动是 仅供应用程序内部使用(因为其他人不会 知道班级名称)。所以在这种情况下,默认值为" false"。 另一方面,至少一个过滤器的存在暗示了这一点 该活动旨在供外部使用,因此默认值为 "真"
此属性不是限制活动曝光的唯一方法 其他应用。您还可以使用权限来限制 可以调用活动的外部实体(请参阅权限 属性)。
参考
http://developer.android.com/guide/topics/manifest/activity-element.html
答案 1 :(得分:1)
在AndroidManifest.xml中包含活动。
从最简单的方式访问任何其他项目的活动 传递整个班级名称(包括包裹,例如; " com.myproject.MainActivitiy&#34)
从您的图书馆致电:
Intent intent= new Intent("com.myproject.MainActivitiy");
startActivity(intent);
在您的项目清单中声明如下
<activity
android:name="com.myproject.MainActivitiy"
android:label="@string/app_name" >
<intent-filter>
<action android:name="com.myproject.MainActivitiy" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
答案 2 :(得分:0)
在这种情况下,可以通过提供包括包的完整类名来使用Intent。
让我们假设您当前的Activity类是 MainActivity.java ,包名为 com.app.myproject 。
并且您希望导航到另一个名为 Activity.java 的类的Activity,该类位于另一个包 com.app.external 中。
在当前项目/库的清单中包含 com.app.external.Activity.java 。
<activity
android:name="com.app.external.Activity"
android:label="@string/title_activity_login"
android:screenOrientation="portrait">
</activity>
你的意图应该是这样的 -
Intent intent = new Intent(MainActivity.this, com.app.external.Activity.class);
startActivity(intent);
答案 3 :(得分:0)
在这种情况下,请使用隐式Intent
内部库活动TESTActivity:
Intent intent = new Intent();
intent.setAction("com.myapp.myimplicit_action");
startActivity(intent);
这是我的一些活动的清单文件声明,说&#39; ImplicitActivity&#39;采取相同的行动
<activity android:name=".ImplicitActivity">
<intent-filter>
<action android:name="com.myapp.myimplicit_action" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>