Начало деятельности из Android-библиотеки-проекта

после долгого поиска я не нашел подходящего решения. У меня есть проект Android-библиотеки с почти всем кодом для приложения. Из основного действия в библиотечном проекте я начинаю Intent для явного действия A. В моем производном проекте, который использует проект библиотеки, я расширил эту операцию A и добавил новый код. Проблема в том, что суперкласс действия А будет отвечать, а не производный класс.

В манифесте нового проекта, который использует проект библиотеки, я объявил новую активность с новым пакетом.

Вот вызов 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

Манифест из проекта библиотеки:

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

Другие вещи отлично подходят для меня. Например, измененные макеты используются из нового проекта.

Как я могу справиться с этой проблемой? Может быть, изменения в манифесте из нового проекта, в котором я объявляю, что новый вид действия следует вызывать вместо суперкласса?

Спасибо заранее!

Ответ 1

Когда вы делаете это в своем проекте библиотеки

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

AndroidActivity относится к проекту библиотеки AndroidActivity: проект не знает о других внешних проектах, если вы не включите их в качестве библиотеки. Просто проверьте свой импорт, вы импортируете AndroidActivity и поручаете Android запустить его.

Что, кстати, очевидно, это был бы плохой дизайн, если проект библиотеки должен был знать о производных проектах

Простым решением является переопределение запуска активности в производном проекте, что-то вроде этого:

Деятельность Libary:

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 будет вашей производной деятельностью (или другой, вы можете импортировать любую из них, потому что здесь у вас есть доступ к производным видам деятельности и проекту библиотеки).

Ответ 2

В новом проекте вы можете использовать другое имя вместо AndroidActivity. Если вы не хотите этого делать, второе полное имя AndroidActivity в файле манифеста должно решить вашу проблему. Вы, возможно, немного испортились с пакетами.

activity android:name="de.app.library.activities.AndroidActivity"

должен быть

activity android:name="de.app.free.activities.AndroidActivity"

Я имел в виду, AndroidActivity. В некотором роде вы собираете неправильный класс активности из неправильного пакета.