-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathAndroid笔记.txt
executable file
·211 lines (182 loc) · 7.83 KB
/
Android笔记.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
1.活动的声明周期:
OnCreate -> OnStart -> OnResume -> OnStop -> OnDestroy
-> OnRestart -> OnStart
2.活动之间传递值:
Bundle 传递简单的值,比如字符串之类的
OnSaveInstanceState 活动被销毁之前触发
所有设置了ID属性的控件默认都将会保存信息
home、back不会触发该事件
OnRestoreInstanceState OnCreate之后触发
自定义对象
OnRetainNonConfigurationInstance
LastNonConfigurationInstance
* 屏幕方向切换后,当前活动将重新创建一个新的实例(也就是说旧实例的实例属性都被清掉了,只有静态属性会被保留下来)
3.三个设置版本:
Target Framework 目标版本,也就是采用这个版本去编译
Minimum Android Version 最低允许运行版本
Target Android Version 期待的运行版本,一般也就是Target Framework
4.在指定版本上运行某些功能:
if(Android.OS.Build.Version.SdkInt >= Android.OS.BuildVersionCodes.Lollipop)
builder.SetCategory(Notification.CategoryEmail);
5.Android libray的版本设置:
引用库:应用的编译版本应该 >= 引用库的编译版本
创建库:库的编译版本应该 = 应用的最低版本
6.处理横竖屏的两种方式:
自动,使用不同的layout:
layout目录下面建立一个layout-land的目录,表明里面放置的是屏幕横立时的layout
* drawable与此相同
手动,检测当前方向:
WindowManager.DefaultDisplay.Rotation
竖向:SurfaceOrientation.Rotation0 或者 SurfaceOrientation.Rotation180
横向:90,270
为控件设置不同的RelativeLayout.LayoutParams
7.阻止横竖屏导致的重新开始,重复的OnCreate:
活动上添加以下属性:
ConfigurationChanges=Android.Content.PM.ConfigChanges.Orientation | Android.Content.PM.ConfigChanges.ScreenSize
重载 OnConfigurationChanged 方法:
OnConfigurationChanged(Android.Content.Res.Configuration newConfig){
base.OnConfigurationChanged (newConfig);
if(newConfig.Orientation == Android.Content.Res.Orientation.Portrait){}
}
8.描画
Drawable Resources
放置在Resources/drawable文件夹下
ShapeDrawable、StateListDrawable、LayerDrawable、TransitionDrawable、LevelListDrawable、ScaleDrawable/ClipDrawable、InsetDrawable、BitmapDrawable
Canvas
9.动画
View Animations
根节点:alpha、rotate、scale、translate、set
动画类型:AcclerateInterpolator/DecelerateInterpolator-加速/减速 BounceInterpolator-最后弹起 LinearInterpolator-恒定速度
Property Animations
ValueAnimator、ObjectAnimator、AnimationSet
ValueAnimator.OfInt、ValueAnimator.OfFloat、ValueAnimator.OfObject
Drawable Animations
多个画面之间进行顺序切换,类似于幻灯片,放置于/Resource/drawable 目录下
10.安卓资源
有以下资源目录:
animator
anim
color
drawable
layout
menu
raw
values
xml
11.手机的屏幕尺寸原来指的是对角线。。。
ppi:每英寸像素数 - Pixel per inch, 设备的点密度
dpi:每英寸多少点 - dot per inch, 印刷品点密度
dpi=(√(横向分辨率^2+纵向分辨率^2))/屏幕尺寸
dip/dp:设备独立像素 - Density-independent pixel
dp = pixels/(dpi/160)
*指定物理宽度能显示的像素数量
*抽象意义上的像素,安卓上假定的默认显示设备是160dpi
*这个公式计算出的像素,最后在各分辨率的屏幕上宽度都一样
*密度越高,能显示的像素就越多,占用的物理宽度就越少
* 即同一图片在低密度屏上显得很大,而在高密度屏上很小
换算方式:
PPI = √(长度像素数² + 宽度像素数²) / 屏幕对角线英寸数
dp = px*160/ppi
pixelRatio = pix/dp
12.布局
ldpi mdpi hdpi
Launcher、menu 36*36 48*48 72*72
tab、Dialog、ListView、StatusBar 24*24 32*32 48*48
API Level 13(Android 3.2)以上推荐使用dp来使用不同的布局:
例如:layout-sw700dp
典型的手机 320dp
5寸平板/手机 480dp 三星note
7寸平板 600dp
10寸平板 720dp
13以下使用small/normal/large/xlarge来区分,对应关系:
small 426*320
normal 470*320
large 640*480
xlarge 960*720
* 单位为dp
布局基准:
只为需要的屏幕进行设计
使用dp而不是pixel
避免使用AbsoluteLayout,使用LinearLayout,RelativeLayout与GridLayout
选择一个默认方向
使用Layout参数
wrapcontent, fillparent, 样式使用dp参数
13.区域化参数
values文件夹名区分
values、values-de、values-es
* 区域化比较耗时,所以很多程序都不提供
* 3个基准:layouts越少越好,默认区域要测试完整(程序连默认的资源都找不到时会崩溃),只做需要的区域化
14.Assets 用来读取未经过加工的数据
string content;
using (StreamReader sr = new StreamReader (Assets.Open ("read_asset.txt")))
{
content = sr.ReadToEnd ();
}
Resources下面归属于资源系统管理
15.服务-Started Services、Bound Services
Started Services分为3类:
自己内部用的并可以并发同时访问的、外部程序可调用的、队列顺序执行的
前两个运行在主线程中,做耗时操作时仍需自己再开线程
后者运行在新开的线程中,无需自己手动再开线程
* 后者继承自IntentService,并且需事先父类带string的构造函数:
* public MyIntentService:base("MyIntentService"){}
OnCreate
OnStartCommand
返回StartCommandResult枚举值,Sticky使用空Intent重启,RedeliverIntent 使用最后的Intent重启
OnDestroy
* OnBind 返回IBinder(Bound Service需要)
* 类以Service属性修饰
* 需要在AndroidManifest.xml中声明:<service android:name="demoservice.DemoService"></service>
开启与关闭服务:
StartService、StopService(Context中)
StopSelf、StopSelfResult(Service中)
其他应用可启动的服务:
* 需要用IntentFilter在类上修饰属性,同时需要在AndroidManifest.xml中声明
开启:StartService (new Intent ("com.xamarin.DemoService"));
关闭:StopService (new Intent ("com.xamarin.DemoService"));
16. 发送一条顶部通知:
var nMgr = (NotificationManager)GetSystemService (NotificationService);
var notification = new Notification (Resource.Drawable.Icon, "Message from demo service");
var pendingIntent = PendingIntent.GetActivity (this, 0, new Intent (this, typeof(DemoActivity)), 0);
notification.SetLatestEventInfo (this, "Demo Service Notification", "Message from demo service", pendingIntent);
nMgr.Notify (0, notification);
发送一条顶部不消失的通知:
StartForeground(Service中的方法)
StopForeground
发送一条一闪而逝提醒通知:
Toast.MakeText (this, "The demo service has started", ToastLength.Long).Show();
service中需要使用Handler:
var myHandler = new Handler ();
myHandler.Post(() => {
Toast.MakeText (this, "Message from demo service", ToastLength.Long).Show();
});
* 还有其他两种跟UI交互的方式:
Android.App.Application.SynchronizationContext.Post()
System.Threading.SynchronizationContext.Current.Post()
17.多媒体
音频
播放 MediaPlayer
录音 MediaRecorder
通知
底层版 AudioTrack(播放)、AudioRecord(录音)
18.后台运行
StartedService
BoundService
HybridService
本地:
StartService();
BroadcastReceiver
远程:
Messenger
AIDL(支持多线程)
19.Fragments有3个子类:
ListFragment
DialogFragment
PreferenceFragment
* 安卓3.0以下,兼容包对前两个做了支持,最后一个没有做支持
20.列表的使用
调用安卓的方法时,需要使用Android.Runtime下面的类型,这样再初始化后再改变,在托管代码中才可见
var badSource = new List<int> { 1, 2, 3 };
var badAdapter = new ArrayAdapter<int>(context, textViewResourceId, badSource);
badAdapter.Add (4);
if (badSource.Count != 4) // true