Android in Practice笔记第二章

第二章

1. 给Application访问网络的权限:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
2. Android的权限
Android的每个权限Label保护相关的资源,在应用的manifest文件里声明的users-permission节点会在用户安装应用的时候提示给用户,用户确定之后表示这些相关的权限就授权给应用了。因此,应用程序在runtime是不做相关的检查的。在应用程序中执行一个没有授权的动作时,会抛出SecurityException的异常。
Android的权限定义在常量Manifest.permission类里。
你也可以自定义自己的权限,然后给Intent,Activity,Service和Broadcase使用。
3. Resources
Resource包括图片,国际化文字或者其他任意静态值。
Resource定义在/res目录下。
Resource可以在code里或者xml里访问。
4. Resource的特点
每个Resource都有ID
每个Resource都有一个固定的类型
Resource有特殊的存放位置和文件
5. 在/res目录下声明的Resource不仅作为你的应用程序的一部分被打包,而且也在程序里被访问。
一旦你定义一个resource在/res(除了/res/raw目录下,该目录下存放audio或者video文件等)目录下,Android平台会自动解析它,然后使用aapt工具去关联一个ID到R上。
6. 为什么会有Resources
第一,隔离了代码和外部资源,这样就能保证代码关注于应用以及整洁
第二,Resources高效并且快速的被访问到,因为XML被编译成为二进制格式
第三,Resources支持在运行时根据环境(比如语言,屏幕配置以及硬件能力等)来动态加载
7. Plurals资源(复数)
Plural是用来让系统自动处理复数字符串的一类型特殊资源,这个主要用于处理英语里名词的单数和复数用的。
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<plurals name="deal_service_new_deal">
<item quantity="one">1 new deal!</item>
<item quantity="other">
<xliff:g id="count">%d</xliff:g>
new deals!
</item>
</plurals>
</resources>
注意:
1) xmlns:xliff是指定OASIS XLIFF XML format
2) 需要定义两个item,一个one,另一个other。就是区分单数和复数的不同显示
3) 在item节点里可以使用String.format
4) 使用Resources.getQuantityString(R.plurals.deal_service_ new_deal, 1)来访问Plurals资源。(这里传入的是1,也可以传入其他数字)
8. 字符串资源放在/res/values目录下
9. Assets
如果你需要普通访问而不是被aapt处理过的文件,你就可以把文件放到/assets目录下。任何放在/assets文件夹下的文件都可以被应用访问。
10. Views and widgets
Android.view.View是所有视图的基类。分为三大类主要的Views:
1) SurfaceView:可以在其上通过drawing和graphics画出界面
2) ViewGroup:对应于各种Layout以及Group容器
3) Widget:android.widget包下的各种Android提供的控件
11. Intents和IntentFilters
Intent描述你想做什么操作,他不做任何实际的操作,仅仅描述什么事情需要去做。
IntentFilter用于声明Component处理哪些指定的Intent。
12. 发起分享Intent
Intent i = new Intent(Intent.ACTION_SEND);
i.setType(type);
i.putExtra(Intent.EXTRA_SUBJECT, "Subject:");
i.putExtra(Intent.EXTRA_TEXT,”abc”);
startActivity(Intent.createChooser(i, "Share deal ..."));

最后这一行代码里,通过Intent.createChooser(I,"Share deal …"))去创建了一个chooser,"Share deal …"会作为共享界面的Title,并且会通过Chooser挑出符合该Intent的选项,并且不会出现选择默认选项。如图所示:


将上面的代码改为下面的之后:
startActivity(i);


13. Intent分类
1) 显式的Intent(explicit),这个一般用在应用的内部,需要知道Component的具体名字以及类名。
2) 隐式的Intent(implicit),跟外部的应用联系时,使用隐式的。
隐式Intent通过action,data,type等属性被平台解析找到相应的能处理的组件。
14. Intent解析
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
这里MAIN和LAUNCHER用于声明Component能够响应Home按钮。
<intent-filter>
<action android:name="android.intent.action.SEND" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="text/plain" />
</intent-filter>
这个IntentFilter解析过程:
I. Action(SEND)
II. Category(DEFAULT),使用startActivity方法启动一个隐式的Intent的时候,都会自动为其加一个DEFAULT的category
III. Data
Android通过PackageManager去追踪有哪些注册的IntentFilter。当一个新应用安装的时候,应用里的IntentFilter就被加到PackageManager,被卸载的时候就删除。
15. Application对象
Application对象有定义完善的生命周期,可以被用来存放应用的全局状态。
Application对象会在应用程序进程创建的时候创建,不会跟Activity或者Service等Component的生命周期挂钩
Application对象继承Application类,里面有onCreate方法
在Manifest文件里使用android:name="你实现的Application类名"来给你的应用程序指定你自定制的Application对象:
<application android:icon="@drawable/ddicon"
android:label="@string/app_name"
android:name=".DealDroidApp">
16. ConnectivityManager
this.cMgr = (ConnectivityManager)this.getSystemService(Context.CONNECTIVITY_SERVICE);
ConnectivityManager是系统服务,可以通过它去检查网络状态

17.

你可能感兴趣的:(android)