Android跨应用启动实例详解

  

<强> Android跨应用启动

  

<强>前言:

  

相信大家,很多时候都是在自己的应用中,启动自己写的活动,服务,BroadcastReceiver, contentProvider。换句话说,这些都只是 *单个应用中组件间* 的启动。而我们下面要谈论的是<强>两个应用间组件强劲的启动。即——<强>使用隐式意图方式启动应用B的某个组件。

  

<强>一、在开始之前,先来梳理一下跨应用启动的2种方式:

  

<强>第一种:在活动中,启动另一个应用程序的组件。

  

 Android跨应用启动实例详解

  

<强>第二种:在服务中,启动另一个应用程序的组件。

  

 Android跨应用启动实例详解

  

从所周知,Android中有四大组件,那么为什么小编,只介绍活动和服务中启动另一个应用的四大组件?
  

  

其实,BroadcastReceiver组件也是可以启动4大组件的。这是因为onReceive()方法中会要求传入上下文实例,有了上下文实例,就能使用上下文的方法,启动其他组件。
  

  

至于contentProvider,我想大家还没见过,这娃自动去干过事情吧,都是被动的调用。
  

  

所以在写代码的时候,我们经常会在活动或者服务中去启动一个组件,BroadcastReceiver很少,而contentProvider更是没见过。
  

  

另外需要跟大家说一下,上下文类是一个抽象类,传入的上下文实例是由其子类来实现的,这种——用父类声明变量,由子类来实现的思维方式,在Java中是很常见的。特别是接口和抽象类,经常用到这种方式。对于小编这种由C转Java的人来说,真是一大坑啊。
  

  

为什么活动和服务都可以直接使用图中的四个方法呢,这是因为活动和服务都是继承自ContextWrapper,所以子类拥有父类的方法.BroadcastReceiver和contentProvider则不是,具体大家可以看官方API。
  

  

<强>二、跨应用启动的实战

  

* *下面让我们正式进入今天的主题:跨应用启动实战* *

  

1: AppA的活动中,启动AppB

的活动   

Android提供了在一个应用中启动另一个应用程序中的活动的能力,这使我们的程序很容易就可以调用其他程序的功能,从而就丰富了我们应用的功能,比如在微信中发送一个位置信息,对方可以点击这个位置信息启动腾讯地图并导航。这个场景在现实中作用很大,尤其是朋友在陌生的环境找不到对方时,这个功能简直就是救星。

  

本来想把本文的名字叫启动另一个进程中活动的,觉得这样才有逼格。因为每个应用都会运行在自己的虚拟机中,每个虚拟机跑在一个进程中。但仔细一想,能够称为一个进程,前提是这个应用必须要运行起来才行。而Android提供的能力,是不需要另一个应用程序启动就可以将其特定的活动启动起来的。

  
  

也就是说B应用是处理未启动的状态,也就是还没有成为系统的一个进程,那么当使用一个启动B应用的某个组件时,请问,B应用是否成为系统的进程?答案是是的。怎么看呢,可以从Android工作室的Android设备监视器中结合虚拟机看。

     

 Android跨应用启动实例详解

  

我们有至少两种办法达到启动另一个应用程序中的活动。

  

  

相信这种方式,大家都不会陌生。这里就不进行过多的解析。这里只贴一下AppB的清单(文件清单):

  

 Android跨应用启动实例详解

  

从文件清单中,我们可以看的到,appB中有两个活动。其中SecondActivity就是要被appA启动的活动。
  那么我们只要在appA的任意一个组件(活动或服务),做如下的调用:

        目的意图=new意图(“android.intent.action.SecondActivity”);   startActivity(意图);      

就可以成功在一个应用中启动B应用的组件。另外还要跟大家说一点,SecondActivity的类别一定要在文件清单中添加上,否则启动的时候会报错的。

  

 Android跨应用启动实例详解

        不知道大家有没有思考过这三个事情:   1,当应用启动B应用的SecondActivity,那么B应用的MainActivity会不会被启动呢?正常情况下,我们点击应用B,进到的是MainActivity这个活动,那么现在我们是通过跨应用启动,会不会要经过B的MainActivity呢?答案是不会。      2、当我们在SecondActivity中点击回回退键时,回到的是一个应用的mainActivity界面,这里时候大家有没有想过。   SecondActivity和光电的mainActivity是不是同处于一个栈中呢?这时候就要去打印栈的身份证了。      3、由上面的两件事,不知道大家想起:Android对于活动的管理,也就是框架层的ActivityManager。也就是说,你手机上的N多应用,当你打开某一个应用是,这个应用的活动都是由ActivityManager这娃来创建和管理的。应用本身并没有创建活动的能力。当然这其中又涉及到了内部的通讯。这里暂时不讲。      

Android跨应用启动实例详解