`
danlov
  • 浏览: 28308 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

跨应用调用Activity的一点理解

 
阅读更多
       Android程序与Windows程序有个很大的区别,就是自己的应用可以利用其它应用的组件和功能,不用重复开发。非常典型的就是调用其它应用的Activity,相信大家都用过,比如调用系统拨号、拍照功能或是现成的浏览器。
    调用起来非常简单,利用Intent的隐式跳转,比如调用拨号:

    Intent intent = new Intent(Intent.ACTION_CALL,Uri.parse   ("tel:"+phone_number));
    startActivity(intent);

    非常简单,复杂一些的会用到intent-filter中的其它参数,但本质上都如调用拨号一样。当然在同一应用中也可以这么调用,Android的好处就是你调用自己或是其它应用的功能,看起来像一样,非常人性化。是不是知道怎么调用,或是达到会配置intent-filter,能使自己的Activty被其它应用隐式调用就完事了。如果仔细想想,应用在后台还有进程,Android中还有Task存在,应该就会疑问了。多个应用配合工作时,进程是如何工作的、Task是怎么分配的?
    所以想懂得多一些,有必要把这些疑问理一下,而且非常必要,为什么呢,因为有时候我们程序发生一些莫名其妙的问题时,往往是因为有些原理我们没有掌握,至少是没有理解的深一些,所以从表面上看不出个所以然,只有深入理解了,其实非常简单,很好解释。
    需要弄懂三个方面的知识:
    一、”android:process“属性的作用
    二、Task与Activity关系
    三、Application实例的创建

    ”android:process“属性的作用
    该属性在”AndroidManifest.xml“文件中设置,包括application、activity、service等都有该属性,一般不需要进行设置,系统会给个默认值,即包名。
    那这个属性是设置什么的呢?设置组件所在的进程名称。所以很好理解在默认情况下,同一应用的所有组件都是运行在同一进程中的,而且两个不同应用的组件,肯定是运行在不同进程中的。因为包名不一样,进程名则不一样,进程名不一样,肯定不是同一进程。
    另一个问题,组件所在进程名一样了,是不是肯定就是同一个进程? 不是的。确定是否为同一个进程,除了进程名一样外,组件所在应用的userId也要一样才行。应用的userId在”AndroidManifest.xml“中结点”manifest“下设置”android:sharedUserId“属性,默认值通常也是包名(为什么我们不能同时安装两个同包名的apk,应该也好解释了)。
    回到我们的疑问。结论是在默认情况下,调用其它应用Activity时,会新建被调用应用的进程;我们可以配置调用与被调用应用相关组件的”android:sharedUserId“、”android:process“属性,达到被调用Activity运行在调用者的进程之中,即共享一个进程。
    总结一下,把握几点:
    1.进程全名、userId都相同的进程为同一进程。
    2.同一应用能存在多个进程,不同应用可以共享一个进程。
    3.手工设置相关参数,能达到不同应用的组件同进程。
   
    Task与Activity关系
    Task就是一个栈,符合先进后出的逻辑,里面放的就是Activity实例。关于对Task的理解,很多人都讲得很清楚了,这里只讲讲与主题相关的。
    首先要明白几点:
    1.Task与应用即apk的关系是多对一的关系,即一个Task只属于一个应用,一个应用中可能包含多个Task。
    2.Task与进程没有多大关系,即同一个Task中可能放着属于多个进程的Activity。
    3.Task虽然属于某个应用,但是Task中可以放其它应用的Activity实例。

    在默认情况下,打开另一个应用的Activity时,虽然又创建了新的进程,但是不会创建另一个应用的Task(记住是默认的情况),被调用的Activity会直接放入调用应用的Task中。所以打开另一个应用的Activity后,我们再点击返回键时,会回到前一个Activity,完全感觉不到是两个应用,与一个应用的操作感受是一样的。
    既然有默认情况,那肯定有自定义情况,就是说我们能通过配置或指定相关的参数,来改变默认的系统行为。也就是什么情况下,在调用其它应用的Activity时,系统会创建新的Task呢?有几个因素:
    1.被调用Activity的launchMode参数被配置成"singleInstance"。这个很好理解,就算是同一应用调用都会新建Task,何况不同应用。
    2.调用Activity时,指定Intent的Flag参数为"Intent.FLAG_ACTIVITY_NEW_TASK"时,且被调用应用本身事先没有被已经打开了。(暂假定被调用应用的所有Activity都在同一个Task中)

    实际情况是这块还能细分,会受其它几个参数的影响(比如"taskAffinity"),但是了解到这一层,也算知道八层了。

   
    Application实例的创建
    这个知识点非常重要,没有搞懂,会影响到我们程序的健壮性。因为我们写应用时,常常会自定义Application,在里面写一些逻辑,如果没有搞懂,写出的代码可能会在一些特殊情况下,出现bug,非常典型的就是调用百度定位,当然这个话题与跨应用调用没有直接关系了。还是回到主题,来讨论。
    如果我们自定义了Application,即继承系统的“Application”类,同时在“AndroidManifest.xml”配置application结点的“android:name”属性为我们自定义的Application子类名称,则应用打开时,会创建我们自定义的Application对象,否则系统会创建默认的Application对象。
    不管是自定义的还是默认的,其创建时机都是一样的。先明白几点:
    1.Application对象与进程的关系。
      Application对象与进程是多对一的关系,即Application对象肯定属于某个进程,同时一个进程可能包含多个Application对象。
    2.Application对象与Activity的关系
      只要应用中的某个组件(当然包括Activity)启动了,Application对象会先被创建或者已存在,不管Activity对象是否运行在调用它的应用进程中。

    通过上面两点,来分析Application对象创建时机:
    1.当被调用Activity所属进程不存在时。
    2.当被调用Activity所属进程已存在,但被调用Activity所属应用的Application对象没创建,而且不在被调用Activity所在进程中时。
    关于第2点,可以去验证:配置调用应用的Activity与被调用应用的的Activity所属进程一样(记得配置应用的userId一样),打开调用应用的Activity后,会发现调用应用的Application会被创建,此时调用被调用应用的Activity,会发现虽然没有再创建进程,但是被调用应用的Application实例会被创建,且运行于同一进程中。

     上面有些机制就是在同一应用中调用Activity也是值得学习的。
     进程、Task、Application的新建或是复用我们可以进行控制,Android提供这个机制,就是要达到灵活并为开发人员所用,开发出适应性强应用的目的。当然更深层次的原理,还需要不断探索。
   
   
分享到:
评论

相关推荐

    android开发——简易计算器的设计报告.doc

    二、实训任务 1、Activity的相关知识 简单理解Activity 代表一个用户所能看到的屏幕,Activity 主要是处理一个应用的整体性工作。Activity是最基本的Android 应用程序组件,应用程序中,一个活动通常就是一个单独的...

    《深入理解Android》卷Ⅱ

    第6章 深入理解ActivityManagerService 6.1 概述 6.2 初识ActivityManagerService 6.2.1 ActivityManagerService的main函数分析 6.2.2 AMS的 setSystemProcess分析 6.2.3 AMS的 installSystemProviders函数...

    Android屏幕大小相关技巧应用指南.docx

    Android应用程序中屏幕大小的设置大家应该都比较清楚,...如何取得屏幕的方向:默认情况下,当屏幕方面切换时,activity的onCreate()方法会被重新调用,所以可以在其中通过以下代码来读取屏的方向:viewplaincopytocl

    OPhone应用开发权威指南(黄晓庆)

    8.3.1 跨进程调用 345 8.3.2 创建AIDL接口文件 346 8.3.3 实现AIDL接口 347 8.3.4 绑定Service 351 8.3.5 调用IPC方法 352 8.4 小结 353 第9章 访问网络数据和服务 354 9.1 HTTP协议简介 354 9.1.1 HTTP协议的主要...

    AndroidIntent机制实例详解(Activity篇)

    Android中提供了Intent机制来协助应用间的交互与通讯,或者采用更准确的说法 ...是一个不太容易理解的抽象概念,因为它与我们平常使用的简单函数/方法调用,或者上节中提到的通过库调用接口的方式不太一

    android实习报告(1).doc

    实习目的: 生产实习是计算机科学与技术专业重要的实践性教学活动,其目的是使学生们进一步 加深对所学知识的理解,理论联系实际,巩固所学有关计算机基础理论知识和基本技能 ,学习有关计算机最新技术方面的应用,...

    疯狂Android讲义源码

     13.5.3 使用Android应用调用  Web Service 512  13.6 本章小结 524  第14章 管理Android手机桌面 525  14.1 管理手机桌面 526  14.1.1 删除桌面组件 526  14.1.2 添加桌面组件 526  14.2 改变手机壁纸 527 ...

    疯狂Android讲义.part2

    13.5.3 使用Android应用调用 Web Service 512 13.6 本章小结 524 第14章 管理Android手机桌面 525 14.1 管理手机桌面 526 14.1.1 删除桌面组件 526 14.1.2 添加桌面组件 526 14.2 改变手机壁纸 527 14.2.1 开发实时...

    疯狂Android讲义.part1

    13.5.3 使用Android应用调用 Web Service 512 13.6 本章小结 524 第14章 管理Android手机桌面 525 14.1 管理手机桌面 526 14.1.1 删除桌面组件 526 14.1.2 添加桌面组件 526 14.2 改变手机壁纸 527 14.2.1 开发实时...

    谈谈Android里的Context的使用

    为了让大家更容易理解,写了一个简单的Demo.步骤如下: 第1步:新建一个Android工程ApplicationDemo,目录结构如下: 第2步:新建一个工具类ToolsUtil.java,代码如下 package com.tutor.application; import ...

    新版Android开发教程.rar

    � 由于采用了 Java 作为应用开发语言,目前可用的传统第三方应用还很少,但由于 Android 是一款完全 开 源的移动计算平台,相信第三方应用会很快的丰富起来。 � Google 提供了一套 Java 核心包 (J2SE 5,J2SE 6) 的...

    深入理解Android:卷I--详细书签版

     邓凡平,资深Android开发工程师,热衷于Android源代码的研究,对Android的架构设计和实现原理有非常深刻的认识和理解,应用开发经验也十分丰富。目前就职于国内一家领先的 Android企业,负责Framework的开发和...

    Adroid UI 界面绘制原理分析

    Android UI 界面绘制原理分析: 渲染流程:当用户与 Android 设备进行交互时,系统需要不断地将...在 Activity 的生命周期方法(如 onCreate()、onStart() 和 onResume())被调用之前,attach() 方法会先被执行,这

    Android的设计与实现(卷1)

    android的设计与实现:卷i》是android应用开发工程师和android系统工程师进阶修炼的...activity manager篇(第10~12章)深入阐述了activitymanagerservice的运行机制、应用程序和进程的启动流程,以及进程管理机制。

    Activiti6.0.0最新源码

    Form引擎可以通过Activiti6 UI界面进行配置,通俗一点的理解就是Activiti6将Form表单独立出来了。Form表单信息可以以JSON格式进行定义和使用。Activiti6 UI 默认包括新的规则引擎和表单引擎。 新增ad-hoc子流程。...

    Android四大组件知识点总结

    生命周期是指组件的实例对象从创建到销毁可能会被系统调用的一些方法,每个方法的调用都有特定的条件,可以根据需要重写生命周期方法来达到在某些特定时刻执行特定任务的目的。生命周期方法不建议自行调用,应由系统...

    Android实例代码

    10.2、跨进程调用Service(AIDL服务):创建AIDL文件; 将接口暴露给客户端; 客户端访问AIDLService; 10.3、电话管理器:TelephoneManager; 10.4、短信管理器:SmsManager; 10.5、音频管理器:AudioManager; 10.6...

Global site tag (gtag.js) - Google Analytics