前三个lec讲的java基础
本篇只涉及lec里的安卓知识点,不涉及开发代码
讲了如何安装AS
运行在手机后台的应用服务,没有UI。如后台播放音乐
能够接受安卓系统或其他app的broadcast广播并给出响应。如“你正在使用移动流量”看视频
应用可能会存储多种文件和数据库且只能被自己访问,ContentProvider支持在应用程序之间共享信息。如在邮件应用中可以给手机日历增加一个日程
Activity通常是一个单独的屏幕,上面可以显示控件并根据用户的动作做出响应。如知乎打开后的各种页面
一个安卓应用可能会包含多个activities,但是只有一个是main activity。所有activities都会在系统里先注册,使得它能够被跳转(比如在美团外卖唤起invokes微信付款页面。
Back Stack:
页面的堆栈,当跳转页面时,前一个Activity被pause,然后被放置到back stack的最顶端。
栈——先进后出,当点击back按钮,当前activity会被destroyed,然后back stack顶部的activity会activated and shown
Activity Life Cycle
一个Activity通常有四个状态:
处于stopped状态的页面在手机内存不足时会被自动销毁
页面状态切换
动作 | 回调函数执行顺序 |
---|---|
某个activity被启动 | OnCreate -> onStart -> onResume |
失去焦点,被隐藏 | onPause -> onStop |
重新获取焦点 | OnRestart -> onStart -> onResume |
关闭 | onPause -> onStop -> onDestroy |
从Activity1跳转到Activity2:
1. Activity1启动
2.点击按钮跳转到Activity2:
Activity1: onPause()
Activity2: onCreate()
Activity2: onStart()
Activity2: onResume()
Activity1: onStop() #与下面情况二不同
3.从Activity2中返回:
Activity2: onPause()
Activity1: onRestart() #与下面情况二不同
Activity1: onStart() #与下面情况二不同
Activity1: onResume()
Activity2: onStop()
Activity2: onDestroy()
4.Activity1退出
从Activity1跳转到透明的Activity2:
1.Activity1启动
2.点击按钮跳转到Activity2:
Activity1: onPause()
Activity2: onCreate()
Activity2: onStart()
Activity2: onResume()
3.从Activity2中返回:
Activity2: onPause()
Activity1: onResume()
Activity2: onStop()
Activity2: onDestroy()
4.Activity1退出
【https://blog.csdn.net/GracefulGuigui/article/details/115817190】
回调函数CallBack functions | 通常使用情况 |
---|---|
onCreate() | Initial setup, load persistent state. |
onRestart() | read cached state |
onStart() | reset application |
onResume() | start foreground-only behaviors |
onPause() | shutdown foreground-only behaviors. For example: temporarily stop UI animations. |
onStop() | cache state |
onDestroy() | save persistent state |
res文件夹里的资源都会注册为全局的R.java(R.
)包,来供快速调用
同样,每个View可以有自己的id:@+id/records
使用findViewById(R.id.records)来获取这个元素实例
widgets的base class是View,View代表屏幕中的一块矩形区域,渲染可视的元素。
layout的base class是ViewGroup,ViewGroup是View的子类,代表了包含了许多widgets的一块区域。ViewGroup可以嵌套。
使用如findViewByID(R.id.textView1)来获取一个在XML里定义的widget的实例。
padding:内边距,属于View,android:padding=“12dp”
margin:外边距,外边距占据的部分,不属于这个View,android:layout_margin=“20dp”
View.OnClickListener
View.OnDragListener
View.OnLayoutChangeListener
每个Listener可以绑定一个回调方法
onItemSelected()为下文Spinner选定下拉框中某个元素的回调
Spinner和ListView和GridView
以Spinner为例,会创建一个可选的下拉框
android:id=“@id/records 和 android:id=”@+id/records"区别:
+号表示如果不存在这个symbol(ID)则创建
android:layout_width="match_parent"解释:
layout_开头属性用于告知父Layout如何渲染这个View,每个Layout需要的属性不同,LinearLayout需要weight而GridLayout需要column和row属性
- wrap_content: tells your view to size itself to the dimensions required by its content.
- match_parent: tells your view to become as big as its parent view group will allow.
相对布局允许子元素相对定位
每个元素锚点在左上角,如果两个元素处于同一位置,则后面那个会覆盖
使用单独的线程渲染UI,监听事件以及控制activity生命周期。如果这个线程阻塞太长时间,安卓就会认为app停止响应。
可以使用新线程控制activity,但是UI只能由UI线程来渲染。因此,使用如下方法来协程:
AsyncTask,四个关键函数:onPreExecute(),onPostExecute(),onProgressUpdate()运行在UI线程,doInBackground()运行在其他线程。工作流程:创建AsyncTask对象并override以上方法,调用execute方法,执行顺序:onPreExecute()→doInBackground(Params… params)、onProgressUpdate(Progress… values)→onPostExecute(Result result)
Context:为了与不同设备的硬件交互,控制app的权限,允许安卓组件获取共享信息
Toast弹窗提示
Notification系统菜单栏消息
软件的后台服务,也运行在UI线程上
startService():
This service can run in the background indefinitely, even if the component that started it is destroyed.
It lacks methods to interact with other components.
bindService():
This service only lives while it serves another component.
If its last component unbinds, the service will be destroyed by the Android System.
It provides mechanisms to interact with callers.
foreground不会被杀掉,non-foreground service在低电量时会被杀掉
使用Service的好处:
Service有生命周期,可以由任何活动控制。(甚至从不同的应用程序!)
Service可以接收广播信息。这允许你根据一些系统事件(电池寿命等)来调整应用程序的行为。
假如没有Service,我们可能需要在多个Activity里面设定许多个后台事务处理代码,防止某个单一Activity被杀掉后后台停止。Service能够保持后台一只运行
bindService四个关键部分:
Binder is needed because:
Android system need to prepare things first, it cannot return the service object immediately.
The service need a way to inform the system the time clients can interact with itself, through onBind().
Intent被用于方便应用程序组件之间的通信
Explicit intents:显示的定义谁发起了intent,如组件类名
Implicit intents:大概定义一个action,安卓系统通过用intent filters匹配这个隐式intent找到最适合的组件
Intent构成:
ACTION_VIEW content://contacts/people/1
:要求android显示标识符为 "1 "的人的信息。://:/
,是对资源或数据的不可改变的一对一映射。如ftp://ftp.is.co.za/rfc/rfc1808.txt。Intent i2 = new Intent(getApplicationContext(), ImageShow.class);
ImageShow.class is the component.Implicit intent隐式intent:
为了接受一个隐式intent,接收方组件应该在安卓系统里注册,通过manifest XML 里的
Intent Filters:定义了一个软件能够接受哪些implicit intents,如各种浏览器都能打开网页,那么我们在自己的软件里要打开某个网页的时候,安卓系统就会弹出一个窗口让我们选择用哪一个浏览器打开。
判断一个intent是否通过intent filter(whether can resolve this intent):
如果接收方注册了
:那么它只会收到响应的action的intent,如果接收方没有注册action,则永远不会接受到intent。
如果接收方注册了
,它接受Intent时不需要Intent包含所有它注册了的category。对于某个Intent,接收方必须注册了这个Intent携带的所有category才能接受他。An intent with zero category will always pass the test. An intent with categories A, B matches a filter with categories A, B, C.
安卓系统对于startActivity和startActivityForResult传递的implicit intents会自动应用CATEGORY_DEFAULT。所以接收方intent filter至少要有android.intent.category.DEFAULT。
如果接收方注册了,
那么他会筛选掉不在他注册的URI和MIME范围之内的intent。
例子:
尝试跳转到系统的计算器应用
尝试跳转到浏览器,并且跳到固定网页
自己设定一个intent filter
安卓应用可以发送(sendBroadcast)/接受(BroadcastReceiver)从别的应用/安卓系统发来的广播
接受广播:
Context.registerReceiver()
或Intent-filter(8.0以上版本被弃用)
在Activity的onCreate方法里设置receiver,然后在按钮回调里注册接收器。
权限限制了软件的信息获取,保护了用户隐私,软件使用权限必须获得用户同意。
权限类型:
声明权限:
app在AndroidManifest XML里使用
来声明需要的权限。
内部存储:
外部存储:
轻量级的存储私有数据,以键值对的形式在internal memory中。即使你的应用被杀了,数据也persist across user sessions。通常用于存储user id和喜欢的WiFi网络等
Context.getSharedPreferences(name,mode):对所有调用者返回同一实例
Activity.getPreferences(mode):每个Activity只会收到自己的私有实例
mode现在只有MODE_PRIVATE
SQLite provides in-memory database。提供一个跨平台轻量化的数据库,提供ACID transactions:atomic, consistent, isolated & durable。
可以定义一个类来定义数据库每行的对象实例方便业务操作
一个继承了SQLiteOpenHelper的类提供数据库管理(创建,更新),定义数据库的业务操作。
View:
就是canvas画板,为了绘制东西,要重写View类的onDraw()方法,在其内可以调用drawLines等方法。
Animated View:
在UI线程内调用view.invalidate(),在其他线程调用view.postInvalidate()来重绘。
动画效果通过使用线程和sleep控制View的绘图属性来完成。
SurfaceView:
引入缓存和锁的机制,减少每次重绘消耗的资源。
请求锁的时候如果没有画布则会返回null,此时可以添加回调来创建画布。
绘制SurfaceView无需在UI线程内
可绘制的资源包括图像,矢量图形等。
BitmapDrawable:
文件放于res/drawable
从文件流中获得bitmap,然后代码或xml设置。ImageView.setImageResource()
VectorDrawable:
矢量图存储绘图信息,通常以XML文件存储。
TransitionDrawable:
对Drawable的对象进行渐变转换
Single-Touch:
在View里重写onTouchEvent事件,还可以invalidate()来重绘,还可以用另外一个线程来控制绘制频率
Multi-Touch:
多点触控每个触控点都会有id以及动作(通过event.getActionMasked()获取),都会触发onTouchEvent。id会持续到这个触控点消失。每个点还有index,所有点存储在一个列表中,index和触控点的关系是会变的。
陀螺仪传感器,光线传感器等
Sensor对象有value范围,最小实际延迟,value等
地理传感器非常耗电需要注意Pause
网络功能需要在manifest里申明权限:
URL url = new URL(httpURL);
HttpURLConnection urlConn =(HttpURLConnection) urls[0].openConnection();
BufferedReader reader = new BufferedReader(new InputStreamReader(urlConn.getInputStream()));
reader.close(); urlConn.disconnect();
Android网络类:
HTTP:
HTTP is a protocol for communication between browsers and world wide web (WWW) servers. HTTP uses URL to locate resources: protocol://hostname[:port]/path/[;parameters][?query]#fragment
,协议包括Protocol examples: http, file, ftp, ed2k, mailto
,Query用于传递动态参数,适用于PHP,JSP,ASP等
Post和get区别:
解析响应体(后端可能返回json或,这里以XML为例:Document doc = dBuilder.parse(urlConn.getInputStream());
Socket:
A socket is an abstract representation (handle) for the local endpoint of a network communication path socket经常用于构建实时聊天室
一个Socket包含Protocol,Local IP,local port,Remote IP,remote port
What is HCI: It involves the study, planning, and design of the interaction between people (users) and computers
From PC to mobile:
Devirsity of Device Interaction:
Size: hand-sized, decimetre-sized, vs body-sized, etc.
Haptic input: two-handed vs one-handed vs hands free, 通常包含(键盘Keyboards,虚拟键盘Virtual keyboards, 触控屏Touch screens,声音Voice)
- 虚拟键盘Virtual keyboards优点:简单,适用于各种语言,节省了硬件物理空间。缺点:需要准确的点击,缺少物理反馈,需要挤占屏幕空间。可改进:预测输入,修正输入,放大光标Magnifier cursor
- 手写笔Character Recognition:基于笔的落下抬起移动,需要更高的处理能力,需要用户手写的训练集,错误率通常高。
- 声音输入Voice Input:语音转文字,一开始的时候受限于词汇量。优点:解放双手,节省屏幕空间,不需要打断用户如开车等动作。缺点:处理性能要求高,噪音环境错误率大,口音问题
- Virtual keyboard without screen基于投影和图像识别的键盘
- Stephen Hawking’s Wheelchair使用了眼球追踪eye tracking
- Brain Computer Interface脑机接口
Single user vs shared interaction: personal space vs public space
Posture for user: lying, sitting, standing, walking, etc.
Distance of output display to input control: centimetre to metre.
Position during operation: fixed vs mobile
Connectivity: stand-alone vs networked, wired vs wireless
Tasking: single task vs multi-task devices
Multimedia content access: voice and text communications, oriented alpha-numeric data or text-oriented, audiovisual-content access
Integrated: embedded integrated devices vs dynamically interoperable devices
Securities in Mobility:
一些敏感信息(个人信息,社交网络,网上银行等)容易被盗取,通过病毒Virus,黑客Hackers,未认证访问Unauthorized access
解决方法:基于设备及网络的安全验证Authentication以及信息加密Encryption
What is context-aware:
Why context-aware 意义何在:App can be more intelligent and less attention hungry, more comfortable/efficient to use
How to be context-aware(CA):
Passive context-aware systems:被动上下文感知
new context is presented to the user, to inform them of change——把某个东西的改变通知用户,交给用户选择后续操作。比如电池没电了的低电量提醒
Active context-aware system :主动上下文感知
behavior of the applications change automatically——应用自动改变自己的行为,如手机的夜晚模式。
Various ways of classifying CA software:
Proactive Triggering | performing some interaction based on environmental perceptions |
Streamlining Interaction | travel guide for current location (reducing irrelevant information) |
Memories for past events | based on spatial or feature-based cues (contextual retrieval) |
Reminders for future contexts | tagging details regarding current context for future access |
Optimizing patterns of behaviours | changing interface based on situation |
Sharing Experiences | Social networking based on shared contexts |
Context Creation:
基于传感器信息,可以创建新的上下文,也就是将低层面的raw context转为high level contexts。如地理位置信息由GPS信息转为街道名(Abstraction is often more useful:“this photo was taken at my parents home last Christmas”)
Challenges in Context Awareness:
Spatial Awareness空间感知:
连结contextual information(传感器的位置,活动,时间)和other people
It is the key element of Location-based service (LBS)
例子:
Location Acquisition地点感知:
通常指GPS/BDS等卫星定位/4G等网络定位/-航位推算等机械方法,现在也有WLAN based positioning,RFID based positioning,Ultrasonic/sonar positioning超声波定位,Infrared Position红外线定位
Satellite based Positioning卫星定位:
Trilateration positioning method三坐标定位法
Mobile device measures the signal propagation distance,Mobile device computes its position based on multiple measurements
Cellular Network based Positioning蜂窝网络定位:
使用base stations (BS)来定位
WLAN based Positioning:
Mechanic Positioning Methods力学定位:
基于previous position,travelling distance,travelling direction三个要素推断新的位置
Augmented Reality增强现实:
Combining live direct view of a physical real-world environment with virtual CGI
Dijkstra之前在INT102里写过,见这里
Dijkstra算法使用贪心思想,要求路径权值不能为负数,一旦一个点被visited,则这么点在之后的搜索中不会被考虑。
电磁波无线电的发展历史
A type of electromagnetic radiation with wave length带有波长的电磁辐射,频率从3kHz到300GHz,人耳听力范围20Hz到20kHz
一些属性properties:
五层网络模型:
Wireless Interference无线干扰:
同一时间多只transmitter向同一接收者发送不同频率信息,接收者将会接收到混合的信号( the summation of the two signals)
解决方法:
基于频率的划分,每个网络用户有自己的频率段(frequency band),频率段之间有一段间隔(guard bands)
优点:
数字信号和模拟信号
缺点:
基于时间的划分,所有网络内用户基于同一频率传输信息,但是不同用户在不同时段传输
优点:
缺点:
基于空间的划分,地理空间上划分users。
与FDMA不同,CDMA仅有一个通道占据链路整个的带宽。而与TDMA不同的是,所有的站点都可以同时发送/接受数据,没有时间的共享问题。即在CDMA中,一个通道同时承载所有的传输。总体来说,在码分多路访问中,站点使用不同的编码以达到多路访问。
码分多址详解
数学,克罗内克积The Kronecker product:
将B看成标量,element-wise乘后直接展开
CDMA使用点乘(R,C之间)和克罗内克积(E,C之间)
(重要)CDMA步骤:
可见spreading code在这之中用处非常大,那么如何找出符合那些条件的code:
OVSF树的生成:
树根为-1或1都行,学校这里树根为1
假设每个节点中的向量表示为W
每个节点可以分出两个分支,一个分支内向量为[W W],另一个分支为[W -W]
如[1,-1]分出两个分支[1,-1,1,-1],[1,-1,-1,1]
每层的codes即可用于CDMA。
用于数据链路层Data Link,检测信道medium,等待直到它空闲后发送内容。如果信道忙,则在一个随机的时间后重新检测
What is WIFI:
Wireless local area network (WLAN) products that are based on the Institute of Electrical and Electronics Engineers’ (IEEE) 802.11 standards.
了解即可:
IEEE 802.11 – “Wi-Fi 0”:1997年
IEEE 802.11b – “Wi-Fi 1”:1999年,使用2.4GHz,带宽11Mbps,13个信道,目前最广泛使用
IEEE 802.11a - “Wi-Fi 2”:1999年,5GHz,带宽54Mbps,12个信道,与上面这个不兼容
IEEE 802.11g - “Wi-Fi 3”:2003年,2.4GHz,54Mbps
IEEE 802.11n - “Wi-Fi 4”:2008年,2.4GHz/5GHz,600Mbps
(好老的课件…WiFi5,WiFi6都没有的吗)
Channels & Frequency:
划分了13个可用channel,交叉使用三个
802.11 defines two Wi-Fi network options:
Infrastructure BSS结构型基本服务集:AP连结管理多个节点
Independent BSS独立型基本服务集:节点之间互相连结
AP:无线设备的网络管理节点,相当于一个连接有线网和无线网的桥梁,其主要作用是将各个无线网络客户端连接到一起,然后将无线网络接入以太网,从而达到网络无线覆盖的目的。
如何实现无缝漫游mobility issues?(从CB的3楼走到CB的1楼,AP节点如何发生的更换),与#20讨论的COA不同,这里没有发生网络上的位置变换,路由还是那个路由:
IEEE 802.11没有规定,由各个厂商自己实现(目前比较流行AC+AP,mesh等方案),MS移动导致连结的AP切换后,AP需要更新它们的数据库,使DS能够分发正确的包到相应的AP
隐藏网络的SSID,阻止经验不足的人连结你的wifi,属于不可靠的保护方法
筛选符合条件的MAC设备访问
优点:比隐藏SSID强
缺点:增加管理复杂性,降低了scalability,MAC地址可以伪造
WEP:Wired Equivalent Privacy
1999年,802.11b,处于数据链路层。
只有认证用户才能接入,保护AP与节点间信息。
需要同个WLAN下的所有电脑和APs共享同一个密钥K(称作WEP key)
缺点:RC4密钥长度有限24bits,容易被爆破
例子:
Assume we have a computer trying to guess the password of the AP. Each attempt constantly sends a 1500 byte packet and the network speed is at 11Mbps (11Million bits per second: 11,000,000 bits/s). How long does it take to enumerate through all password possibilites?
2 24 p a c k e t s × 1500 b y t e s p a c k e t × 8 b i t s 1 b y t e ÷ 11 M b p s = 18300 s 2^{24}\ packets \times \frac{1500bytes}{packet} \times \frac{8bits}{1byte} \div 11Mbps=18300s 224 packets×packet1500bytes×1byte8bits÷11Mbps=18300s
约5小时。密钥最大长度24bits,共224种组合,每试一下需要发送1500byte的包,1byte等于8bit要乘8,除以带宽11Mbps。
WPA:Wi-Fi Protected Access
2003年,802.11i
现有WEA硬件支持WPA(向上兼容!)
使用AES而不是RC4加密
避免冲突(Collision Avoidance)
MAC:distributed foundation wireless Medium Access Control:
介绍CSMA/CA (without RTS/CTS):
SIFS:short inter-frame space,发送者从发送数据包到收到ACK的时间
DIFS:distributed coordination function inter-frame space,检测到信道空闲后额外等待的时间
The Hidden Terminal Problem: 隐藏终端问题
"在无线网络中,当一个节点可以与一个无线接入点(AP)通信,但不能直接与其他与该AP通信的节点通信时,就会出现隐藏节点问题或隐藏终端问题。这导致了介质访问AC的困难,因为多个节点可以同时向接入点发送数据包,这在接入点产生干扰,导致数据包不能通过。“
设备之间过远无法检测信道繁忙与否(认为信道空闲,实际不空闲)
介绍CSMA/CA (with RTS/CTS)解决隐藏终端问题:
Request to send (RTS): Asking the AP to allocate a time. 向AP请求分配一个时间。
Clear to send (CTS): AP arranges the time and then tell everyone in the network. AP广播某个人的发送时间段,让别人这段时间别发东西。
这个发送时间段的正式名称为network allocation vector (NAV)
显然,由于RTS包和CTS包的存在,设备吞吐量减少了。因此只有在所有端节点分布的相当远或网络非常繁忙容易冲突的情况下使用。
The Exposed Terminal Problem:暴露终端问题
暴露终端问题:当设备之间距离过近,两个归属于不同AP的设备之间能够互相感知到对方的通讯。当他们本可以同时传输信息时(AP1和AP2在互相通讯距离之外。STA1打算向AP1发消息时,STA2正在向AP2发消息,使用同一信道,使得STA1能够通过物理载波认知到信道繁忙,然鹅实际上即时STA1向AP1发消息,并不会产生AP端的信号干扰),他们错认为各自所在的信道繁忙而不传输,从而造成浪费。(认为的繁忙不是真正繁忙)
暴露终端问题在多个AP(或者多个Receiver)时才有可能发生。
解决办法:
移动设备的IP随地理位置变化,如何让网络上的其他设备不用知道你的新地址就能给你发消息。移动IP在你作为服务提供者(“serviceprovider)的时候非常有用,“Not useful if you are carrying your laptop around to just watch videos.”
与移动ip相对的是固定ip,比如想要访问某个ip固定的主机,直接浏览器访问ip即可。如果这个被访问主机是个移动设备,则它一旦离开当前网络,就无法接受包了
Mobile IP的思想是用一个动态的IP地址对应一个移动设备,其主要思想是打隧道tunnelling。假设移动设备之前所在网络为HN,现在所在网络为FN
- | - |
---|---|
Mobile node (MN) | An end-system or router that can change its point of attachment to the internetusing mobile IP. 改变了位置的设备 |
Correspondent node (CN) | Another node that communicates with the MN. 与MN交流的设备 |
Home network (HN) | The network where MN belongs to. MN之前所属网络 |
Foreign network (FN) | The network which MN is currently visiting. MN当前所属网络 |
Care-of address (COA) | Define the current location of the MN from an IP point of view. All IP packets sent to the MN are delivered to the COA, not directly to the IP address of the MN.Think of it as a “delegate IP”. 隧道ip |
Home agent (HA) | The HA provides several services for the MN and is located in the home network. The tunnel for packets toward the MN starts at the HA. 隧道起点 |
Foreign agent (FA) | Like HA, it acts as tunnel endpoint and forward packets to the MN. 隧道终点 |
Agent Discovery Methods
MN如何发现自己的网络位置发生变化
通过以上方法,MN可以知道自己的COA,care-of-address (COA).
- The FA will receive IP packets and forward to MN. 如果MN在新环境中只有本地局域网地址,没有广域网地址,FA接收到的IP包都被转发至MN
- If MN gets a WAN address, the COA will just be this WAN address. (also called colocated COA)可以将隧道ip设为MN现在的广域网地址
Registration of COA注册COA
If COA is at the FA:隧道打到MN所在路由
If the MN Gets a WAN Address:隧道打通MA的广域网地址
MN then becomes the endpoint of the tunnel itself.
• Packets sent to HA will be forwarded directly to MN.
Mobile IP: IP Packet Delivery:打通隧道以后