主要内容:
不使用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
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:onClick="loadActivity"
android:text="开始加载" />
</RelativeLayout>
-->2: second_layout.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text="单击我试试" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="这里是第二个Activity, \n并且是没有在 Manifest.xml 声明的" />
</RelativeLayout>
补充阅读:http://blog.csdn.net/singwhatiwanna/article/details/22597587
源代码下载: http://download.csdn.net/detail/angcyo/8770121
至此: 文章就结束了,如有疑问: QQ群:274306954 欢迎您的加入.