- 安卓基础
- 应用的运行:
独立的进程process+主线程,独立的虚拟机Dalvik VM,独立的用户权限package
任务堆栈Task Stack可以跨应用组件,给用户流畅的使用体验,Back返回活动,Home回主页 - 组件的运行:Main Activity由系统启动,退出应用时:结束活动、停止服务、注销广播监听
Activity,setContentView(layout)界面,startActivity(intent)跳转,finish终止
Service,startService+onStart运行,bindService+onBind绑定,stopSelf+stopService(intent)停止
BroadcastReceiver,Activity.registerReceiver注册,广播监听由系统广播激活并自动终止
ContentProvider,由ContentResolver请求时激活并自动终止
Intent,消息,putExtras(name,value)+get[Type]Extra(name,defaultValue)基本类型;Action有MAIN、VIEW、EDIT、CALL等, - 布局可嵌套,通常有Main Action Bar标题栏,View Control视图切换,Content Area内容列表和Split Action Bar操作按钮
LinearLayout:线性布局,
TableLayout:表格布局,TableRow行
RalativeLayout:相对布局,toLeftOf上下左右,alignRightOf右对齐, - 视图组件及相关功能类:
TextView:文本标签
Button:按钮,OnClickListener
RadioGroup、RadioButton、CheckBox:单选按钮组合,复选框,OnCheckedChangeListener
ProgressBar:滚动条,样式有水平、垂直、旋转等,setProgress进度
Spinner:下拉列表,setAdapter,setDropDownViewResource,onItemSelectedListener
ListView:列表,继承ListActivity,setListAdapter(new SimpleAdapter(ctx,list<map>,rowLayout,{keyArray},{idArray}))
GridView:表格,setAdapter(ImageAdapter),onItemClickListener
WebView.loadUrl(url),.loadData(html,"text/html","utf-8"),加载网页
VideoView:视频,setVideoPath("*.3gp"),.setMediaController(new MediaController(this)) - 简短提示和对话框:
Toast.makeText(activity,string,Toast.LENGTH_SHORT).show(),简短提示
AlertDialog.Builder初始化title icon view button等并showDialog,
Activity属性android:theme="android:style/Theme.Dialog"伪装对话框 - 数据适配器
下拉列表,ArrayAdapter.createFromResource(this,R.array.planets,android.R.layout.simple_spinner_item)
列表,new SimpleAdapter(ctx,list<map>,rowLayout,{keyArray},{idArray})
图片表格,ImageAdapter.getView(position){return ImageView.setImageResource(imgs[positon]);},Integer[] imgs = {R.img}
- 应用的运行:
- 界面适配
- 屏幕密度,单位英寸内有多少像素,density=sqrt(width^2+height^2)/inch,尺寸inch通常是对角线长度,密度有低中高l=120、m=160、h={240,320},
获取分辨率和密度:getWindowManager().getDefaultDisplay().getMetrics(dm = new DisplayMetrics()),dm属性density、widthPixels+heightPixels等
-hdpi 72*72 -mdpi 48*48 -ldpi 36*36 - 模拟器分辨率(small-normal-large-xlarge),密度(ldpi-mdpi-hdpi-xhdpi),尺寸,旋转(land-port)
QVGA 240*320 120 3.33
WQVGA 240*400 120 3.88
WQVGA432 240*432 120 4.11HVGA 320*480 160 3.61WVGA800 480*800 240 3.88WVGA854 480*854 240 4.08
WXGA720 720*1280 320 4.59WXGA800 800*1280 160 9.43 - 适配不同分辨率尺寸
组件使用wrap_content和fill_parent适配环境,使用layout_width和layout_weight适配宽度和剩余空间
组件使用相对布局灵活定位,layout_below居下,layout_alignParentRight最右,layout_toLeftOf左侧,layout_alignTop上对齐
不同尺寸有不同布局,res/layout/main.xml和res/layout-large/main.xml或res/layout-sw600dp/main.xml(3.2+)
避免布局文件内容重复,原布局文件res/layout/main_twopane.xml,另外large和sw600dp引用即可res/values-large/layout.xml
<resources> <item name="main" type="layout">@layout/main_twopanes</item></resources>
考虑横屏,建立布局onepane(sw600dp-port) onepane_with_bar twopanes(large-land) twopanes_narrow(large-port),适配引用
背景使用九宫图,9-patch png,sdk/tools/draw9patch.bat,左侧拉伸右侧不变 - 多语言:values默认英文,values-zh中文,values-zh-rTW繁体
- 虚拟机配置
sdcard,存储卡可以共用文件
skin,皮肤可以选择模拟器分辨率、或自定义输入(如1024X768模拟pad平板)
Max VM application heap size,若出现Out of Memory错误说明太耗内存,可暂时给虚拟机上的应用配置较大内存
Device Ram Size,虚拟机设备内存,start -> scale display to real size,运行时可以缩放屏幕(如screen size: 10in、scale: 0.77),以便显示完整大屏幕
- 屏幕密度,单位英寸内有多少像素,density=sqrt(width^2+height^2)/inch,尺寸inch通常是对角线长度,密度有低中高l=120、m=160、h={240,320},
- 常见问题
- 模拟器应用映射访问本机服务:
若有局域网可直接使用ip,否则使用10.0.2.2映射到本机tomcat服务端,然后再修改模拟器hosts
adb pull /system/etc/hosts
adb push hosts /system/etc #修改hosts文件后,这个可能比较麻烦(/system/etc只读) - 集成Maven:从Eclipse Marketplace搜索android m2e并安装Android Connector for Maven,下载构件模板de.akquinet.android.archetypes:android-quickstart:1.0.8,
- 安卓开机自启动:定义系统启动广播接收者并添加相应权限,收到启动完成消息后注册自己的后台服务
<receiver android:name="package.receiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
<category android:name="android.intent.category.HOME" />< /intent-filter>
</receiver>
< uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/> - 加载网络图片:需要访问网络权限,通常会本地缓存图片文件(png优先jpg可接受gif不推荐)
URL url = new URL(img);
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
Bitmap bm = BitmapFactory.decodeStream(conn.getInputStream());
ImageView.setImageBitmap(bm);
<uses-permission android:name="android.permission.INTERNET" />
图片支持jpg gif pg bmp,音频格式aac mp3 wav ogg mid,视频3gp mp4
MediaPlayer.create(raw.id),setDataSource(pathOrUrl),reset+prepare,start+pause+stop
录音MediaRecorder.setAudioSource(MIC).setOutputFormat(THREE_GPP).setAudioEncoder(AMR_NB).setOutputFile(path)
.prepare.start.stop.release,ContentResolver.getDataFilePath(contentResolver.insert(MediaStore.Audio.INTERNAL_CONTENT_URI,values)),values=new ContentValues(3).put(MediaColumn.TITLE,"title") - 动画与图像:
可用XML定义图像,如TransitionDrawable:transition,getResources().getDrawable(R.drawable.trans_id).startTransition(1000),ImageView.setImageDrawable(tran)
补间动画,如alpha scale translate retate set,AnimationUtils.loadAnimation(this,R.anim.set_anim),ImageView.startAnimation(setAnimation)
帧动画,animation-list+item,ImageView.setBackgroundResource(R.anim.frame_anim),(AnimationDrawable)imageView.getBackground().start()、isRunning()、stop() -
- 渠道打包:
- 创建keystore,使用向导创建并记住密码export->export android application->create new keystore
- 创建build.properties,
sdk.dir=D:\\adt-bundle-windows-x86_64\\sdk
key.store=tuijian.keykey.store.password=tbhjc303key.alias=tuijiankey.alias.password=tbhjc303dont.do.deps=false //有library依赖时 - 创建build.xml构建脚本,android update project -p project-dir -t target自动生成构建文件build.xml
<?xml version="1.0" encoding="UTF-8"?><project name="slidingmenu" default="help" ><property file="build.properties" /><loadproperties srcFile="project.properties" /><fail message="sdk.dir is missing." unless="sdk.dir" /><!-- 实际构建执行脚本引入 --><import file="${sdk.dir}/tools/ant/build.xml" /><!-- 调用release任务打包,分发渠道时需要埋入渠道串 --><target name="package"><antcall target="release"></antcall></target></project> - 渠道处理:先备份原文件(含${channelcode})供每次打包前恢复,最后重命名时可以考虑加入版本号
<target name="replace_channel_string"><replace file="./res/values/strings.xml" token="${channelcode}" value="${channel-code}"></replace><replace file="./AndroidManifest.xml" token="${channelcode}" value="${channel-code}"></replace></target>
<target name="release-channel"><antcall target="restore_channel_config"></antcall><antcall target="replace_channel_string">
<param name="channel-code" value="${channel-code}"></param></antcall><antcall target="release"></antcall><rename dest="./dist/tuijian_${channel-code}.apk" src="./bin/tuijian-release.apk" /></target>
<antcall target="release-channel"><param name="channel-code" value="wandoujia"></param></antcall> - 可以考虑在build.properties添加渠道串,在build.xml里遍历循环
引入foreach任务元素,需要下载ant-contrib-1.0b3.jar
<taskdef name="foreach" classname="net.sf.antcontrib.logic.ForEach" classpath="ant-contrib-1.0b3.jar" />
build.properties添加所有渠道
apk.channels=taoban,wandoujia,anbei,sogou,meizu,qq,sohunews,google,91,hiapk,gfan,goapk,appchina,mumayi,eoe,nduo,feiliu,crossmo,huawei,3g,360,baidu,sohu,163,uc,dangle,samsung,moto,xiaomi,lenovo,nearme,cmcc
apk.version=1.0
遍历渠道打包
<target name="release-channels"><antcall target="backup_channel_config"></antcall><foreach target="release-channel" list="${apk.channels}" delimiter="," param="channel-code"/><antcall target="restore_channel_config"></antcall></target> - 代码混淆:
project.propertiers
去掉注释proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
proguard-project.txt
# for sina weibo sdk: weibo_sdk_0821.jar-dontwarn com.weibo.sdk.android.**-dontwarn android.net.http.**# for model classes-keep class com.taoban.tuijian.model.** {void set*(***);void set*(int, ***);boolean is*();boolean is*(int);*** get*();*** get*(int);} - 友盟统计:
添加sdk依赖到libs,umeng_sdk.jar
配置AndroidManifest.xml,权限要求INTERNET,READ_PHONE_STATE,ACCESS_NETWORK_STATE,
<meta-data android:value="523e64ee56240bb65a0075c0" android:name="UMENG_APPKEY"></meta-data><meta-data android:value="taoban" android:name="UMENG_CHANNEL"/>
给所有Activity的onPause和onResume方法添加统计代码
@Overrideprotected void onPause() {super.onPause();MobclickAgent.onPause(this);}@Overrideprotected void onResume() {super.onResume();MobclickAgent.onResume(this);}
- 版本更新:手动下载更新,自动下载安装,安卓市场更新
- 检查新版本:版本号,版本名称,[文件校验,更新说明]
- 比较版本号,可更新时提示,本地版本号Activity.getPackageManager().getPackageInfo("package",0).versionCode
- 下载更新版,保存为app_version.apk(文件校验可选)
- 提示安装更新,重启
- 常用命令,需要将tools和platform-tools目录添加到${path}变量
- android help,
- 运行升级工具android sdk,运行虚拟机管理器android avd
- 查看虚拟机android list avd,启动模拟器emulator -avd name -sdcard sdcard.img
- adb help
- 查看设备状态adb devices,必要时重启服务adb kill-server
- 传输文件或目录adb (push | pull) srcFileOrDir dstDir,mksdcard 256M sdcard.img生成镜像卡
- 上传并安装应用adb install apkFile,-r重新安装,-s安装到sdcard,adb uninstall package卸载应用,adb uninstall|rm apkFile
- 进入模拟器控制台adb -e shell
- 目录查看ls,多级目录查看ls */*,目录跳转cd dir,文本查看cat textFile,删除文件rm -f *.mp3、rm -f */*,删除目录rmdir dirPrefix*
- 应用私有数据目录cd /data/data/{package}/
数据库文件databases/,sqlite3 soyinke_app可进入应用私有数据库
私有属性文件shared_prefs,cat soyinke_login.xml可显示登录配置信息 - 数据库查看,sqlite3 dbfile进入数据库,.help查看帮助信息,.exit | .quit退出
.tables查看数据库表
.dump [table],.import file table导入导出数据
sql;执行SQL语句,如select * from tbl_user_info; - 环境变量set
PATH=/system/bin:/system/xbin,这两个目录里面有许多可用命令
- android help,
- 智能手机平台
- 界面易用(多点触摸),功能强大(多任务),兼容扩展(地图、信息、多媒体等)
- 安卓架构:
三方应用:*.java->javac->*.class->dx->*.dex+res->apt->*.ap_+AndroidManifest.xml = *.apk
系统应用:Contacts Phone SMS Browser
应用框架:Activity Service BroadcaseReceiver Intent ContentProvider
库与运行时:SQLite Media WebKit Surface,DavikVM OpenGL FreeType SSL
硬件支撑:Camera Wifi sdcard Audio Display Keypad Power BlueTooth - 常见平台:
塞班Sybian,S60SDK(java Sybian-C++),Ovi Store
蓝梅BlackBerry,BlackBerrySDK(java),App World
苹果iPhone,iPhone SDK(objective-c),App Store
安卓Android,Android SDK(java c++),Android Market
微软WinMobile,Windows Mobile SDK(c#),Windows Marketplace