一、背景
在android中,Activity的创建推荐通过intent机制来实现,其过程可以看成高度封装的反射机制和Activity调度机制。因而用new 的方式实现一个Activity的思路被堵的厉害,这就给我们的程序设计惯有思维带来两个麻烦:
1、intent机制中,bundle可传递的都是基本值(string、boolen、int、float、contex)等,并不能传递复杂的实参(因为难以序列化)
2、而startActivity(intent)时,又不能获得新建Activity的Context,不利于设置与Context相关的属性。
二、案例:
在一个android应用中,意图定义一个通用的Activity:Activity_Container,用来展示不同的view。
三、案例待解决问题:
待解决问题:宿主Activity在startActivity时,并不能传递view。笨方法只能列出所有可能的view,根据bundle传递的参数枚举判断。能不能构建一个动态的体系?
四、案例基本结构:
宿主Activity:Activity_Main。
通用Activity容器:Activity_Container。
五、解决步骤:
1、定义一个自定义Application
public class MyApplication extends Application {
}
2、将MyApplication注册到Mainfests,就是给application指定name。定以后,所有的Activity都依赖于MyApplacation。
<application android:name=".MyApplication"//注意这里!!!!!!!!!! android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".Activity_Main" android:windowSoftInputMode="stateHidden|adjustResize"> <intent-filter> <action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity> <activity android:name=".ActivityContainer" android:windowSoftInputMode="stateHidden|adjustResize"> </activity> </application>3、在MyApplication 里添加一个属性 一个接口。属性为ActivityContainer实例,用来记录intent最新创建的ActivityContainer。接口是为了方便通知宿主Activity 一个新的ActivityContainer是否被创建。
public class MyApplication extends Application { //通用Activity容器 private ActivityContainer ActivityContainer; public ActivityContainer getActivityContainer(){return ActivityContainer;} public void setActivityContainer(ActivityContainer activityContainer) { ActivityContainer = activityContainer; getActivityContainerCreatInterface().OnActivityContainerCreat(activityContainer); //一旦设置则执行接口里的函数。 }//通用Activity容器创建接口 ActivityContainerCreatInterface ActivityContainerCreatInterface; public void setActivityContainerCreatInterface(ActivityContainerCreatInterface activityContainerCreatInterface) { ActivityContainerCreatInterface = activityContainerCreatInterface; } public ActivityContainerCreatInterface getActivityContainerCreatInterface() { return ActivityContainerCreatInterface; }//ActivityContainer创建接口类interface ActivityContainerCreatInterface { void OnActivityContainerCreat(ActivityContainer activityContainer); }}4、ActivityContainer在OnCreat()处,追加如下代码:public class ActivityContainer extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);((MyApplication)getApplication()).setActivityContainer(this);//此行为追加代码,一旦Creat,则告诉MyApplacation:我被创建啦,最新的实例是我。 } }5、在宿主Activity中,在需要打开Activity容器的地方写下如下代码:
Intent intent = new Intent(this,ActivityContainer.class); startActivity(intent); //用Intent打开一个新的ActivityContainer。一旦被创建,ActivityContainer会告诉MyApplacation他被创建了。这样我们就可以拿到新建的实例。((MyApplication) getApplication()).setActivityContainerCreatInterface(new MyApplication.ActivityContainerCreatInterface() { @Override public void OnActivityContainerCreat(ActivityContainer activityContainer) {View_A view_a = new View_A(activityContainer); //一个需要新Context的待填充viewView_A.setData(data);//还可以方便的设置参数,activityContainer.setContentView(View_A); } });至此,意图被实现。