从Android库项目启动Activity

12

经过长时间的搜索,我没有找到任何合适的解决方案。 我有一个 Android-Library 项目,几乎所有代码都在这个应用程序中。在库项目的主活动中,我启动了一个意图以显示一个明确的活动 A。在使用库项目的派生项目中,我扩展了这个活动 A 并添加了一些新代码。问题是超类 Activity A 将会响应而不是派生类。

在使用库项目的新项目的清单中,我已声明了具有新包的新 Activity。

以下是从库项目调用的意图:

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方法。

来自库项目的清单文件:

<?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>

这里是来自新项目的清单文件:

<?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现有代码。

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

我该如何解决这个问题?也许在新项目的清单中进行更改,声明应该调用新活动而不是超类?

提前致谢!

2个回答

1
当你在你的库项目中这样做时:
 Intent i = new Intent(getApplicationContext(), AndroidActivity.class);
AndroidActivity指的是库项目中的AndroidActivity: 一个项目不知道其他外部项目,除非你将它们包含为库。只需检查导入,您正在导入AndroidActivity,并指示Android运行它。

顺便说一句,如果库项目必须了解派生项目,那将是一种糟糕的设计模式。

一个简单的解决方案是覆盖在派生项目中启动活动,类似于以下内容:

库项目活动:

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()时,它将执行重写的函数(前提是启动活动扩展了库项目的活动并覆盖了该方法)。在重写函数的上下文中,AndroidActivity.class将是您派生的活动(或另一个活动,您可以导入其中任何一个,因为在这里您可以访问派生活动和库项目的活动)。

0
在你的新项目中,你可以使用一个不同的名称,而不是AndroidActivity。如果你不想这样做,那么在清单文件中使用第二个AndroidActivity的完全限定名称应该解决你的问题。你可能在某个地方搞混了包名。
activity android:name="de.app.library.activities.AndroidActivity"
应该改为
activity android:name="de.app.free.activities.AndroidActivity"
我的意思是,AndroidActivity。以某种方式,你从错误的包中选择了错误的活动类。

2
在新项目中,我没有MainActivity类。我正在指向库项目。只有AndroidActivity有一些更改,这就是为什么我扩展它的原因。 - treimy

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