Android-->动态加载Activity (不使用Intent,启动Activity)

主要内容:
不使用Intent,启动Activity:通过宿主Activity,接管需要启动的Activity生命周期,达到目的;
文章中,可能会使用到Java反射机制;

主要代码
1:主程序
MainActivity extends Activity
通过主程序,启动宿主Activity

public void loadActivity(View view) {
    Intent intent = new Intent(this, ProxyActivity.class);
    startActivity(intent);
}

2:宿主Activity,启动需要动态加载的Activity,接管他的生命周期

public class ProxyActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        try {
            Class localClass = SecondActivity.class; // 需要启动的类
            Constructor localConstructor = localClass
                    .getConstructor(new Class[] {}); // 获取构造方法
            Object instance = localConstructor.newInstance(new Object[] {}); // 创建一个实例

            Method setProxy = localClass.getMethod("setProxy",
                    new Class[] { Activity.class }); // 最重要的方法;需要在调用onCreate方法之前调用;设置代理Activity
            setProxy.setAccessible(true); // 设置方法访问权限
            setProxy.invoke(instance, new Object[] { this }); // 调用方法

            Method onCreate = localClass.getDeclaredMethod("onCreate",
                    new Class[] { Bundle.class }); // 通过反射,得到onCreate方法
            onCreate.setAccessible(true); // 设置方法访问权限
            onCreate.invoke(instance, new Object[] { new Bundle() }); // 调用onCreate方法
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

3:需要动态加载的Activity, 必须继承BaseActivity

public class BaseActivity extends Activity {
    protected Activity mProxyActivity;

    public void setProxy(Activity proxyActivity) { // 最重要的方法,因为要接管生命周期
        mProxyActivity = proxyActivity;
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // super.onCreate(savedInstanceState);//注意:必须重写此方法,并且注释这条语句
    }

    @Override
    public void setContentView(int layoutResID) { // 最重要的方法, 用于显示界面;
        if (mProxyActivity != null && mProxyActivity instanceof Activity) {
            mProxyActivity.setContentView(layoutResID);

            mProxyActivity.findViewById(R.id.button).setOnClickListener(
                    new OnClickListener() {

                        @Override
                        public void onClick(View v) {
                            Toast.makeText(mProxyActivity, "Hello!",
                                    Toast.LENGTH_LONG).show();
                        }
                    });
        }
    }

}

4:目标Activity,代码很简单,就一行

public class SecondActivity extends BaseActivity {
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        setContentView(R.layout.second_layout);
    }

}

2个布局文件:
-->1: activity_main.xml



    

-->2: second_layout.xml



    

补充阅读:http://blog.csdn.net/singwhatiwanna/article/details/22597587

源代码下载: http://download.csdn.net/detail/angcyo/8770121

至此: 文章就结束了,如有疑问: QQ群:274306954 欢迎您的加入.

你可能感兴趣的:(Android-->动态加载Activity (不使用Intent,启动Activity))