如何从库中启动Android应用程序中的活动

时间:2016-02-24 05:18:40

标签: android android-intent android-activity

我在Android Studio中有一个Android应用程序。我在应用程序中添加了一个库。按钮,视图和活动在库中定义。当我单击按钮时,我需要导航到应用程序中定义的活动。

通常,为了导航到另一个页面,我们使用了意图,如下所示:

Intent intent = new Intent(MainActivity.this, Activity.class);
startActivity(intent);

但这不是从库中调用应用程序活动的充分方法。

问题是图书馆和应用程序是独立的;他们有不同的包裹。因此,库中无法识别应用程序中的活动。

如何处理库和应用程序之间的通信?

4 个答案:

答案 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>