近来整理文档,发现两年前研究Android多个Activity叠加显示的方案。时光荏苒,一去不回。
虽然后来没有用上,但还是整理如下,Android版本还是2.2的:
ActivityGroup描画方式的研究结果如下:
可以实现同一进程内的Activity叠加
通过设置两个Android App 的sharedUserID,可以使这两个App运行在同一进程上
通过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
package=“android.My.sys”
android:versionCode=“1”
android:versionName=“1.0”
android:sharedUserId=“My.sys”>
ActivityGroupActivity.apk
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
综合以上两种方案:
Java Reflect仅用于获取 App的handler,不作其他用途。
App交互使用Message方式。