activity四种加载模式
模式结合手机的home键即可理解
"standard"(默认启动模式)
standard是默认的启动模式,即如果不指定launchMode属性,则自动就会使用这种启动模式。这种启动模式表示每次启动该Activity时系统都会为创建一个新的实例,并且总会把它放入到当前的任务当中。声明成这种启动模式的Activity可以被实例化多次,一个任务当中也可以包含多个这种Activity的实例。
"singleTop"
这种启动模式表示,如果要启动的这个Activity在当前任务中已经存在了,并且还处于栈顶的位置,那么系统就不会再去创建一个该Activity的实例,而是调用栈顶Activity的onNewIntent()方法。声明成这种启动模式的Activity也可以被实例化多次,一个任务当中也可以包含多个这种Activity的实例。
举个例子来讲,一个任务的返回栈中有A、B、C、D四个Activity,其中A在最底端,D在最顶端。这个时候如果我们要求再启动一次D,并且D的启动模式是"standard",那么系统就会再创建一个D的实例放入到返回栈中,此时栈内元素为:A-B-C-D-D。而如果D的启动模式是"singleTop"的话,由于D已经是在栈顶了,那么系统就不会再创建一个D的实例,而是直接调用D Activity的onNewIntent()方法,此时栈内元素仍然为:A-B-C-D。
"singleTask"
这种启动模式表示,系统会创建一个新的任务,并将启动的Activity放入这个新任务的栈底位置。但是,如果现有任务当中已经存在一个该Activity的实例了,那么系统就不会再创建一次它的实例,而是会直接调用它的onNewIntent()方法。声明成这种启动模式的Activity,在同一个任务当中只会存在一个实例。注意这里我们所说的启动Activity,都指的是启动其它应用程序中的Activity,因为"singleTask"模式在默认情况下只有启动其它程序的Activity才会创建一个新的任务,启动自己程序中的Activity还是会使用相同的任务。
"singleInstance"
这种启动模式和"singleTask"有点相似,只不过系统不会向声明成"singleInstance"的Activity所在的任务当中再添加其它Activity。也就是说,这种Activity所在的任务中始终只会有一个Activity,通过这个Activity再打开的其它Activity也会被放入到别的任务当中。
回调机制
某天,我打电话向你请教问题,当然是个难题,^_^,你一时想不出解决方法,我又不能拿着电话在那里傻等,于是我们约定:等你想出办法后打手机通知我,这样,我就挂掉电话办其它事情去了。过了XX分钟,我的手机响了,你兴高采烈的说问题已经搞定,应该如此这般处理。故事到此结束。这个例子说明了“异步+回调”的编程模式。其中,你后来打手机告诉我结果便是一个“回调”过程;我的手机号码必须在以前告诉你,这便是注册回调函数;我的手机号码应该有效并且手机能够接收到你的呼叫,这是回调函数必须符合接口规范。
Fragment的生命周期和使用
fragment适合屏幕的适配,局部更新数据
fragment包括两个部分xml布局和java代码
Java代码中创建一个fragment类的子类,至少必须实现Oncreateview方法,Oncreateview方法会有一个view的返回值,最主要做的事情就是加载的xml的返回值
return inflater。inflate(R.layout。fragment_static,container,false)
加载fragment的xml布局 添加到容器当中的一个根节点 目前先不需要添加到根节点中
fragment不用android在清单文件中注册,所以平时不会被activity展示出来,必须被引用
加载fragment方法有两种一种是静态加载方法既在java中定义<fragment>标签(碎片准备)
(Activity加载)activity中xml布局中定义<fragment>标签,并设置android:name属性指向fragmeng的java类
另一种便为动态加载fragment方法在activity中通过java代码增加,删除,替换Fragment
在activity中 添加framelayout布局帧布局,只展示一个界面即可
加载fragment,展示在framelayout上,执行添加,移除,需使用fragmentmanager(碎片管理类)创建一个fragmenntTransaction(fragment的事务对象)
注意事项 导入的类必须时碎片类,管理类和事务类 导入包的版本要统一,若fragm恩特无背景颜色,可能会出现内容覆盖的情况(一,每个fragment加背景颜色。二,在java中隐藏上一个fragment
比较:静态与动态加载
静态 优点
可以在activity中直接绑定并控制fragment布局中的控件
把fragment当成控件使用,简单方便
缺点
不能根据逻辑业务动态加载
动态 优点
可以根据逻辑业务动态加载
缺点
在代码实现上,较静态更加复杂
生命周期只有三种
1,已恢复
2,已暂停
3,已停止
fragment所在activity的生命周期会直接影响fragment的生命周期,每次回调都会引起fragment的回调
-
onAttach(Context context):在Fragment和Activity关联上的时候调用,且仅调用一次。在该回调中我们可以将context转化为Activity保存下来,从而避免后期频繁调用getAtivity()获取Activity的局面,避免了在某些情况下getAtivity()为空的异常(Activity和Fragment分离的情况下)。同时也可以在该回调中将传入的Arguments提取并解析,在这里强烈推荐通过setArguments给Fragment传参数,因为在应用被系统回收时Fragment不会保存相关属性,具体之后会讲解。
-
onCreate:在最初创建Fragment的时候会调用,和Activity的onCreate类似。
-
View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState):在准备绘制Fragment界面时调用,返回值为Fragment要绘制布局的根视图,当然也可以返回null。注意使用inflater构建View时一定要将attachToRoot指明false,因为Fragment会自动将视图添加到container中,attachToRoot为true会重复添加报错。onCreateView并不是一定会被调用,当添加的是没有界面的Fragment就不会调用,比如调用FragmentTransaction的 add(Fragment fragment, String tag)方法。
-
onActivityCreated :在Activity的onCreated执行完时会调用。
-
onStart() :Fragment对用户可见的时候调用,前提是Activity已经started。
-
onResume():Fragment和用户之前可交互时会调用,前提是Activity已经resumed。
-
onPause():Fragment和用户之前不可交互时会调用。
-
onStop():Fragment不可见时会调用。
-
onDestroyView():在移除Fragment相关视图层级时调用。
-
onDestroy():最终清楚Fragment状态时会调用。
-
onDetach():Fragment和Activity解除关联时调用。
通常集中于以下方法给予编程
oncreate(),oncreateview(),onpause(),onpause()。
android适配器
适配器的作用
高级控件放到Activity上不显示数据,这时要将数据给适配器,适配器再给显示到Activity。
桥梁:通过适配器将后台数据与高级组件链接起来
展示:将数据展示出来
适配器的分类
数组适配器 ArrayAdapter
声明数组适配器 private ArrayAdapter myArrayAdapter new ArrayAdapter(this,R.layoutactv_style, names);
高级控件使用步骤
获取数据 如:this.data = loadData();
创建适配器 如:myArrayAdapter = new ArrayAdapter(this, 0, data);
注:0表示是数据通过适配器展示的方式,一般有两种:
(1)用android自带的版式:anroid.R.layout.simple_list_item_1
(2)自定义一个布局版式:res - layout - myItem.xml - 根元素TextView,……
绑定适配器 如:actv_main_actv1.setAdapter(myArrayAdapter);
数组
(引用数据类型)起指向作用
一组相关类型的变量集合
声明并开辟数组:
数据类型 [] 数组名称 = new
数据类型[长度];
类与对象
对象是类的一个实例
类是一个模板
一个类可以包含以下类型变量:
局部变量:在方法、构造方法或者语句块中定义的变量被称为局部变量。变量声明和初始化都是在方法中,方法结束后,变量就会自动销毁。
成员变量:成员变量是定义在类中,方法体之外的变量。这种变量在创建对象的时候实例化。成员变量可以被类中方法、构造方法和特定类的语句块访问。
类变量:类变量也声明在类中,方法体之外,但必须声明为static类型。
构造方法
构造方法的名称必须与类名称一致;
构造方法的声明处不能有任何返回值类型的声明;
不能在构造方法中使用return返回一个值
匿名对象
匿名对象就是没有明确的给出名称的对象。一般匿名对象只使用一次,而且匿名对象只在堆内存中开辟空间,而不存在栈内存的引用。