在Android中从另一个包调用活动时出现问题

时间:2011-07-29 13:53:06

标签: android android-activity android-intent package manifest

情况: 我需要将几个应用程序合并到一个.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活动。

我尝试过的事情: 如果我在app2中创建简单的HelloWorld测试类,使用相同的代码调用并将其包含在app1清单中,它就可以工作:

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

但我无法弄清楚如何将app2清单文件实现到第一个。我尝试的每一种方式都没有错误,但在调用该活动时崩溃。仅App2工作正常,因此问题不在活动文件中。

感谢对此的任何想法。

2 个答案:

答案 0 :(得分:3)

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

在黑暗中拍摄:

com.package.app1更改为com.package.app2。我已经完成了你现在正在尝试的事情,并且我总是必须指定我想要调用的类的包。

好的,PackageManager不是你的解决方案,我误读并认为你有两个应用程序,并希望一个应用程序来调用另一个。看起来你只想要一个应用程序。

像这样修改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.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> 

再试一次。

答案 1 :(得分:0)

我有几个软件包,需要在我的应用程序中做类似的事情。

你需要小心这种技术,否则你会遇到令人讨厌的内存泄漏。

我在基本控制器(活动)类中将我的活动声明为静态变量。所有控制器类都继承自此类,因此所有控制器类都能够访问它。将活动作为参数传递给需要访问活动的控制器类之外的任何内容。