一个android 新建Activity,并赋复杂实参的案例。

一、背景

在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的待填充view
        View_A.setData(data);//还可以方便的设置参数,
        activityContainer.setContentView(View_A);
    }
});
至此,意图被实现。




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值