为什么80%的码农都做不了架构师?>>>   

方法一:使用Activity的属性process,不同的Activity是运行在不同的进程中

一个工程对应一个AndroidManifest.xml文件,这个文件中包含有该项目的一些设置,如权限、SDk版Activity、Service信息等。一般而言,这个文件中会有且仅有一个application节点,这个节点表示这是一个应用程序,不管它下面还有多少子节点如Activity、Service等等。形象的说,就是这个项目生成的apk安装到Android设备后,应用程序列表中会出现一个ICON,这个ICON就是这个程序的执行入口了。

但是,某些情况下,我们需要为我们的apk设置多个执行入口,也就是安装后在应用程序列表中出现多个ICON图标,各个ICON是APP不同模块的入口点,并且各个模块运行在不同的进程中。

可能这种需求很少见,但还是有一个现实的例子:系统中的联系人和电话这两个程序。表面看来这是两个独立的应用程序,但实际上它们只是一个应用程序的两个执行入口而已,点击联系人图标就会进入联系人界面,点击电话图标就会进入拨号界面,这都是通过设置该项目下Activity的属性来实现的。

Activity有一个重要的属性process,这个属性是指定Activity运行时所在的进程。没有指定此属性的话,所有程序组件运行在应用程序默认的进程中,这个进程名跟应用程序的包名一致。中所有组建元素的process属性能够为该组件设定一个新的默认值。但是任何组件都可以覆盖这个默认值,允许你将你的程序放在多进程中运行。如果这个属性被分配的名字以:开头, 当这个activity运行时, 一个新的专属于这个程序的进程将会被创建。

以下面的代码为例,项目中有两个Activity,其中一个采用默认属性,另一个为其指定process属性以及新的ICON,这样该项目安装到设备上之后可以发现多了两个应用程序图标,一个是应用程序默认的图标,点击后进入HelloWorldActivity;另一个是手动指定的ICON,点击后进入NextPageActivity。这时使用adb shell查看进程可以发现,两个Activity是运行在不同的进程中的。

AndroidManifest.xml的主要内容如下:

1.<activity Android:name=".HelloWorldActivity" 2. Android:label="@string/app_name" 3. Android:process=":process.main"> 4. <intent-filter> 5. <action Android:name="android.intent.action.MAIN" /> 6. <category Android:name="android.intent.category.LAUNCHER" /> 7. </intent-filter> 8.</activity> 9. 10.<activity Android:name="cn.ian.NextPageActivity" 11. Android:label="@string/nextpage" 12. Android:process=":process.sub" 13. Android:icon="@drawable/icon1" 14. Android:launchMode ="singleInstance"> 15. <intent-filter> 16. <action Android:name="android.intent.action.MAIN" /> 17. <category Android:name="android.intent.category.LAUNCHER" /> 18. </intent-filter> 19.</activity>

通过上面的方式,为App的各个组件指定process和icon属性,便能够达到类似于一个apk中打包多个程序(模块)的目的。

ps:要特别注意,为Activity指定process属性后,还必须为其指定launchMode为singleInstance,这样才有效

方法二:使用activity-alias

activity-alias是android里为了重复使用Activity而设计的。

当在Activity的onCreate()方法里,执行getIntent().getComponent().getClassName();得到的可能不是这个Activity的名字,有可能是别名的名字,例如:在AndroidMenifest.xml有如下配置:

[xhtml] view plain copy
  1. <activity
  2. android:name=".TestAndroid"
  3. android:icon="@drawable/ic_menu_mark">
  4. <intent-filter>
  5. <action android:name="android.intent.action.MAIN" />
  6. <category android:name="android.intent.category.LAUNCHER" />
  7. </intent-filter>
  8. </activity>
[xhtml] view plain copy
  1. <activity
  2. android:name=".TestAndroid"
  3. android:icon="@drawable/ic_menu_mark">
  4. <intent-filter>
  5. <action android:name="android.intent.action.MAIN" />
  6. <category android:name="android.intent.category.LAUNCHER" />
  7. </intent-filter>
  8. </activity>
[xhtml] view plain copy
  1. <activity-alias
  2. android:name="TestAndroidAlias"
  3. android:targetActivity="TestAndroid"
  4. android:label="testAndroidlias"
  5. android:icon="@drawable/ic_launcher_phone">
  6. <intent-filter>
  7. <action android:name="android.intent.action.MAIN" />
  8. <category android:name="android.intent.category.DEFAULT" />
  9. <category android:name="android.intent.category.LAUNCHER" />
  10. </intent-filter>
  11. </activity-alias>
[xhtml] view plain copy
  1. <activity-alias
  2. android:name="TestAndroidAlias"
  3. android:targetActivity="TestAndroid"
  4. android:label="testAndroidlias"
  5. android:icon="@drawable/ic_launcher_phone">
  6. <intent-filter>
  7. <action android:name="android.intent.action.MAIN" />
  8. <category android:name="android.intent.category.DEFAULT" />
  9. <category android:name="android.intent.category.LAUNCHER" />
  10. </intent-filter>
  11. </activity-alias>

这个应用会在桌面上建两个进入点,即建两个可以进入TestAndroid这个Activity的快捷图标。这时getIntent().getComponent().getClassName() 得到的名字就不一样,一个是com.test.TestAndroid,一个是com.test.TestAndroidAlias。

转载于:https://my.oschina.net/fltsp/blog/670795

Android 一个apk多个ICON执行入口相关推荐

  1. 一个apk多个ICON执行入口

    一个工程对应一个AndroidManifest.xml文件,这个文件中包含有该项目的一些设置,如权限.SDk版Activity.Service信息等.一般而言,这个文件中会有且仅有一个applicat ...

  2. 为知更新Android下一个apk安装多个程序入口图标

    Android开发中,一个工程对应一个AndroidManifest.xml文件,这个文件中包含有该项目的一些设置,如权限.SDk版本,Activity.Service信息等.一般而言,这个文件中会有 ...

  3. 如何获取Android的apk的包名及其入口

    0. 前提 已经配置好adb环境,没配置好的话可以参考博客配置adb环境变量配置一下. 1. 通过.apk获取APP的包名和Activity 1.1 找到aapt文件 资源管理器搜索栏输入%ANDRO ...

  4. android 一个应用两个入口一个应用两个快捷方式(不同图标显示)

    我们在 Android开发中,一个工程对应一个AndroidManifest.xml文件,这个文件中包含有该项目的一些设置,如权限.SDk版Activity.Service信息等.一般而言,这个文件中 ...

  5. Android的main方法,Android程序没有main函数,那Android程序的执行入口在哪儿?

    首先,我们可以了解,Android程序可以由一个或者多个Activity组成,每个Activity之间并没有很紧密的联系. 我们可以在自己的程序中调用其他的Activity,特别是自己的代码之外生成的 ...

  6. 用Gradle打包出jar文件 前面我们说过,在Android Studio里面使用Gradle来打包应用程序,一般都是build出来一个apk文件。但是有的同学是做实现层的开发,不直接做View层

    用Gradle打包出jar文件 前面我们说过,在Android Studio里面使用Gradle来打包应用程序,一般都是build出来一个apk文件.但是有的同学是做实现层的开发,不直接做View层的 ...

  7. nodejs 解析Android apk获取app icon

    最近在做平台上传应用的时候,需要解析apk拿到icon显示在前端.在npm,github上搜了一圈没找到可用lib.后来想到adbkit-apkreader这个库,依靠里面的一个函数,解决了这个问题 ...

  8. 【Android 教程系列第 26 篇】如何查看一个 apk 的签名信息

    这是[Android 教程系列第 26 篇],如果觉得有用的话,欢迎关注专栏. 如下图所示,准备把一个 apk 文件解压缩 解压缩后的文件内容如下所示 点开 META_INF 文件夹,其中的 CERT ...

  9. android的应用入口点函数,android 没有main函数,怎么找到程序执行入口呢?以及activity主要生命周期的方法说明...

    android应用程序,由一到多个Activity组成.每个Activity没有很紧密的联系,因为我们可以在自己的程序中调用其它Activity,特别是调用自己的代码之外生成的Activity,比如a ...

最新文章

  1. tensorflow中keep_prob的修改方法
  2. python输入字母判断大小写_Python-检查输入的数字、大写字母、小写字母和特殊字符...
  3. php检测类是否存在,php判断类是否存在函数class_exists用法分析
  4. javascript闭包,你大爷永远是你大爷
  5. 用户身份与文件的权限(普通权限、特殊权限、隐藏权限和文件控制列表ACL)
  6. 一行代码引来的安全漏洞,就让我们丢失了整个服务器的控制权
  7. python合并 txt
  8. bzoj 1419: Red is good
  9. python3扫雷代码_python3 命令行 扫雷
  10. 全新设计的 Xcode 12
  11. 链式调用方法的实现原理和方法
  12. python for IOS,支持iPhone
  13. sscanf 与 sscanf_s的区别
  14. 五个最佳编程文本编辑器
  15. MATLAB图像去雾霭算法及其实现
  16. c语言的编译器手机版,C语言编译器下载_C语言编译器APP手机最新版安装 - 风云下载...
  17. Linux命令之find命令
  18. 年底了,你总结了吗?我先来。
  19. 网页设计如何排成一列_HTML页面布局怎么设计(图文)
  20. Android ButterKnife(黄油刀)的使用

热门文章

  1. Hibernate基本配置
  2. Linux一行命令处理批量文件
  3. CSS内置的几个标准的伪类和伪对象
  4. 【BZOJ3555】[Ctsc2014]企鹅QQ hash
  5. 使用 Android NDK 重用现有的 C 代码
  6. SQL Azure SU3 现已在全球6座数据中心开始启用
  7. SharePoint 2007 SDK v1.5
  8. 简单的VC 操作XML 文件的的方法
  9. Socket网络通讯_TCP协议
  10. testng 定时构建_Jenkins使用安装:持续集成自动化方案 | Web自动化测试方案