Android四大组件之Activity

Activity组件
    activity的生命周期,可以分为三种:完整生命周期,可视生命周期,前台生命周期
    (1):完成生命周期
    oncreate--onstart(可视了)--onresume(获取焦点)--onpause(失去焦点)--onstop(不可视)--ondestory
              可视生命周期                                                结束
                                前台生命周期       结束
                    
    (2):activity界面之间的跳转
        1,创建MyActivity继承activity(创建出我们要的界面),然后在清单文件中配置我们的信息        
            <activity
                android:name="com.itheima.mutliuiapp.MyActivity"     (包内名)
                android:label="02界面" >                            (app名字)
            </activity>
        2,在布局文件中创建MyActivity的xml文件,然后在MyActivity中oncreate()--
            --再setContentView(加载创建的布局文件);
        3,在mainactivity中创建意图,并且设置需要跳转到的界面
        Intent intent = new Intent(this,MyActivity.class);   (相当于开启了一个新的界面)
        
        
         一个应用程序可以有多个界面,在桌面上可以有多个快捷图标
            在清单文件的activity的意图过滤器中的
            <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
                    <category android:name="android.intent.category.LAUNCHER" />  (可以产生快捷方式,不想要可以直接删除即可)
            </intent-filter>
            
    (3)activity界面跳转时,数据传递
        开启一个界面startActivity(intent)
            a,在传递数据界面,    
                intent.putExtra(key,value);  //在意图对象里面携带要传递的数据
                    value:满足基本的八大类型,但是不能直接传入对象,不过可以实现两个接口中的一个就可以
                    {实现Serializable接口}
                    {getParcelableExtra  安卓特有的序列化对象}
                    
                最后在开启startActivity(intent),
            b,在获取数据界面
                1,先获取开启我们这个界面的意图对象
                    Intent intent = getIntent();  
                2,然后在获取意图对象里面的数据
                    intent.getXXXExtra();    //获取相对应的数据
                
            我们把需要传递的数据封装到intent对象里面,然后再去startActivity(intent)
            传入我们的意图对象,最后在新开起的界面接受我们的intent,在获取相应的数据
            这个开启方式,相当于重新开了界面.
        
    (4)开启新的界面获取返回值
        a,在MainActivity中,开启方式我们调用
            //开启新的界面并且获取返回值    (请求码)
            startActivityForResult(intent,requestCode)
            
        b,在B的activity中调用setResult(resultCode,data)方法
            //这里是一个空意图
            Intent data = new Intent();
            //设置结果数据放到意图里面
            data.putExtra(key,value);
            //把当前界面的数据返回给,开启我的界面
            setResult(resultCode,data);
            //再关闭当前界面(提高用户体验)
            finish();
            
            
            注意:
                当finish执行的时候,当前界面关闭,此时结果数据会传给我们的开启者,
                通过onActivityResult()方法

        
        c,最后在调用者界面重写onActivityResult(int requestCode,int resultCode,Intent data)
            这个方法的意识是,当我们开启一个新的activity,并且这个activity已经退出了
            这个activity会把结果数据传给我们,并且调用onActivityResult()方法
            
            
            下面是相关代码方便理解:
            ##开启新界面,获取返回值
            String message = smsMessages[position];
                            //把当前界面的数据,返回给开启我的界面.
                            Intent data = new Intent();
                            data.putExtra("message", message);
                                           //告诉上一个界面准备完毕
                            setResult(0, data);
                            //把当前界面关闭
                            finish();

            在原界面重写这样一个方法,当新界面被关闭,这个方法会被执行
            @Override
                protected void onActivityResult(int requestCode, int resultCode, Intent data) {
                    if (requestCode == 1) {
                        System.out.println("我们开启的新的选择短信的界面被关闭了,结果数据返回到这里");
                        if (data != null) {
                            String message = data.getStringExtra("message");
                            et_message.setText(message);
                        }
                    }else if(requestCode == 2) {
                        System.out.println("我们开启的新的选择联系人界面被关闭了,结果数据返回到这里");
                    }
                    super.onActivityResult(requestCode, resultCode, data);

    (5)两种意图
        ##显式意图&隐式意图
            * 显式意图,必须要指定被开启的Activity的类名或者路径名.
            > 激活自己应用程序内部的组件,推荐使用显式意图,效率高(直接指定了省去遍历步骤)
                    public void open01(View view) {
                        Intent intent = new Intent(this,MainActivity.class);
                        startActivity(intent);        
                    }

            * 隐式意图,只需要指定action(动作) 和 data (数据)就可以了. category
            > 激活别的应用程序的界面,或者是自己应用程序的某个界面需要暴露给别的应用程序调用.效率低,系统需要遍历全部的清单文件来确定.
            >在清单文件中,在这个activity中的文件过滤器里面定义action(包名+要做得什么事情)和category(手机应用一般指定默认的,手表,tv,汽车不是)
            >
                    Intent intent = new Intent();
                    intent.setAction("android.intent.action.MAIN");
                    intent.addCategory("android.intent.category.LAUNCHER");
                    startActivity(intent);
                    
    (5)##Activity的启动模式(和任务栈密切相关)
        * standard : 标准的启动模式
        > 默认应用场景

        * singleTop : 单一顶部模式  配置信息 launchMode属性 = singletop
        > 如果Activity已经被开启,并且处于任务栈的栈顶,就不会创建新的Activity,而是复用这个已经开启的Activity. 为了防止出现一些奇怪的用户体验.推荐使用单一顶部模式.整个任务栈可以有多个实例存在.

        >应用场景: 短信发送界面.

        * singletask: 单一任务栈
        >在整个任务栈里面只允许有一个当前Activity的实例存在.
        如果要开启的Activity在任务栈中已经存在,直接复用这个已经存在的Activity,并且把这个Activity上面的所有的其他Activity给清空.

        >应用场景: 如果一个Activity非常消耗内存和cpu资源,建议把这个Activity做成singletask的模式.浏览器的browserActivity


        实际开发中一般主页(都使用的)如果没有使用singletask模式,浪费资源

        * singleinstance :单一实例. (一个应用程序一般有一个任务栈,但是也有多个任务栈,如singleinstance)
        > 整个手机操作系统只有一个实例存在,并且是运行在自己单独的任务栈里面.
        > 相当于java里面的单例模式,我们查看iPhone的源码,可以知道,底层是scoket以流的形式和基站进行传输,当让通话只能一个实例使用设置成singleinstance
        > 通话界面的Activity
                    
                    
                    
                   

你可能感兴趣的:(Activity)