1

我正在尝试使用库项目构建从同一代码库派生的两个不同的 Android 应用程序。

这些应用程序正在使用意图服务进行各种操作,但是当我有两个使用同时安装的相同代码库的应用程序时,这似乎失败了。

似乎只有我安装的应用程序的第一个版本有效,第二个似乎没有让服务运行。

有没有人有这方面的经验?这怎么可能解决?

编辑:这些是清单

根据:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.codebase"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="8" />

    <supports-screens android:largeScreens="true" android:anyDensity="true" android:resizeable="true" android:smallScreens="true" android:normalScreens="true"></supports-screens>
    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>

    <application android:icon="@drawable/icon_launcher" android:label="CodeBase" android:process="@string/app_name" android:name="com.codebase.activity.Application" android:theme="@android:style/Theme.NoTitleBar" android:debuggable="false">
        <activity android:configChanges="orientation" android:name="com.codenase.activity.MainActivity" android:launchMode="singleTask">
        <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>

        </activity>
        <service android:name="com.codebase.service.UpdateService" android:process="@string/app_name">
            <intent-filter>
                <action
                    android:name="com.codebase.service.UpdateService" />
            </intent-filter>
        </service>

</manifest>

目标1:

    <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="10" />

    <supports-screens android:largeScreens="true" android:anyDensity="true" android:resizeable="true" android:smallScreens="true" android:normalScreens="true"></supports-screens>
    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>

    <application android:icon="@drawable/icon_launcher" android:label="Target One" android:name="com.codebase.activity.Application" android:theme="@android:style/Theme.NoTitleBar">
        <activity android:configChanges="orientation" android:name="com.codebase.activity.MainActivity" android:launchMode="singleTask">
        <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>


        <service android:name="com.codebase.service.UpdateService" android:process="@string/app_name">
            <intent-filter>
                <action
                    android:name="com.codebase.service.UpdateService" />

            </intent-filter>
        </service>

        </activity>

    </application>

</manifest>

目标 2:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.trg2"
    android:versionCode="1"
    android:versionName="1.0" >


    <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="10" />

    <supports-screens android:largeScreens="true" android:anyDensity="true" android:resizeable="true" android:smallScreens="true" android:normalScreens="true"></supports-screens>
    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>

    <application android:icon="@drawable/icon_launcher" android:label="Target 2" android:name="com.codebase.activity.Application" android:theme="@android:style/Theme.NoTitleBar">
        <activity android:configChanges="orientation" android:name="com.codebase.activity.MainActivity" android:launchMode="singleTask">
        <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <service android:name="com.codebase.service.UpdateService">
            <intent-filter>
                <action
                    android:name="com.codebase.service.UpdateService" />
            </intent-filter>
        </service>

    </application>


</manifest>
4

3 回答 3

1

首先,在这种情况下,无需在 AndroidManifest.xml 中为服务定义 intent-filter,如果您不需要从应用程序外部提供额外的访问点,则以下定义​​就足够了:

<service android:name="com.codebase.service.UpdateService"/>

然后使用public Intent(Context packageContext, Class cls)启动服务:

Intent intent = new Intent(getBaseContext(), UpdateService.class);
startService(intent);

其次,如果您确实需要从应用程序外部提供额外的访问点,请不要在多个应用程序中使用相同的操作名称,因为它会在尝试将意图传递给相应的服务时欺骗 Android 操作系统(如果您使用公共启动服务的意图(字符串操作):

目标1:

<service android:name="com.codebase.service.UpdateService" android:process="@string/app_name">
  <intent-filter>
    <action android:name="com.codebase.service.UpdateService.TARGET_1" />
  </intent-filter>
</service>

目标 2:

<service android:name="com.codebase.service.UpdateService" android:process="@string/app_name">
  <intent-filter>
    <action android:name="com.codebase.service.UpdateService.TARGET_2" />
  </intent-filter>
</service>

希望这可以帮助。

于 2012-04-16T01:57:31.717 回答
0

我和你一样基于一个代码库有两个版本的同一个 android 应用程序。

我没有任何问题。两个应用程序具有不同的包名称

但是,我确保两者都具有相同的(共享)用户 ID。也许这就是诀窍

http://developer.android.com/guide/topics/manifest/manifest-element.html

(顺便说一句,当我没记错的时候,userId 之间需要有一个点)

于 2012-04-13T14:42:01.823 回答
0

确保您在清单中正确地限定了您的服务。

例如

如果你有:

主项目包名 = com.johan.p1

图书馆项目包名 = com.johan.library

假设您的服务在库项目中,您的主项目会将服务定义为:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.johan.p1"

     <service android:name="com.johan.library.MyServiceName" />

</manifest>
于 2012-04-13T15:09:01.027 回答