环境:JDK+Andriod JDK
开发工具:Andriod studio+Genymotion+ADK
Activity:一个页面
LinerLayout:线性布局
android:id —— 为控件指定相应的ID
android:text —— 指定控件当中显示的文字,尽量使用strings.xml文件当中的字符串
android:grivity —— 指定控件基本位置,比如说居中,居右等
android:textSize —— 字体的大小
android:background —— 背景色
android:width —— 宽(dp)
android:height —— 高度
android:padding* —— 内边距
android:sigleLine —— 如果设置为true的话,控件的内容在同一行当中进行显示,超出内容为省略号
android:layout_weight --用于给一个线性布局中的诸多视图的重要度赋值。
所有的视图都有一个layout_weight值,默认为零,意思是需要显示
多大的视图就占据多大的屏幕空间。若赋一个高于零的值,则将父视
图中的可用空间分割,分割大小具体取决于每一个视图的layout_weight
值以及该值在当前屏幕布局的整体 layout_weight值和在其它视图屏幕布
局的layout_weight值中所占的比率而定。
举个例子:比如说我们在 水平方向上有一个文本标签和两个文本编辑元素。
该文本标签并无指定layout_weight值,所以它将占据需要提供的最少空间。
如果两个文本编辑元素每一个的layout_weight值都设置为1,则两者平分
在父视图布局剩余的宽度(因为我们声明这两者的重要度相等)。如果两个
文本编辑元素其中第一个的layout_weight值设置为1,而第二个的设置为2,
则剩余空间的三分之二分给第一个,三分之一分给第二个(数值越小,重要度越高)。
如果用android:layout_weight="1",要想使其真正的平均,则android:layout_width用"fill_parent"
android:orientation:内容的对其方向, horizontal和vertical。分别表示水平和垂直
RelativeLayout:相对布局
在父亲布局的相对位置
android:layout_alignParentLeft="true"//在布局左边
android:layout_alignParentRight="true"//在布局右边
android:layout_alignParentTop="true"//在布局上面
android:layout_alignParentBottom="true "//在布局的下面
在某个控件的相对位置
android:layout_toRightOf="@id/button1"//在控件button1的右边,不仅仅是紧靠着
android:layout_toLeftOf="@id/button1"//在控件button2的左边,不仅仅是紧靠着
android:layout_below="@id/button1 "//在控件button1下面,不仅仅是正下方
android:layout_above=“@id/button1”//在控件button1下面,不仅仅是正下方
定义和某控件对齐
android:layout_alignTop=”@id/button1”//和控件button1上对齐
android:layout_alignBottom=”@id/button1”//和控件button1下对齐
android:layout_alignLeft=”@id/button1”//和控件button1左对齐
android:layout_alignRight=”@id/button1”//和控件button2右对齐
android:layout_centerHorizontal="true"//水平居中
android:layout_centerVertical="true"
android:layout_centerInParent="true"
按钮点击事件输入代码:
findViewByID(R.id.button).setOnclickListener(new view.OncilckListener(){
Toast.makeTest(MainActivity.this,"文字内容”,Toast.LENGTH_LONG).show();
签名打包方法:
Build 到 Genenrt Signed APK
在res中的AndriodMainifest.xml中可以修改应用的图标
在test中的build.gardle中修改版本号
在java中新建一个类作为新的Activity,从OnCreat方法开始
public classslashextendsAppCompatActivity {
@Override
public voidonCreate(Bundle savedInstanceState,PersistableBundle persistentState) {
super.onCreate(savedInstanceState,persistentState);
}
}
在AndriodMainifest.xml中设置为启动页面
找到按钮的代码:
parvate Button mButton;
mButton=(Button)findViewBy(R.Id.button);
设置点击进入响应事件代码:
private View.OnclickListener mOnClickListener=new View.OnClickListener(){
switch(v.getId){
case R.Id.button;
Intent intent=new Intent(XXXX.this,XXXX.class);
startActivity(intent);
break;
}
}
启动页自动跳转的代码:
Handlermhandler=newHandler();
mhandler.postDelayed(newRunnable() {
@Override
public voidrun() {
Intent intent=newIntent(slash.this,MainActivity.class);
startActivity(intent);
}
},1000);
两个页面穿上文本的代码:
TextViewtextView=(TextView)findViewById(R.id.title);
Stringtitle=textView.getText().toString();
intent.putExtra("title",title);
接受:
Intent intent=getIntent();
if(intent!=null){
String title=intent.getStringExtra("title");
setTitle(title);
在传输类的时候需要在建立函数的时候添加序列化代码:implements Serializable,在接受时要把序列化再强制转换成类
来回传输的代码:
startActivityForResult(intent,1234);
setResult(1234,intent0);
@Override
protected voidonActivityResult(intrequestCode, intresultCode,Intent data) {
super.onActivityResult(requestCode,resultCode,data);
if(requestCode==1234&&resultCode==MainActivity.RESULT_CODE){
if(data!=null){
}
Activity的生命周期
Activity的生命周期
1. 从打开应用到按后退键
打开应用
onCreate() 方法执行! 不可见
onStart() 方法执行! 可见
onResume() 方法执行! 可见&在前台
按下后退键
onPause() 方法执行! 可见
onStop() 方法执行! 不可见
onDestroy() 方法执行!不可见
2. 从打开应用到按主屏幕键 再到重新打开应用
打开应用
onCreate() 方法执行!
onStart() 方法执行!
onResume() 方法执行!
按下主屏幕键
onPause() 方法执行!
onStop() 方法执行!
重新打开应用
onRestart() 方法执行!
onStart() 方法执行!
onResume() 方法执行!
Activity在onPause() 和 onStop()后都可能由于内存不足等原因被杀死从而当用户重新打开app时会重新执行onCreat()方法。 onPause()方法在app被其他app覆盖时会执行,如果短时间内重新回到前面,则会执行onResume()方法。如果长时间不可见的话则会执行onStop()方法。
3. 横竖屏切换问题
通过横竖屏切换时发现,Activity的生命周期的变化如下:
onPause() 方法执行!
onStop() 方法执行!
onDestroy() 方法执行!
onCreate() 方法执行!
onStart() 方法执行!
onResume() 方法执行!
是把当前的Activity销毁后重新创建
在res目录下新建layout-land文件夹,里面放的是Activity横屏时显示的布局,名字要与layout文件夹下的文件名字一样。
设备旋转前保存数据:
重载onSaveInstanceState()方法
onPause() 方法执行!
onStop() 方法执行!
onSavaInstanceState(Bundle) 方法执行
onDestroy() 方法执行!
onCreate() 方法执行!
onStart() 方法执行!
onResume() 方法执行!
方法onSavaInstanceState()默认的实现要求所有activity的视图将自身状态数据保存在Bundle对象中。在重新执行onCreat()方法时会传入Bundle对象。
onCreate() 方法执行! /**首次打开app**/
Bundle对象为空
onStart() 方法执行!
onResume() 方法执行!
onPause() 方法执行! /**旋转手机屏幕**/
onSaveInstanceState() 方法执行!
onStop() 方法执行!
onDestroy() 方法执行!
onCreate() 方法执行!
Bundle对象获取到的myInfo的值:
onStart() 方法执行!
onResume() 方法执行!
当旋转手机屏幕并重新执行onCreat()方法后在onSaveInstanceState()中向Bundle保存的值传了过去。
那么有个问题,onSaveInstanceState()这个方法什么时候会执行?一定会在onPause()和onStop()之间执行么?
答案:onSaveInstanceState()这个方法不一定都会执行,当用户按下后退键时,代表了不再需要这个Activity了,这时候就没有必要执行这个方法了。但是,如果用户按下主屏幕键或者这个Activity转为后台运行时,这个时候需要保存信息,这个方法会执行。
onRestart() 方法执行! /**打开app**/
onStart() 方法执行!
onResume() 方法执行!
onPause() 方法执行! /**按下后退键**/
onStop() 方法执行!
onDestroy() 方法执行!
onCreate() 方法执行! /**打开app**/
Bundle对象为空
onStart() 方法执行!
onResume() 方法执行!
onPause() 方法执行! /**按下主屏幕键**/
onSaveInstanceState() 方法执行!
onStop() 方法执行!
用户离开当前activity管理的用户界面,或需要回收内存时,activity也会被销毁。
不过Android从不会为了回收内存而去销毁正在运行的activity。activity只有在暂停或者停止状态下才可能被销毁。此时就会调用onSaveInstanceState()方法。
调用这个方法时,用户数据会被保存在Bundle对象中。然后操作将Bundle对象放入activity记录中。
activity暂存后,Activity对象不再存在,但操作系统会将activity记录保存起来。在需要回复activity时,操作系统可以使用暂存的activity记录重新激活activity。
常见的做法是覆盖onSaveInstanceState()方法把数据保存在Bundle对象中,覆盖onPause()方法处理其他需要处理的事情。
那么暂存的activity记录可以保存多久?用户按下后退键后,系统会彻底销毁当前的activity。activity记录也会被清除。系统重启或长时间不适用这个activity时,记录也会被删除。
fill_parent被match_parent替代