我应该如何在 AndroidManifest.xml 中定义 launchMode - 使用 PhoneGap 和 JQM

Posted

技术标签:

【中文标题】我应该如何在 AndroidManifest.xml 中定义 launchMode - 使用 PhoneGap 和 JQM【英文标题】:How should I define launchMode in AndroidManifest.xml - Using PhoneGap & JQM 【发布时间】:2014-03-11 23:55:15 【问题描述】:

我正在努力将我的应用程序限制为单个实例。目前,如果用户按下主屏幕退出应用程序,然后在外面做一些事情并再次点击应用程序的图标,它会启动应用程序的第二个实例。

这是我的完整清单文件:

<?xml version="1.0" encoding="utf-8"?>

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.mydomain.qfa"
      android:versionCode="4"
      android:versionName="1.3">


<uses-sdk android:minSdkVersion="7"
          android:targetSdkVersion="13"
          android:maxSdkVersion="18" />

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />

<application 
             android:debuggable=["false"]
             android:testOnly=["false"]
             android:icon="@drawable/icon.png"
>
<activity 
            android:name="com.mydomain.qfa"
            android:launchMode=["singleTask"]
            android:alwaysRetainTaskState="true"
            android:icon="@drawable/icon.png"
>
</activity>

</application>
</manifest>

它是一个单一的活动应用程序(基本上没有定义活动)。在 JQM 主页面上,我有类似这些条目的内容:

<div data-role="page" id="HomePage">

    <div data-theme="d" data-role="header" data-position="fixed" style="padding-bottom: 0px;" data-tap-toggle="false">

        <div data-role="navbar">                                      

    <div data-role="content"  class="MainContent"  style="overflow:hidden; padding-top: 0px;">

谁能告诉我我的 Manifest 是否正确以及我是否应该使用

android:name="com.mydomain.qfa"

或者应该是其他类似的东西

android:name="com.mydomain.qfa.HomePage"?

android:name="com.mydomain.qfa.MainContent"?

提前致谢。

【问题讨论】:

【参考方案1】:

我为这个问题苦苦挣扎了 2 天。添加此属性的修复最近从 3.5 开始添加到 Cordova,issue CB-6048

添加:

<preference name="AndroidLaunchMode" value="singleTask" />

到 config.xml

其他可用值:

“标准” “单顶” “单一任务” “单一实例”

【讨论】:

这看起来是我遇到的问题的完美解决方案,但它不会更新我的 Android Manifest.xml。我已经手动添加了android:launchMode="singleTop" 并运行该项目,一切都很好,但是使用&lt;preference name="AndroidLaunchMode" value="singleTask" /&gt; 运行cordova build android 会从XML 文件中删除实际的launchMode 标记 我也以为我的AndroidManifest.xml 没有更新,但结果我的AndroidLaunchMode 被附加到文件末尾(而默认条目出现在文件顶部) .尽管文件中现在有两个条目,但似乎最后一个条目获胜。【参考方案2】:

试试

<activity android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale" android:label="@string/app_name" android:launchMode="singleTop" android:name="HomePage" android:theme="@android:style/Theme.DeviceDefault">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

这是由 phonegap CLI 生成的,并且启动模式设置为 singleTop 以具有单个实例。

android:name 必须匹配 Activity 的主 java 类的名称,而不是完整的包名。默认 phonegap 将其设置为应用名称。

【讨论】:

【参考方案3】:

这最终对我有用:

但是诀窍是您需要在两个位置进行更改

A) MyAppFolder\platforms\android\AndroidManifest.xml

<activity android:alwaysRetainTaskState="true" android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale" android:label="@string/app_name" android:launchMode="singleTask" android:name="AppName" android:theme="@android:style/Theme.Black.NoTitleBar">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

B) MyAppFolder\www\AndroidManifest.xml

<activity
            android:name="AppName"
            android:launchMode=["singleTask"]
            android:alwaysRetainTaskState="true"
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
</activity>

希望对某人有所帮助。

【讨论】:

真的吗?下次发布后会检查。不能在最后一刻进行实验。无论如何,谢谢你的观点。 面临同样的问题......但是,我的 phonegap 应用程序中也没有看到 www/androidmanifest.xml。 @Anjum 你能仔细检查一下吗? 我的理解是AndroidManifest.xml是在创建PhoneGap项目时默认创建的。但如果那不存在,就创造一个。 @QuickFix 下面的解决方案对我有用。【参考方案4】:

试试这个:

<gap:config-file platform="android" parent="/manifest/application">
    <activity android:launchMode="singleInstance" />
</gap:config-file>

但在您的配置的小部件设置中,应该是这样的(添加 android 命名空间定义):

<widget xmlns     = "http://www.w3.org/ns/widgets"
        xmlns:gap = "http://phonegap.com/ns/1.0"
        xmlns:android = "http://schemas.android.com/apk/res/android"
        id        = "com.wildabeast.app"
        version   = "1.0.0">
....
</widget>

【讨论】:

以上是关于我应该如何在 AndroidManifest.xml 中定义 launchMode - 使用 PhoneGap 和 JQM的主要内容,如果未能解决你的问题,请参考以下文章

GoogleAnalytics

为 Lollipop 使用 Android SDK 18 (Jelly Bean)

除非在授予权限后重新启动应用程序,否则无法写入外部存储

从 Eclipse 导入项目到 Android Studio

Android LaunchMode案例篇

va.io.FileNotFoundException: /storage/emulated/0/xxx/xxx/加密: open failed: EACCES (Permission denied)