四大组件之Activity

Activity

 

一 定义与创建

            定义:简单的说,一个Activity就是一个界面

        创建:定义类继承Activity,并在清单文件的Application节点下配置                    

 <activity
            android:name="com.example.application.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name="com.example.application.PlayGame"></activity>

             <intent-filter/>:在Launcher中显示的快捷方式(程序的入口)

                                一个应用程序对应一个快捷方式即自定义的标签中不配置也可以,程序的入口只有Main一个,在main的界面进行某些操作点击按钮或超链接来启动另外一个Activity

 

二 生命周期

     activity的三种运行状态:

                             运行:activity在最前端运行

                   停止:前端运行其他activity,另一个被完全挡住

                   暂停:前端运行其他activity,另一个部分可见(如弹出对话框)

     三种状态的切换所运行的方法:

                    Activity启动时:onCreate();-----activity的创建

                                              onStart();--------activity可见(能看见)

                                              onResume();---activity获取焦点

                    Activity退出时:onPause();------activity失去焦点

                                              onStop();--------activity不可见

                                              onDestroy();----activity销毁 

 

三 Activity的启动  

        启动Activity:创建意图对象Intent,直接调用startActivity()方法,intent可以启动指定的activity

        启动方式:

                       a显示意图(Explicit) ----应用程序内跳转,需要指定类名

	
		Intent intent=new Intent();//创建意图对象
		intent.setClass(this, MainActivity.class);//指定类名
		//intent.setClassName(this,"com.example.application.MainActivity");方法重载,作用同上
		//intent.setClassName("com.abcde.sqlite","com.abcde.sqlite.ui.RefreshActivity");启动其他程序的Activity(包名+全类名)
		startActivity(intent);//启动activity
		

                        <activity/>中的属性exported为true表示可以启动,若为false不可启动
               在Main<activity/>标签中配置了<intent-filter/>标签,exported默认为true(因为被默认为是入口,所以为true),也可以添加权限再进行调用; 其他若没有配置,则默认为false
                   

               b隐式意图(Implicit)---应用程序间跳转,不需指定类名(创建快捷方式需用隐式意图)

                              上网操作 :

		Intent intent=new Intent();
		intent.setAction(Intent.ACTION_VIEW);//设置动作
		intent.setData(Uri.parse("HTTP://www.baidu.com"));//设置数据
		startActivity(intent);//根据意图中的数据和动作匹配一个Activity
		

                               图片或视频:
                              将所要用的图片和视频烤到mnt的sdcard下,文件名不可有中文,否则无法导入
                    

		Intent intent=new Intent();
		intent.setAction(Intent.ACTION_VIEW);
		intent.setDataAndType(Uri.parse("file:///mnt/sdcard/a.jpg"),"image/*");//图片
		intent.setDataAndType(Uri.parse("file:///mnt/sdcrad/1.mp3"),"audio/*");//音乐
		intent.setDataAndType(Uri.parse("file:///mnt/sdcard/1.mp4"),"vedio/*");//视频
		startActivity(intent);
		

四 Activity之间的数据传递  

可传递的数据类型:

           基本数据类型,String,Bundle,Serializable,Parcelable---- 点击按钮或者链接通过intent带数据到另一个界面(intent中带有bundle,用来存储数据,类似Mapj集合)

案例:在MainActivity中发送数据,在OtherActivity中获取数据

           启动时传递数据:

                     1 在MainActivity中创建intent对象,利用intent对象通过putExtra()方法向intent中放数据,然后开启Activity;

                       若所放的参数为javabean(person类),则需要person类实现Serializable这个接口,这样就可以放入intent中。因为是一个应用程序,两个activity 之间的跳转,一个应用程序(一个进程)之内的对象传输数据是可以的,但是activity的跳转,有可能从一个程序跳到另一个程序,也许另一个程序都没有person类,两个应用程序之间是不可以传输对象的,应用程序之间传数据只能是字节数据,不能是对象,而实现序列化后,可以把对象转为字节数组这样就可以传输,所以说要传输自定义类对象,要实现Serializable接口;若传入的为集合,List<Person>集合默认实现了,但是必须保证集合中的元素也要实现

                     2 在OtherActivity中通过getIntent()方法获得intent,  通过intent的getStringExtra()或者getIntExtra()方法获得数据  

                        Parcelable类(后期绑定服务一定会用到,绑定服务会传参数,参数必须是Parcelable),Person类实现Parcelable这个接口,并添加两个未实现的方法 

public void writeToParcel(Parcel parcel,int flags){------定义怎么把该类对象写入Parcel
	parcel.writeString(name);
	parcel.writeInt(age);
				}

            关闭时返回数据:

                     如果希望新的Activity可以返回数据, 那么就需要使用startActivityForResult()方法来启动Activity在新的Activity中调用setReuslt()方法设置要返回的数据
                     finish()之后, 原Activity会自动调用onActivityResult(), 该方法的形参就是setReuslt()设置的数据

五 启动模式

                a.standard: 每次都启动一个新的--默认情况下是这种模式(先启动A,A在底层,A启动B(也可以启动自己),B启动C---C退出看见B,B退出看见A,A退出看见手机桌面)
             b.singleTop: 不能自己创建自己(假设先启动A,但是A不能自己创建自己,但可以启动B,B可以创建A同时也不能创建自己,B能启动C,同理,C只能创建A和B--不会连续出现两个)

             c.singleTask:启动谁就将谁上面的出栈(启动本身除外)(假设A在底层,B在中间,C在上面,若C要启动A,需将BC出栈;若C要启动B,需将自己出栈,但是C启动自己无效)      

             d.singleInstance:启动谁就将谁置顶,并不是重新创建(假设A启动B,B启动C,这时A在底层,B在中间,C在上面,C若启动B,则B会在挪到上面)


六 横竖屏切换

             a.默认情况下, 横竖屏切换时会摧毁Activity重构, 因为要进行屏幕适配.

              R文件下创建布局文件layout-port(竖屏,指定线性布局,垂直)和layout-land(横屏,指定线性布局,水平),横竖屏切换时控件会随之变化
              横竖屏切换和杀死重建文件都需要保存和还原数据:

                              onSaveInstanceState()在摧毁时自动执行保存数据---onPause()之后onStop()之前执行(两者之间)
                              onRestoreInstanceState()在恢复的时候自动执行还原数据---onStart()之后onResume()之前执行(两者之间)
              被杀死之后再启动才会恢复数据,数据是存在Bundle里的,Bundle是以文件形式存储的,程序再启动时会读取文件,以达到恢复数据的目的
              onSaveInstanceState()在Activity失去焦点时也会被调用, 如果Activity在后台被杀死了, 再次启动时会自动调用onRestoreInstanceState()

          b.如果不需要屏幕适配, 那么可以通过定义属性控制Activity不摧毁重构
                             android:configChanges="orientation|screenSize"     这种情况下不执行任何生命周期方法, 也不会改变布局

          c.固定Activity方向---屏幕不随手机转动而改变 
                            android:screenOrientation="portrait"---固定屏幕方向指定竖屏
                            android:screenOrientation="landscape"---固定屏幕方向指定横屏

                            android:screenOrientation="sensorLandscape"---两个横屏之间的切换
                            android:screenOrientation="Portrait"----两个竖屏之间的切换
                            在这种情况下, Activity不会摧毁重构, 也不会改变方向


         d.用代码控制横竖屏的方向---通过点击按钮改变屏幕方向或者获取当前屏幕的方向
                           getResources().getConfiguration().orientation
                           setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE)---将当前屏幕置为横屏
                           setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT)---将当前屏幕置为竖屏

              

 

 

                        

                                                

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值