zoukankan      html  css  js  c++  java
  • Android用shareUserID实现多个Activity显示在同一界面

    近来整理文档,发现两年前研究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方式。
  • 相关阅读:
    94. Binary Tree Inorder Traversal
    101. Symmetric Tree
    38. Count and Say
    28. Implement strStr()
    实训团队心得(1)
    探索性测试入门
    LC.278. First Bad Version
    Search in Unknown Sized Sorted Array
    LC.88. Merge Sorted Array
    LC.283.Move Zeroes
  • 原文地址:https://www.cnblogs.com/astate/p/3254283.html
Copyright © 2011-2022 走看看