activity启动模式探究

来源:互联网 发布:多个数最大公约数算法 编辑:程序博客网 时间:2024/05/21 21:39

背景:

      今天做项目时,从网上找了一个日历的控件(和携程的日历类似),我想做成从ActivityA中点击一个按钮(time),跳转到日历界面Activity B,选择日历上时间,点击确定后调回到A并且在time上显示选择的时间。这个是一个很容易实现的功能,不过我的Activity A中有两个时间按钮,一个对应开始时间(time_start),一个对应结束时间(time_over)。我点击time_start后跳转到B,选择开始时间后,点击确定按钮带着选择的数据调回A,并在time_start上显示开始时间,紧接着点击结束时间,跳转到B,选择时间后,点击确定按钮带着数据回到A,并在end_start上显示结束时间。这个时候问题出来了,之前选择的time_start上的显示的时间变成了初始值。多次尝试后都是这样的结果,开始寻找原因了。

分析过程:

     起初我想到了Activity的生命周期,是不是因为A-->B过程中A被destroy了?然后我在A的三个生命周期方法中添加了输出语句:onCreate(Bundle ...),onResume(),onDestroy()。跑了下程序,结果从A-->B过程中没有过调用onDestroy(),而从B-->A中却调用了onCreate(),onResume()。我脑海中模糊的记忆认为,这个A没被销毁,B调回A后B被销毁,原先的A应该重新被调用,事实不是这样,这就牵扯到Activity的启动模式了。


解决:

     百度下android下启动模式,才知道系统默认启动模式是standard,即新启动个Activity,系统会把这个Activity放到栈顶,不管栈中是否有这个Activity(这就意味上面B-->A的A和之前A-->B的A在栈中对用不同的内存空间,不同对象),这时候按下返回键就会出现多个A(如果B没被finish就会出现A-B-A-B的现象)。android启动模式中有个类型singleTask,设置这种模式的Activity在栈中只会存在一个。比如A的启动模式是singleTask,经过A-->B,B再回到A,此时的

A没有被创建,还是原先的A,不过A前面的B直接被销毁了,这就是singleTask的霸道之处。

      这个时候问题其实还没解决,我从B传回的参数(time)却为null,我在onResume()中写了Intent intent=getIntent(),String time=intent.getStringExtra("time");,time为Null,为什么了,这就是另外一个知识点了,用singleTask启动模式的Activity会调用一个方法onNewIntent(Intent intent){};通过这个方法你可以得到你传回的参数。

   public void onNewIntent(Intent intent){
    super.onNewIntent(intent);
    setIntent(intent);
    InitArg();
    }
    
    public void InitArg(){
    Bundle bud=getIntent().getExtras();
    if(bud!=null){
    String type=bud.getString("type");
        String time=bud.getString("time");
        System.out.println(type+" +++++ "+time);
        if("startTime".equals(type)){
        start_time.setText(time);
        }else if("endTime".equals(type)){
        end_time.setText(time);
        }
    }
    }


还是要重点看看启动模式,今天学习了一个新的知识点哟。

0 0
原创粉丝点击