【问题标题】:Problem calling activity from another package in Android从 Android 中的另一个包调用活动时出现问题
【发布时间】:2011-07-29 22:27:34
【问题描述】:

情况: 我需要将多个应用程序组合成一个 .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 单独工作正常,所以问题不在活动文件中。

感谢您对此的任何想法。

【问题讨论】:

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


    【解决方案1】:
    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> 
    

    然后再试第一种方法。

    【讨论】:

    • 不,我将其更改为 app2 它不会更改任何内容t work even with a simple test class, if i call with setComponent then yeah its app2, but doesnt,因为它也适用于测试类,但不适用于 app2 类。不是和清单文件有关吗?
    • 包管理器听起来像是一个解决方案,那么在这种情况下清单文件呢?还有我如何选择在 yoru 示例中打开 com.package.app2 包中的哪个活动,如果包在复制到我的项目时没有清单文件
    • 这就是 im asking, if i use simple HelloWorld class in app2 and just add &lt;activity android:name="com.package.app2.Test" /&gt; to my app1 manifest file it works, but i dont 知道如何将 app2 清单活动添加到第一个活动。如果只是添加所有带有内容过滤器的活动,它会崩溃
    • 没有用,似乎另一种解决方案只是将文件复制到一个包中,然后尝试将所有内容作为单个应用程序运行。有没有其他方法可以将多个应用程序合并到一个 .apk 文件中?
    • 您的 logcat 中的错误是什么?
    【解决方案2】:

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

    您需要小心使用这种技术,否则您会遇到严重的内存泄漏。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多