android - 从 Android-Library-Project 启动 Activity

标签 android android-activity android-intent library-project

经过长时间的搜索,我找不到任何合适的解决方案。 我有一个 Android-Library 项目,其中包含该应用程序的几乎所有代码。从库项目中的主要 Activity 开始,我启动了一个明确的 Activity A 的 Intent 。在我使用库项目的派生项目中,我扩展了这个 Activity A 并添加了一些新代码。问题是 Activity A 的父类(super class)而不是派生类会响应。

在使用库项目的新项目的 list 中,我用新包声明了新 Activity 。

这是来自图书馆项目的 Intent 调用:

Intent i = new Intent(getApplicationContext(), AndroidActivity.class);
startActivity(i);

这是派生的 AndroidActivity 类:

public class AndroidActivity extends de.app.library.activities.AndroidActivity {

    @Override
    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
            ...

我无法访问 onCreate 方法

图书馆计划的 list :

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="de.app.library"
android:versionName="1.0" 
android:versionCode="1">

<uses-sdk android:minSdkVersion="4" />

<application 
    android:icon="@drawable/icon" 
    android:label="@string/app_name">

    <activity android:name=".activities.MainActivity"
              android:label="@string/app_name">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

    <activity android:name=".activities.AndroidActivity" android:label="@string/act_android" />
</application>

这里是新项目的 list :

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  package="de.app.free"
  android:versionCode="1"
  android:versionName="1.0">

<uses-sdk android:minSdkVersion="4" />

<application 
    android:icon="@drawable/icon" 
    android:label="@string/app_name">


    <activity android:name="de.app.library.activities.MainActivity"
              android:label="@string/app_name">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

    <activity android:name=".activities.LernenActivity" android:label="@string/act_lernen" />

所以我有:

de.app.library.activities.AndroidActivity  and
de.app.free.activities.AndroidActivity

我不想对库项目做太多更改,因为第三个项目应该使用现有代码和未修改的 AndroidActivity

所有其他事情对我来说都很好。例如,从新项目中使用更改后的布局。

我该如何处理这个问题?也许我声明的新项目的 list 发生了变化,应该调用新 Activity 而不是父类(super class)?

提前致谢!

最佳答案

当你在你的图书馆项目中这样做时

 Intent i = new Intent(getApplicationContext(), AndroidActivity.class);

AndroidActivity 引用库项目的 AndroidActivity:一个项目不知道其他外部项目,除非您将它们作为库包含在内。只需检查您的导入,您正在导入 AndroidActivity,并指示 Android 运行它。

很明显,如果库项目必须了解派生项目,那将是一个糟糕的设计模式

一个简单的解决方案是覆盖在派生项目上启动的 Activity ,如下所示:

图书馆项目 Activity :

public void runMyActivity() {
    Intent i = new Intent(getApplicationContext(), AndroidActivity.class);
    // You are on the library project, so you can refer to the activities created in it.
    // the only AndroidActivity known here is the library project's
    .
    .
}

您派生项目的 Activity :

@Override
public void runMyActivity() {
    // You are now on the derived project, so you can refer to 
    // the activities created in it, and also to the library project's. You
    // just import the package name of the desired activity or use fully qualified
    // names

    Intent i1 = new Intent(getApplicationContext(), AndroidActivity.class);
    // this one will use the activity in the imports
    Intent i2 = new Intent(getApplicationContext(), de.app.libarary.AndroidActivity.class);
    // use the activity from the library project
    Intent i3 = new Intent(getApplicationContext(), de.app.free.AndroidActivity.class);
    // use the activity from the derived project

    .
    .
}

因此,当您从任何地方调用 runMyActivity() 时,它将执行覆盖的函数(前提是启动 Activity 扩展了库项目的 Activity 并覆盖了该方法)。在覆盖的函数上下文中,AndroidActivity.class 将是您的派生 Activity (或其他 Activity ,您可以导入其中任何一个,因为在这里您可以访问派生 Activity 和库项目的 Activity )。

关于android - 从 Android-Library-Project 启动 Activity,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6974696/

相关文章:

android - 每个 Activity 的静态初始化器(就像 Fragment 一样)

android - 登录到 facebook 一个按钮来打开一个新的 Activity

android - ExoPlayer 使用自定义的 MediaCodecSelector

Android Intent Activity 崩溃行为 - 应用程序在应用程序中途重启

java - 单击后退按钮时使用 PutExtra 发送数据

java - 使用WindowManager添加 View 时如何处理所有按键事件?

android - 如何从 Intent 过滤器中获取 Activity 类

java - 图像中的可点击区域

android - 如何用Fragment Scenario测试Fragment?

java - 如何在 Android 中访问剪贴板数据?