当前位置:编程学习 > wap >>

ActivityGroup 为什么不能启动一个其他进程的Activity

ActivityGroup 为什么不能启动一个其他进程的Activity

1. 代码如下:

public class ActivityGroupActivity extends ActivityGroup
{
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
LocalActivityManager am = getLocalActivityManager();
FrameLayout layout = (FrameLayout) findViewById(R.layout.activity_layout);

// 本地进程Activity
Intent intent2 = new Intent(this, Sample2Activity.class);
Window window2 = am.startActivity("Sample2_UniqueString", intent2);
View view2 = window2.getDecorView();
layout.addView(view2);


// 其他进程的Activity
Intent intent3 = new Intent();
intent3.setClassName("com.example.plasma", "com.example.plasma.Plasma");
Window window3 = am.startActivity("Sample3_UniqueString", intent3);
View view3 = window3.getDecorView();
layout.addView(view3);
}
}



2. 本地进程的Activity可以启动,但是其他进程的Activity不能启动,启动其他进程Activity的logcat如下

02-10 11:34:23.690: DEBUG/ActivityGroup(1625): onCreate
02-10 11:34:23.700: DEBUG/ActivityGroup(1625): 1111
02-10 11:34:23.710: DEBUG/AndroidRuntime(1625): Shutting down VM
02-10 11:34:23.710: WARN/dalvikvm(1625): threadid=3: thread exiting with uncaught exception (group=0x4001b160)
02-10 11:34:23.710: ERROR/AndroidRuntime(1625): Uncaught handler: thread main exiting due to uncaught exception
02-10 11:34:23.730: ERROR/AndroidRuntime(1625): java.lang.RuntimeException: Unable to start activity ComponentInfo
{org.jpn.techbooster.sample.activityGroupActivity/org.jpn.techbooster.sample.activityGroupActivity.ActivityGroupActivity}: java.lang.SecurityException: 
Requesting code from com.example.plasma (with uid 10053) to be run in process org.jpn.techbooster.sample.activityGroupActivity (with uid 10052)
02-10 11:34:23.730: ERROR/AndroidRuntime(1625):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2496)
02-10 11:34:23.730: ERROR/AndroidRuntime(1625):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2512)
02-10 11:34:23.730: ERROR/AndroidRuntime(1625):     at android.app.ActivityThread.access$2200(ActivityThread.java:119)
02-10 11:34:23.730: ERROR/AndroidRuntime(1625):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1863)
02-10 11:34:23.730: ERROR/AndroidRuntime(1625):     at android.os.Handler.dispatchMessage(Handler.java:99)
02-10 11:34:23.730: ERROR/AndroidRuntime(1625):     at android.os.Looper.loop(Looper.java:123)
02-10 11:34:23.730: ERROR/AndroidRuntime(1625):     at android.app.ActivityThread.main(ActivityThread.java:4363)
02-10 11:34:23.730: ERROR/AndroidRuntime(1625):     at java.lang.reflect.Method.invokeNative(Native Method)
02-10 11:34:23.730: ERROR/AndroidRuntime(1625):     at java.lang.reflect.Method.invoke(Method.java:521)
02-10 11:34:23.730: ERROR/AndroidRuntime(1625):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
02-10 11:34:23.730: ERROR/AndroidRuntime(1625):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
02-10 11:34:23.730: ERROR/AndroidRuntime(1625):     at dalvik.system.NativeStart.main(Native Method)
02-10 11:34:23.730: ERROR/AndroidRuntime(1625): Caused by: java.lang.SecurityException: Requesting code from com.example.plasma (with uid 10053) to be run in 

process org.jpn.techbooster.sample.activityGroupActivity (with uid 10052)
02-10 11:34:23.730: ERROR/AndroidRuntime(1625):     at android.app.ActivityThread.getPackageInfo(ActivityThread.java:2154)
02-10 11:34:23.730: ERROR/AndroidRuntime(1625):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2390)
02-10 11:34:23.730: ERROR/AndroidRuntime(1625):     at android.app.ActivityThread.startActivityNow(ActivityThread.java:2335)
02-10 11:34:23.730: ERROR/AndroidRuntime(1625):     at android.app.LocalActivityManager.moveToState(LocalActivityManager.java:127)
02-10 11:34:23.730: ERROR/AndroidRuntime(1625):     at android.app.LocalActivityManager.startActivity(LocalActivityManager.java:339)
02-10 11:34:23.730: ERROR/AndroidRuntime(1625):     at org.jpn.techbooster.sample.activityGroupActivity.ActivityGroupActivity.onCreate

(ActivityGroupActivity.java:54)
02-10 11:34:23.730: ERROR/AndroidRuntime(1625):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
02-10 11:34:23.730: ERROR/AndroidRuntime(1625):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2459)
02-10 11:34:23.730: ERROR/AndroidRuntime(1625):     ... 11 more

3. Trace ActivityGroup

通过调查ActivityGroup的实现,发现是通过LocalActivityManager来管理"embedded activities",而且SDK文档明确说明仅支持同一进程的activities 
LocalActivityManager Class Overview

Helper class for managing multiple running embedded activities in the same process. This class is not normally used directly, but rather created for you as 

part of the ActivityGroup implementation.

4. Trace LocalActivityManager 
继续调查LocalActivityManager 的实现,发现这个类不过是管理embedded activities的一些信息而已。数据结构如下

    // Internal token for an Activity being managed by LocalActivityManager.
    private static class LocalActivityRecord extends Binder {
        LocalActivityRecord(String _id, Intent _intent) {
            id = _id;
            intent = _intent;
        }

        final String id;                // Unique name of this record.
        Intent intent;                  // Which activity to run here.
        ActivityInfo activityInfo;      // Package manager info about activity.
        Activity activity;              // Currently instantiated activity.
        Window window;                  // Activity's top-level window.
        Bundle instanceState;           // Last retrieved freeze state.
        int curState = RESTORED;        // Current state the activity is in.
}


    /** id -> record of all known activities. */
    private final Map<String, LocalActivityRecord> mActivities
            = new HashMap<String, LocalActivityRecord>();
    /** array of all known activities for easy iterating. */
    private final ArrayList<LocalActivityRecord> mActivityArray
            = new ArrayList<LocalActivityRecord>();



5. 问题

(1) embedded activities和普通的activity有什么不同,为什么可以多个同时运行。一般来讲只有栈顶的activity才是运行状态,被压盖的都是paused或者stoped状态。
(2) 为什么ActivityGroup不支持不同进程的Activity,原因是什么。


恭请各位高人相助。谢谢!

--------------------编程问答-------------------- 自己顶!!!!! --------------------编程问答-------------------- 挂两天。顶两次。 --------------------编程问答-------------------- 02-10 11:34:23.730: ERROR/AndroidRuntime(1625): java.lang.RuntimeException: Unable to start activity ComponentInfo 
俺也遇到这个错了。楼主解决了没? --------------------编程问答-------------------- <manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.test"
      android:versionCode="1"
      android:sharedUserId="com.android.activitygrouptest"
      android:versionName="1.0">

设定sharedUserId一致就可以了,这样两个apk会加载到同一个process中运行,同时要把你要启动的activity launchemode 设定为singletop。

或许有其他方法,待续。 --------------------编程问答--------------------  在activityThread.java的代码里添加对安全忽略即可。
 r.packageInfo = getPackageInfo(aInfo.applicationInfo,
                        Context.CONTEXT_INCLUDE_CODE + Context.CONTEXT_IGNORE_SECURITY); --------------------编程问答-------------------- 希望对大家有帮助, 结帖。 --------------------编程问答-------------------- 请问,如果在Sample2Activity这个里面需要切换到其他的View 中,通过什么方式传递数据呢 --------------------编程问答-------------------- 解决了么  我现在遇见了你的第5个问题  --------------------编程问答-------------------- 正常是这样传递的
    Intent intent = new Intent();
    intent.setClass(getBaseContext(), myTest.class);   
    Bundle bundle = new Bundle();
    bundle.putString("TYPE", "TYPE123");
    intent.putExtras(bundle);
    startActivity(intent);
    //this.finish();
安全忽略有没有啥风险啊
补充:移动开发 ,  Android
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,