- 安卓系统架构:
Linux 内核层,系统运行库层,应用框架层,应用层 - 日志级别:Verbose,debug,info,warn,erro
Activity
- Acivity:可以包含用户界面的组件,主要用于和用户进行交互
<intent-filter>
android:name="android.intent.action.MAIN"/>
</intent-filter>
- menu使用
创建menu文件标识菜单项id,title; 重写onCreatOptionsMenu()方法,创建并且显示出menu; getMenuInflater().inflate(R.menu.main,menu); 通过getMenuInflater()方法能够得到MenuInflater对象,再调用它的inflate()方法就可以给当前活动创建菜单了。inflate()方法接收两个参数,第一个参数用于指定我们通过哪一个资源文件来创建菜单,这里当然传入R.menu.main。第二个参数用于指定我们的菜单项将添加到哪一个Menu对象当中 onOptionsItemSelected(MenuItem item)定义菜单响应事件 - 销毁活动:
activity提供finish() - Intent(显示,隐式)
8.1. 概念: Intent是Android程序中各组件之间进行交互的一种重要方式,它不仅可以指明当前组件想要执行的动作,还可以在不同组件之间传递数据。Intent一般可被用于启动活动、启动服务以及发送广播等场景 8.2. 显示: Intent(this,.class) 8.3. 隐式 Action,category,单个action,多个category 还可以启动其他应用程序的活动, 标签中主要可以配置以下内容。 ? android:scheme。用于指定数据的协议部分,如上例中的http部分。 ? android:host。用于指定数据的主机名部分,如上例中的www.baidu.com部分。 ? android:port。用于指定数据的端口部分,一般紧随在主机名之后。 ? android:path。用于指定主机名和端口之后的部分,如一段网址中跟在域名之后的内容。 ? android:mimeType。用于指定可以处理的数据类型,允许使用通配符的方式进行指定。
向下一个传递数据: 注意这里putExtra()方法接收两个参数,第一个参数是键,用于后面从Intent中取值,第二个参数才是真正要传递的数据
通过getIntent()方法获取到用于启动SecondActivity的Intent,然后调用getStringExtra()方法,传入相应的键值,就可以得到传递的数据了。
向上一个传递参数: 使用startActivityForResult(intent,1);启动intent 下个activity中设置putExtra(),然后setResult() finish后,改写onActivityResult()方法 9. 活动状态: 运行状态,暂停状态,停止状态,销毁状态, 10. 生命周期 Oncreat(),onstart(),onresume(),onpause(),onstop(),ondestory(),onrestart() 11. Activity中还提供了一个onSaveInstanceState()回调方法,这个方法可以保证在活动被回收之前一定会被调用,因此我们可以通过这个方法来解决活动被回收时临时数据得不到保存的问题。 12.启动模式: Standard,singletop,singletask,singleinstance 13.getClass().getSimpleName() 获取类名
UI开发
- 字体大小使用sp作为单位
- ProgressBar用于在界面上显示一个进度条
- visible表示控件是可见的,这个值是默认值,不指定android:visibility时,控件都是可见的。invisible表示控件不可见,但是它仍然占据着原来的位置和大小,可以理解成控件变成透明状态了。gone则表示控件不仅不可见,而且不再占用任何屏幕空间
- 首先通过AlertDialog.Builder创建一个AlertDialog的实例,然后可以为这个对话框设置标题、内容、可否用Back键关闭对话框等属性,接下来调用setPositiveButton()方法为对话框设置确定按钮的点击事件,调用setNegativeButton()方法设置取消按钮的点击事件,最后调用show()
- 4种基本布局
android:gravity用于指定文字在控件中的对齐方式,而android:layout_gravity用于指定控件在布局中的对齐方式 线性布局, RelativeLayout又称作相对布局 帧布局 百分比布局 - 自定义控件
自定义布局: Layoutinflater.from(context).inflate(R.layout.title,this),子父布局,可以在自定义布局内进行操作 - listview的简单使用
list布局,适配器,数据 ArrayAdapter的构造函数中依次传入当前上下文、ListView子项布局的id,以及要适配的数据。注意,我们使用了android.R.layout.simple_list_item_1作为ListView子项布局的id,这是一个Android内置的布局文件,里面只有一个TextView,可用于简单地显示一段文本。 定制listview 界面,在getview中view view = layoutinflater.from(getcontext()).inflate(resourced,parent,false)
提升运行效率:在getview中使用convertview进行判断,空为加载,非空复用
创建一个ViewHolder对象,并将控件的实例都存放在ViewHolder里,然后调用View的setTag()方法,将ViewHolder对象存储在View中。当convertView不为null的时候,则调用View的getTag()方法,把ViewHolder重新取出。这样所有控件的实例都缓存在了ViewHolder里,就没有必要每次都通过findViewById()方法来获取控件实例了。
创建list点击事件: 可以看到,我们使用setOnItemClickListener()方法为ListView注册了一个监听器,当用户点击了ListView中的任何一个子项时,就会回调onItemClick()方法。
碎片
- 碎片(Fragment)是一种可以嵌入在活动当中的UI片段
简单创建碎片:1.创建布局文件(fragment.xml),2.创建类继承Fragment,重写onCreateView方法 3.在activity布局文件中使用fragment - 动态替换碎片
(1) 创建待添加的碎片实例。 (2) 获取FragmentManager,在活动中可以直接通过调用getSupportFragmentManager()方法得到。 (3) 开启一个事务,通过调用beginTransaction()方法开启。 (4) 向容器内添加或替换碎片,一般使用replace()方法实现,需要传入容器的id和待添加的碎片实例。 (5) 提交事务,调用commit()方法来完成。 - 碎片和活动之间进行通信
调用FragmentManager的findFragmentById()方法,可以在活动中得到相应碎片的实例 以通过调用getActivity()方法来得到和当前碎片相关联的活动实例 - 碎片的状态和回调
运行状态,暂停状态,停止状态,销毁状态 回调方法:
? onAttach()。当碎片和活动建立关联的时候调用。 ? onCreateView()。为碎片创建视图(加载布局)时调用。 ? onActivityCreated()。确保与碎片相关联的活动一定已经创建完毕的时候调用。 ? onDestroyView()。当与碎片关联的视图被移除的时候调用。 ? onDetach()。当碎片和活动解除关联的时候调用。
onAttach(),oncreate(),onCreateView(),onActivityCreated(),onStart(),onResume(),onpause(),onstop(),onDestory(),onDetach()
广播
-
Android中的每个应用程序都可以对自己感兴趣的广播进行注册,这样该程序就只会接收到自己所关心的广播内容,这些广播可能是来自于系统的,也可能是来自于其他应用程序的。 -
广播分为两种类型: ? 标准广播(Normal broadcasts)是一种完全异步执行的广播,在广播发出之后,所有的广播接收器几乎都会在同一时刻接收到这条广播消息,因此它们之间没有任何先后顺序可言。这种广播的效率会比较高 ? 有序广播(Ordered broadcasts)则是一种同步执行的广播,在广播发出之后,同一时刻只会有一个广播接收器能够收到这条广播消息,当这个广播接收器中的逻辑执行完毕后,广播才会继续传递。所以此时的广播接收器是有先后顺序的,优先级高的广播接收器就可以先收到广播消息,并且前面的广播接收器还可以截断正在传递的广播,这样后面的广播接收器就无法收到广播消息了 -
接收系统广播 在代码中注册和在AndroidManifest.xml中注册,其中前者也被称为动态注册,后者也被称为静态注册。
3.1.动态注册: 新建一个类,让它继承自Broadcast-Receiver,并重写父类的onReceive()方法就行了。这样当有广播到来时,onReceive()方法就会得到执行,具体的逻辑就可以在这个方法中处理。(需要进行注册和解绑操作)
静态注册:在AndroidManifest. Xml文件中添加
3.2 有序广播 sendOrderedBroadcast()方法接收两个参数,第一个参数仍然是Intent,第二个参数是一个与权限相关的字符串,这里传入null就行了。
调用了abortBroadcast()方法,就表示将这条广播截断 3.3 本地广播 主要就是使用了一个LocalBroadcastManager来对广播进行管理,并提供了发送广播和注册广播接收器的方法。
LocalBroadcastManager的getInstance()方法得到了它的一个实例,然后在注册广播接收器的时候调用的是LocalBroadcastManager的registerReceiver()方法,在发送广播的时候调用的是LocalBroadcastManager的sendBroadcast()方法,仅此而已。
最后我们再来盘点一下使用本地广播的几点优势吧。 ? 可以明确地知道正在发送的广播不会离开我们的程序,因此不必担心机密数据泄漏。 ? 其他的程序无法将广播发送到我们程序的内部,因此不需要担心会有安全漏洞的隐患。 ? 发送本地广播比发送系统全局广播将会更加高效
数据存储
- 文件存储
- Sharepreferences:
(1) 调用SharedPreferences对象的edit()方法来获取一个SharedPreferences.Editor对象。 (2) 向SharedPreferences.Editor对象中添加数据,比如添加一个布尔型数据就使用putBoolean()方法,添加一个字符串则使用putString()方法,以此类推。 (3) 调用apply()方法将添加的数据提交,从而完成数据存储操作。 - SQlite数据库存储
专门提供了一个SQLiteOpenHelper帮助类,借助这个类就可以非常简单地对数据库进行创建和升级。既然有好东西可以直接使用,那我们自然要尝试一下了,下面我就对SQLiteOpenHelper的基本用法进行介绍。
内容提供器简介
- 内容提供器可以选择只对哪一部分数据进行共享,从而保证我们程序中的隐私数据不会有泄漏的风险。
- 一类是普通权限,一类是危险权限
- 危险权限则表示那些可能会触及用户隐私或者对设备安全性造成影响的权限,如获取设备联系人信息、定位设备的地理位置等,对于这部分权限申请,必须要由用户手动点击授权才可以,否则程序就无法使用相应的功能。
- 内容提供器的用法一般有两种:
一种是使用现有的内容提供器来读取和操作相应程序中的数据, 另一种是创建自己的内容提供器给我们程序的数据提供外部访问接口。
|