Android一个APK多个入口(多个桌面图标)的实现

前言

Android应用一般都是一个APK一个桌面图标,但有时候我们需要实现一个APK在桌面上有多个图标(比如BAT的某些应用,有桌面快捷方式),对于这种一个APK需要在桌面上显示多个图标的,通常有两种方法来实现:

1. 进入程序后生成桌面快捷方式,这个适合于在程序运行之后生成桌面图标;

2. 在AndroidManifest.xml文件中配置多个入口,这个适合于程序安装完成后就在桌面上显示多个图标。

在桌面生成快捷方式,具体实现方式可参见:

1. 总结:android 创建快捷方式的两种方式+判断是否已经创建+删除快捷方式

2. Android create shortcuts on the home screen

本文介绍第二种方式,在程序安装完成后就会在桌面显示多个图标,这种方式适合于多个模块功能一样,但里面内容不一样(比如教材数据)的情况。

具体实现

在Android应用程序中,我们是通过给Activity标签中加入下面的intent-filter来指定程序的入口的,如果一个APK要有多个入口,自然而然地想到AndroidManifest.xml文件中会存在多个包含如下标签的Activity,所以我们需要做的仅仅是如何区分每一个桌面图标对应哪一个入口。

<intent-filter>
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>

Activity有一个重要的属性process,这个属性是指定Activity运行时所在的进程。没有指定此属性的话,所有程序组件运行在应用程序默认的进程中,这个进程名跟应用程序的包名一致。在AndroidManifest.xml文件中所有组件元素的process属性能够为该组件设定一个新的默认值。但是任何组件都可以覆盖这个默认值,允许你将你的程序放在多进程中运行。如果这个属性被分配的名字以:开头, 当这个Activity运行时,
一个新的专属于这个程序的进程将会被创建。所以可以通过给每一个Activity指定标签、图标和进程名来区分不同的入口,具体实现如下:

         <activity
            android:name=".PreSchoolChildActivity"
            android:label="@string/pre_school_child_app_name"
            android:process=":process.main"
            android:icon="@drawable/preschoolchild_launcher" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <activity
            android:name=".EnglishSpellActivity"
            android:label="@string/english_spell_app_name"
            android:process=":process.sub"
            android:launchMode ="singleInstance"
            android:icon="@drawable/englishspell_launcher" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

需要注意的是,为Activity指定process属性后,还必须为其指定launchMode为singleInstance,这样才有效。除了为Activity指定android:process属性外,还可以通过为Activity指定别名的方式实现同样的效果,具体参见:activity-alias

存在的问题

1. 因为多个图标共用一个包名,所以只要卸载一个程序,与这个APK包名相同的程序也都会在桌面上消失;

2. 从其它应用跳转到该APK时,需要通过ACTION区分跳转到具体哪一个模块(比如从资源管理器选择一个数据时,到底打开哪一个应用,需要通过action加以区分);

3. 由于多个图标、splash、标题等需要区分的资源都放在一个APK中,这无形之中增加了APK的大小。

时间: 2024-12-27 15:09:40

Android一个APK多个入口(多个桌面图标)的实现的相关文章

(转)从android一个apk中启动第三方apk应用

从android一个apk中启动第三方apk应用 我们在开发中,经常遇到遇到在一个apk中要去运行另外一个apk,就像我们windows一样,搞一个快捷方式一样,那怎么实现呢? 问题的核心点在于我们要拿到第三方apk的package名称跟class名称,这两个至关重要!比如笔者做测试用的qq apk,package名称是com.tencent.pad.qq,class名称是com.tencent.pad.qq.login.QQLoginActivity.从一个apk启动到另外一个apk,当然也是

Android(java)学习笔记158:Java程序入口和Android的APK入口

1.Java程序的入口:static main()方法 public class welcome extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } public static void main(String[] args) { System.out.p

如何把多个Android Project打包成一个APK

如何把多个Android Project打包成一个APK(你的项目如何引用其他项目). 如何把多个android project 打包成一个apk呢,其实原理是这样的,一个主project引用其他的project,其他project类似于jar包一样被引用,当然和jar的引用原理有很大的区别.下面是详细的说明. 第一步,把普通的android project设置成库项目 库项目也是一个标准的android项目,因此你先创建一个普通的android项目. 这个项目可以起任何的名称,任何的报名,设置

(转)获取android手机内部存储空间和外部存储空间的参数 &amp;&amp; 如何决定一个apk的安装位置

转:http://blog.csdn.net/zhandoushi1982/article/details/8560233 获取android文件系统的信息,需要Environment类和StatFs类的支持. (1)Environment 是一个提供访问环境变量的类,常用的方法有: A,getRootDirectory() ,返回File,获取Android 的根目录. B,getDataDirectory() ,返回File ,获取Android 数据目录. C,getExternalSto

两个apk打包成一个apk发布

一.简介 前段时间miui6隆重发布,感觉很不错的样子.由于自己没用小米手机,所以要是尝鲜miui6只能使用别的方法,这个时候在应用商店看到了"小米系统"这个应用,下载下来后看到这个应用是miui的一个轻装版本,一个apk里面打包了如下基础应用:桌面.锁屏.通讯模块(短信.拨号盘.联系人).云服务.应用商店,看到这种模式以后不得不对小米互联网产品思维表示佩服,单单91助手上下载量500k+,有了这种便捷的推广方法,估计小米现在已经懒得再去折腾最早弄的比较复杂的patchrom项目了.

Android获取APK包名的几种方法

Android获取APK包名的几种方法:1.adb shell pm list package -f | findstr 关键字 #只能获取到包名,主Activity名无法获取到 2.使用aapt--aapt是sdk自带的一个工具,在sdk\builds-tools\目录下 运行后的结果中以下两行分别是应用包名package和入口activity名称 package: name=’com.estrongs.android.pop’ launchable-activity: name=’com.e

转:android中APK开机自动运行

背景知识:当Android启动时,会发出一个系统广播,内容为ACTION_BOOT_COMPLETED,它的字符串常量表示为android.intent.action.BOOT_COMPLETED.只要在程序中“捕捉”到这个消息,再启动之即可.记住,Android框架说:Don't call me, I'll call you back.我们要做的是做好接收这个消息的准备,而实现的手段就是实现一个BroadcastReceiver. 代码解析: 1.界面Activity:SayHello.jav

html5 如何打包成apk,将H5封装成android应用APK文件的几种方法

直接使用编程软件提供的方法: 1.需要下载安装MyEclipse2014,Android SDK,eclipse(需配置Android开发环境) Java和Android环境安装与配置. 2.打开MyEclipse2014,新建一个HTML5 Mobile Application Project,命名,例如:hello. 3.html5程序在工程www目录下编辑:编辑好html5程序,下面就要开始学习打包了. 4.这里介绍两种打包方式: 4.1.PhoneGap  Build Service 打

Cocos2d-x3.1下 Android,APK自动升级

项目要做Android的自动升级,对于我们之前做iOS的转Cocos开发做Android方面的功能..... 不对说了.这里记录下我的实现过程. 原文地址:http://blog.csdn.net/qqmcy/article/details/36713113 首先我们要先知道Cocos下Android有几个Activity,我推测是只有一个,如果不对的话请批评指正啊. 所以我们要在主Activity也就是AppActivity.java里面添加如下代码: static AppActivity a