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)---将当前屏幕置为竖屏