Проблема вызова активности из другого пакета в Android - PullRequest
0 голосов
/ 29 июля 2011

Положение: Мне нужно объединить несколько приложений в одно приложение .apk. Скажем, внедрить app2 в app1

Что я сделал: Скопировал пакет app2 в основной проект app1, над которым я работаю, поэтому у моего app1 есть два пакета.

app2 имел этот файл манифеста:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.package.app2" android:versionCode="3" android:versionName="1.2">

<application android:label="App2" android:icon="@drawable/icon">
    <activity android:name="Activity1" android:launchMode="singleTask">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>        

<activity android:name="Activity2" android:excludeFromRecents="true"></activity>
</application>

<uses-permission android:name="android.permission.WAKE_LOCK"></uses-permission>
<uses-permission android:name="android.permission.VIBRATE"></uses-permission>
</manifest>

Мой исходный файл манифеста App1:

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
package="com.package.app1">
<application android:icon="@drawable/icon" android:debuggable="true">
    <activity android:name=".Start" 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="com.package.app1.PlayerList" />
    <activity android:name="com.package.app1.CreateNewPlayer" />
    <activity android:name="com.package.app1.Profile" />                       
    <activity android:name="com.package.app1.Braintrainer" />
</application>
</manifest> 

Код в app1, который я использую для вызова активности в пакете app2:

Intent i = new Intent();
i.setClassName("com.package.app1", "com.package.app2.Activity1");                    
startActivity(i);

Вопрос: Как изменить мой файл манифеста app1, чтобы иметь действия app2.

Вещи, которые я пробовал: Это работает, если я создаю простой тестовый класс HelloWorld в app2, вызываю с использованием того же кода и просто включаю его в манифест app1:

        <activity android:name="com.package.app2.Test" />

Но я не могу понять, как внедрить файл манифеста app2 в первый. Каждый раз, когда я пытаюсь дать никаких ошибок, но вылетает при вызове этого действия Одно приложение App2 работает нормально, поэтому проблема не в файле активности.

Ценю любые мысли по этому поводу.

Ответы [ 2 ]

3 голосов
/ 29 июля 2011
Intent i = new Intent();
i.setClassName("com.package.app1", "com.package.app2.Activity1");                    
startActivity(i);

Выстрел в темноте:

изменить com.package.app1 на com.package.app2.Я позвонил, сделал то, что вы пытаетесь прямо сейчас, и мне всегда приходилось указывать пакет класса, который я хотел вызвать.

Хорошо, PackageManager не ваше решение, я неправильно прочитал и подумал, что выбыло два приложения и хотел, чтобы одно приложение вызывало другое.Похоже, вы просто хотите одно приложение.

Измените манифест своего приложения1 следующим образом:

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
package="com.package.app1">
<application android:icon="@drawable/icon" android:debuggable="true">
    <activity android:name=".Start" 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="com.package.app2.Activity1" />
    <activity android:name="com.package.app2.Activity2" android:excludeFromRecents="true"></activity>
    <activity android:name="com.package.app1.PlayerList" />
    <activity android:name="com.package.app1.CreateNewPlayer" />
    <activity android:name="com.package.app1.Profile" />                       
    <activity android:name="com.package.app1.Braintrainer" />
</application>
<uses-permission android:name="android.permission.WAKE_LOCK"></uses-permission>
<uses-permission android:name="android.permission.VIBRATE"></uses-permission>
</manifest> 

И попробуйте первый способ еще раз.

0 голосов
/ 29 июля 2011

У меня есть несколько пакетов, и мне нужно сделать что-то подобное в моем приложении.

Вы должны быть осторожны с этой техникой, иначе у вас будут неприятные утечки памяти.

Я объявил свою активность в классе базового контроллера (активность) как статическую переменную. Все классы контроллеров наследуются от этого класса, поэтому все классы контроллеров могут получить к нему доступ. Передайте действие в качестве аргумента для чего-либо за пределами классов контроллера, которым требуется доступ к действию.

...