从Android库项目启动活动

从Android库项目启动活动,android,android-activity,android-intent,library-project,Android,Android Activity,Android Intent,Library Project,经过长时间的搜索,我找不到任何合适的解决方案。 我有一个Android库项目,几乎包含了应用程序的所有代码。从库项目中的主要活动开始,我打算显式执行活动A。在使用库项目的派生项目中,我扩展了此活动A并添加了一些新代码。问题是活动A的超类将响应,而派生类将不响应 在使用库项目的新项目清单中,我已经用新包声明了新活动 以下是来自库项目的意图调用: Intent i = new Intent(getApplicationContext(), AndroidActivity.class); startA

经过长时间的搜索,我找不到任何合适的解决方案。 我有一个Android库项目,几乎包含了应用程序的所有代码。从库项目中的主要活动开始,我打算显式执行活动A。在使用库项目的派生项目中,我扩展了此活动A并添加了一些新代码。问题是活动A的超类将响应,而派生类将不响应

在使用库项目的新项目清单中,我已经用新包声明了新活动

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

Intent i = new Intent(getApplicationContext(), AndroidActivity.class);
startActivity(i);
<?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>
以下是派生的AndroidActivity类:

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

    @Override
    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
            ...
我无法使用onCreate方法

库项目中的清单:

Intent i = new Intent(getApplicationContext(), AndroidActivity.class);
startActivity(i);
<?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>
我不想对库项目做太多的更改,因为第三个项目应该使用现有的代码和未触及的AndroidActivity

其他一切对我来说都很好。例如,更改的布局将从新项目中使用

我如何处理那个问题?可能是我声明的新项目清单中的更改,即应该调用新活动而不是超类


提前谢谢

在新项目中,可以使用不同的名称,而不是AndroidActivity。如果您不想这样做,清单文件中第二个AndroidActivity的完全限定名应该可以解决您的问题。你可能在某个地方把包裹弄乱了

activity android:name="de.app.library.activities.AndroidActivity" 活动android:name=“de.app.library.activities.android活动” 应该是

activity android:name="de.app.free.activities.AndroidActivity" 活动android:name=“de.app.free.activities.android活动”
我的意思是,男性化。在某种程度上,您从错误的包中选择了错误的活动类。

当您在库项目中这样做时

 Intent i = new Intent(getApplicationContext(), AndroidActivity.class);
android活动
是指库项目的
android活动
:项目不知道其他外部项目,除非将它们作为库包含。只需检查您的导入,您正在导入
Android活动
,并指示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
    .
    .
}
@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

    .
    .
}
派生项目的活动:

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
    .
    .
}
@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将是您的派生活动(或者另一个,您可以导入其中任何一个,因为您可以在这里访问派生活动和库项目)。

在新项目中,我没有MainActivity类。我指的是图书馆项目。只有雄激素活性有一些变化,这就是为什么我扩展了它。