Android

  • 安卓基础
    1. 应用的运行:
      独立的进程process+主线程,独立的虚拟机Dalvik VM,独立的用户权限package
      任务堆栈Task Stack可以跨应用组件,给用户流畅的使用体验,Back返回活动,Home回主页
    2. 组件的运行: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等,
    3. 布局可嵌套,通常有Main Action Bar标题栏,View Control视图切换,Content Area内容列表和Split Action Bar操作按钮
      LinearLayout:线性布局,
      TableLayout:表格布局,TableRow行
      RalativeLayout:相对布局,toLeftOf上下左右,alignRightOf右对齐,
    4. 视图组件及相关功能类:
      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))
    5. 简短提示和对话框:
      Toast.makeText(activity,string,Toast.LENGTH_SHORT).show(),简短提示
      AlertDialog.Builder初始化title icon view button等并showDialog,
      Activity属性android:theme="android:style/Theme.Dialog"伪装对话框
    6. 数据适配器
      下拉列表,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}
  • 界面适配
    1. 屏幕密度,单位英寸内有多少像素,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
    2. 模拟器分辨率(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.11
      HVGA            320*480        160        3.61
      WVGA800      480*800        240       3.88
      WVGA854      480*854        240       4.08

      WXGA720      720*1280      320       4.59
      WXGA800      800*1280      160       9.43
    3. 适配不同分辨率尺寸
      组件使用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,左侧拉伸右侧不变
    4. 多语言:values默认英文,values-zh中文,values-zh-rTW繁体
    5. 虚拟机配置
      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),以便显示完整大屏幕
  • 常见问题
    1. 模拟器应用映射访问本机服务:
      若有局域网可直接使用ip,否则使用10.0.2.2映射到本机tomcat服务端,然后再修改模拟器hosts
      adb pull /system/etc/hosts
      adb push hosts /system/etc #修改hosts文件后,这个可能比较麻烦(/system/etc只读)
    2. 集成Maven:从Eclipse Marketplace搜索android m2e并安装Android Connector for Maven,下载构件模板de.akquinet.android.archetypes:android-quickstart:1.0.8
    3. 安卓开机自启动:定义系统启动广播接收者并添加相应权限,收到启动完成消息后注册自己的后台服务
      <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"/>
    4. 加载网络图片:需要访问网络权限,通常会本地缓存图片文件(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")
    5. 动画与图像:
      可用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()
    6.  
  • 渠道打包:
    1. 创建keystore,使用向导创建并记住密码export->export android application->create new keystore
    2. 创建build.properties,
      sdk.dir=D:\\adt-bundle-windows-x86_64\\sdk
      key.store=tuijian.key
      key.store.password=tbhjc303
      key.alias=tuijian
      key.alias.password=tbhjc303
      dont.do.deps=false //有library依赖时
    3. 创建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>
    4. 渠道处理:先备份原文件(含${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>
    5. 可以考虑在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>
    6. 代码混淆:
      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);
      }
    7. 友盟统计:
      添加sdk依赖到libs,umeng_sdk.jar
      配置AndroidManifest.xml,权限要求INTERNETREAD_PHONE_STATEACCESS_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方法添加统计代码
      @Override
      protected void onPause() {
          super.onPause();
          MobclickAgent.onPause(this);
      }
      @Override
      protected void onResume() {
          super.onResume();
          MobclickAgent.onResume(this);
      }
  • 版本更新:手动下载更新,自动下载安装,安卓市场更新
    1. 检查新版本:版本号,版本名称,[文件校验,更新说明]
    2. 比较版本号,可更新时提示,本地版本号Activity.getPackageManager().getPackageInfo("package",0).versionCode
    3. 下载更新版,保存为app_version.apk(文件校验可选)
    4. 提示安装更新,重启
  • 常用命令,需要将tools和platform-tools目录添加到${path}变量
    1. android help,
      • 运行升级工具android sdk,运行虚拟机管理器android avd
      • 查看虚拟机android list avd,启动模拟器emulator -avd name -sdcard sdcard.img
    2. 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
        1. 目录查看ls,多级目录查看ls */*,目录跳转cd dir,文本查看cat textFile,删除文件rm -f *.mp3、rm -f */*,删除目录rmdir dirPrefix*
        2. 应用私有数据目录cd /data/data/{package}/
          数据库文件databases/,sqlite3 soyinke_app可进入应用私有数据库
          私有属性文件shared_prefs,cat soyinke_login.xml可显示登录配置信息
        3. 数据库查看,sqlite3 dbfile进入数据库,.help查看帮助信息,.exit | .quit退出
          .tables查看数据库表
          .dump [table],.import file table导入导出数据
          sql;执行SQL语句,如select * from tbl_user_info;
        4. 环境变量set
          PATH=/system/bin:/system/xbin,这两个目录里面有许多可用命令
  • 智能手机平台
    1. 界面易用(多点触摸),功能强大(多任务),兼容扩展(地图、信息、多媒体等)
    2. 安卓架构:
      三方应用:*.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
    3. 常见平台:
      塞班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

 
 
 




posted @ 2012-06-15 11:37 xlongwei 阅读(...) 评论(...) 编辑 收藏
xlongwei