近来整理文档,发现两年前研究Android多个Activity叠加显示的方案。时光荏苒,一去不回。

虽然后来没有用上,但还是整理如下,Android版本还是2.2的:

ActivityGroup描画方式的研究结果如下:

  1. 可以实现同一进程内的Activity叠加
  2. 通过设置两个Android App 的sharedUserID,可以使这两个App运行在同一进程上
  3. 通过Message来实现进程内App的交互

结论:该方案可以满足多Activity叠加显示的需求。

ActivityGroup中启动不同App的Activity

LocalActivityManager am = getLocalActivityManager();

FrameLayout layout = (FrameLayout) findViewById(R.layout.activity_layout);

//    Start MySys Activity

Intent intent3 = new Intent();

intent3.setClassName("android.My.sys", "android.My.ui.mainmap.MainMapActivity");

Window window3 = am.startActivity("Sample3_UniqueString", intent3);

View view3 = window3.getDecorView();

layout.addView(view3);

//    Start User Activity

Intent intent = new Intent(this, Sample1Activity.class);

Window window = am.startActivity("Sample1_UniqueString", intent);

View view = window.getDecorView();

layout.addView(view);

在AndroidManifest.xml中设置相同的shareUserID,使两个App共享同一Process

AndroidMySys.apk

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

package="android.My.sys"

android:versionCode="1"

android:versionName="1.0"

android:sharedUserId="My.sys">

ActivityGroupActivity.apk

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

package="org.jpn.techbooster.sample.activityGroupActivity"

android:versionCode="1"

android:versionName="1.0"

android:sharedUserId="My.sys" >

两个App如果用相同的数字签名,则会共用同一个Linux user ID.

相同进程中不同App之间的交互方案1:

通过Java Reflect 机制实现User App对 My App 方法的调用。

示例:获取My App Activity的 handler

My App : MainMapActivity.java

public class MainMapActivity extends Activity

{

public static Handler m_handler = null;

public Handler GetHandler()

{

return m_handler;

}

}

User App: ActivityGroupActivity.java

//    get My activity context

LocalActivityManager am = getLocalActivityManager();

Activity activityMainmap = am.getActivity("Sample3_UniqueString");

//    invoke MainMapActivity.GetHandler()

Class clazz = activityMainmap.getClass();

m_handler = (Handler)clazz.getMethod("GetHandler").invoke(activityMainmap);

相同进程中不同App之间的交互方案2:

通过Message实现交互, 该方案的先决条件是, 先用Reflect方式获取My App Activity的handler.

My App : MainMapActivity.java

m_Handler = new Handler()

{

public void handleMessage(Message msg)

{

switch (msg.what)

{

//    handle message

case SHOW_MSG:…

User App: Sample1Activity.java

// set data

Bundle data = new Bundle();

data.putString("ok", "1, 2");

// send message

Message msg = new Message();

msg.setData(data);

msg.what = SHOW_MSG;

m_handler.sendMessage(msg); //get m_handler by reflect first

相同进程中不同App之间的交互方案比较:

方案

优点

缺点

1. Java Reflect

使用灵活,功能强大,可以直接调用App的所有public方法。

App之间耦合性高。

2. Message

App之间耦合性低。

必须先获取其他App的handler

综合以上两种方案:

  1. Java Reflect仅用于获取 App的handler,不作其他用途。
  2. App交互使用Message方式。

Android用shareUserID实现多个Activity显示在同一界面的更多相关文章

  1. Android基础整理之四大组件Activity

    最近准备系统的重新整理复习一下Android的各方面的知识,本着知识分享的原则,我就把梳理过程中一些东西给记录下来,权当一个学习笔记吧. 下面步入正题..... 什么是Activity Activit ...

  2. Android开发百度地图(一)--显示基本地图

    最近由于比赛的需要,自己学习了一下百度地图的开发.希望以下的内容能够对大家有用. 一.开发前的准备工作: 1.注册百度账号,并登录.(有百度账号的话直接登录) 2.申请Key,地址:http://de ...

  3. Android从服务端获取json解析显示在客户端上面

    Android从服务端获取json解析显示在客户端上面 百度经验:jingyan.baidu.com 首先说一下Json数据的最基本的特点,Json数据是一系列的键值对的集合,和XML数据来比,Jso ...

  4. 设置Activity显示和关闭时的动画效果

    设置Activity显示和关闭时的动画效果 通过overridePendingTransition方法可以设置Activity显示和关闭的动画效果.首先需要在res/anim目录中建立相应的动画资源文 ...

  5. Android窗口管理服务WindowManagerService切换Activity窗口(App Transition)的过程分析

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/8596449 在Android系统中,同一时刻只 ...

  6. Java乔晓松-android中调用系统拍照功能并显示拍照的图片

    android中调用系统拍照功能并显示拍照的图片 如果你是拍照完,利用onActivityResult获取data数据,把data数据转换成Bitmap数据,这样获取到的图片,是拍照的照片的缩略图 代 ...

  7. Android学习总结(一)——Activity的基本概念与Activity的生命周期

    一.Activity的基本概念 Activity是Android的四大组件之一,它是一种可以包含用户界面的组件,主要用于和用户进行交互,比如打电话,照相,发送邮件,或者显示一个地图!Activity用 ...

  8. Android为TV端助力 自定义activity

    今天公司有个需要需要自动弹出界面,而dialog又不符合要求,所以自定义的一个activity的样式 首先在androidmainfest.xml上注册你的activity <activity ...

  9. 安卓入门 使用android创建一个项目 从启动activity中响应按钮事件 启动另一个activity 并传递参数

    启动android studio创建一个新项目 public void sendMessage(View view){ Intent intent=new Intent(this,DispalyMes ...

随机推荐

  1. C++中对Mysql的操作函数可以参考以下blog中的内容

    http://www.cnblogs.com/lovebread/archive/2009/11/24/1609936.html

  2. 树行控件TreeView 在WinForm下 怎么实现重命名功能

    public Form1() {     InitializeComponent();     this.Load+=new EventHandler(Form1_Load);     treeVie ...

  3. Android硬件入门-照相机

    学习Android不能不学习照相机,现在各种美容相机,微信朋友圈发图,现在升级之后直接下拉就可以照相了,各种艳照的的源头也是照相机,扯远了,有点邪恶了,还是简单学习一下Android中照相机的使用,A ...

  4. 同一页面的两个Iframe,其中一个iframe获取另一个iframe内的iframe中的元素值

    公共父页面(主页面): <%@ page language="java" import="java.util.*" pageEncoding=" ...

  5. JS操作JSON常用方法

    一.JSON字符串的替换 工作经常遇到这样的字符串,如下: 需要经过替换后,才能从字符串转化成JSON对象.这里我们需要用JS实现replaceAll的功能, 将所有的 ' \\" ' 替换 ...

  6. window.open()页面之间函数传值

    项目中遇到的问题,使用window.open()开一个页面之后,cookie会消失,所以无法一键切肤不管作用,解决方案如下: window.open()总结: window.open("sU ...

  7. 一键切换皮肤的解决思想及iframe嵌套时寻找下级iframe的方法

    项目中有个一键切换皮肤的功能,感觉还不错,记录下,就是各颜色样式设置起来太复杂了,不知道有没有更简便的方法: 1.切换皮肤结构层 <li title="<s:text name= ...

  8. Windows 8.1 64位版本安装.Net Framework3.5

    最近刚把个人电脑切换成了Win 8.1 64位版本,但在使用某些Ms的某此产品时会提示没有安装.Net Framework3.5,但按照他的提示需要在线安装而且速度很慢,因为之前搞过WinServer ...

  9. ios之开发者须知常见简写英文代表的含义

    <span style="white-space:pre"> </span> //NS基本 //MK地图 //CG图形绘制 //AV视音频 //UI视图 / ...

  10. 【nodejs】使用response输出中文但页面中文乱码的处置

    两点要确认: 1.head里有<meta charset="utf-8"/> 2.js文件编码为utf-8格式. 第二点往往容易被忽略,所以出现乱码. 附上代码: 'u ...