《第一执代码》书籍读笔记

流动:书籍读笔记,方便查看 第1章 发轫起身,你的率先行Android代码

第2章节 先从看得到的入手,研究活动

1.躲标题栏

  在onCreate()方法被加上:
  requestWindowFeature(Window.FEATURE_NO_TITLE);//不在移动中突显标题栏。
  需要在setContentView()此前实施。
2.Intent凡是Android程序中各样组件之间开展交互的平等栽重点艺术,它不只可指明当前组件想只要执行的动作,还可以够在不同组件之间传递数据。Intent一般然则给用于启动活动、启动服务、以及发送广播等现象。
3.<data>标签中要害可以配备以下内容:
  (1)android:scheme
    用于指定数量的商事部分,如http。
  (2)android:host
    用于指定数量的主机名有,如www.baidu.com。
  (3)android:port
    用于指定数量的端口部分,一般困难按在主机名自此。
  (4)android:path
    用于指定主机名及端口之后的局部,如一段子网址中以及在域名下的内容。
  (5)android:mimiType
    用于指定可以处理的数据类型,允许利用通配符的主意开展点名。
4.onStop()和onPause()方法的要区别在:倘诺开行之初运动是一个会话框式的位移,那么onPause()方法就谋面取得推行,而onStop()方法并无会面履行。

第3回 软件为如合并脸蛋,UI开发的点点滴滴

1.ProgressDialog施用setCancelable()中传了false,表示ProgressDialog是未可知通过Back键废除掉的,
2.TableLayout布局可以拔取android:stretchColumns属性允许以TableLayout中的某个同排进行拉伸,以达成机关适应屏幕宽度的来意。
3.Array艾达pter好透过泛型来指定要适配的数据类型,然后在构造函数中把要适配的数据传即可。
4.android.R.layout.simple_list_item_1凡是Android内置的布局文件,里面只有发一个TextView,可用以简单地显示同一截文本。
5.dp凡是密度无关像素的意,在不同密度的屏幕被展现比例将保持一致。sp是可伸缩像从的意思,解决文字大小的适配问题。
6.Android中之密度就是屏幕每英寸所含有的比如说素数,通常以dpi为单位。
7.Nine-Patch图片是如出一辙栽为优异处理了之png图片,可以指定哪些区域可以被拉伸而哪些区域不可以。

第4回 手机平板要兼顾,研究碎片

1.零碎(Frgament)是平等种植可以坐在运动中的UI片段,它会为程序更加合理和充裕地使好屏幕的半空中,因而在机械上行使之老大常见。
2.FragmentTransaction挨提供了一个addToBackStack()方法,可以用来将一个事务添加到回栈中。
3.为好碎片及运动中开展通信,FragmentManager提供了一个接近于findViewById()的方法,专门用来从布局文件被获取碎片的实例。
  RightFragment rightFragment = (RightFragment)
getFragmentManager().findFragmentById(R.id.right_fragment);
4.Android中有大面积的限定符:
  大小: small        —提供被小屏幕设备的资源
        normal   —提供被中屏幕设备的资源
     large    —提供被那些屏幕设备的资源
       xlarge     —提供被超大屏幕设备的资源
  分辨率: ldpi          —提供于低分辨率设备的资源(120dpi以下)
      mdpi        
—提供于中分辨率设备的资源(120dpi届160dpi)
      hdpi     —提供给高分辨率设备的资源(160dpi到240dpi)
      xhdpi  
   —提供给过高分辨率设备的资源(240dpi到320dpi)
  方向: land        —提供给横屏设备的资源
      port        —提供给竖屏设备的资源
5.然而小增幅限定符允许咱们本着屏幕的宽度指定一个无限小因(以dp为单位),然后坐这极端小值为逼价,屏幕宽度大于此价的设备就是加载一个布局,屏幕宽度小于是价的装置就是加载另一个布局。
  如layout-sw600dp文件夹着的布局,当屏幕运行在屏幕宽度超越600dp的设施及平日,会加载layout-sw600dp中的布局,当程序运行在屏幕宽度小于600dp的装置及时时,则依然加载默认的layout中之布局。
  最小增幅限定符是在Android3.2版本引入的。
6.TextView的属性
  android:singleLine设置为true表示给这TextView只可以单行显示。
  android:ellipsize用于设定文本内容超控件宽度时,文本的缩略情势,设置也”end”表示在尾部举办缩略。
7.ImageView的属性
  android:scaleType属性设置也fitXY,表示为这张图片填充满整个控件的大小。

第5回 全部非凡喇叭,详解广播机制

1.Android受之播音重要得分为两体系型,标准广播和数年如一广播。
  标准广播(Normal
broadcasts)是平种植了异步执行的广播,在广播发出后,所有的播音接收器几乎都碰面当同样时刻接收至及时长达广播音讯,因而它之间一贯不另外先后顺序可言。这种广播的效率会较高,单同事也表示其是无能为力给截断的。
  有序广播(Ordered
broadcasts)则是平种植共同执行的播放,在广播发出后,同一时刻才汇合起一个播接收器可以接这条广播音信,当是广播接收器中的逻辑执行了后,广播才汇合继续传递。所以这时之播音接收器是暴发先后顺序的,优先级赛的播放接收器就得事先吸收广播音讯,并且前面的广播接收器还可截断正在传递的播音,这样后的播音接收器就饿不能接收广播音信了。
2.登记广播的计相似有一定量栽,在代码中登记和在AndroidManifest.xml中登记,其中前者也吃叫做动态注册,厚泽也于叫作静态注册。
3.当网络状态暴发变化时,系统出之正是同长条值为android.net,.conn.CONNECTIVITY_CHANGE的播报,监听需要权限<uses-permission
android:name=”android.permission.ACCESS_NETWORK_STATE”/>。
4.访问http://developer.android.com/reference/android/Manifext.permission.html可以查看Android系统所有可声明的权限。
5.Android系统启动完成后相会发同样久值为android.intent.action.BOOT_COMPLETED的广播,监听需要权限<uses-permission
android:name=”android.permission.RECEIVE_BOOT_COMPLETED”/>。
6.并非以onReceive()方法中上加过多的逻辑或者拓展此外的耗时操作,因为在播放接收器中是免容许被线程的,当onReceive()方法运行了较长期而没有收时,程序虽然会拧。
7.广播凡千篇一律种好超过进程的通信格局。
8.发送有序广播:
  sendOrderedBroadcast(intent,null);
  接受广播AndroidManifest.xml:<intent-filter
android:priority=”100″>
    onReceive(){… abort布罗德(Broad)cast();//截断这长长的广播}
9.当地广播机制,使用那一个机制暴发的广播就会当应用程序的里边开展传递,并且广播接收器只可以接收来自遵从应用程序发出之播报。
  本地广播首要就是是选择了一个Local布罗德(Broad)castManager来对播音继续宁管理,并提供了发送广播和登记广播接收器的艺术。
  private LocalBroadcastManager localBroadcastManager;
  local布罗德(Broad)castManager =
Local布罗德castManager.getInstance(this);//获取实例
  local布罗德castManager.send布罗德cast(intent);//发送本地广播
  local布罗德castManager.registerReceiver(localReceiver,
intentFilter);//注册本地广播监听器
  本地广播是心有余而力不足通过静态注册的法来经受之。其实这吗是截然好知道,因为静态注册重要就是以给程序于匪启动的气象下啊能接收广播,而发送本地广播时,大家的主次是就启动了,由此呢完全不需要使用静态注册的功用。
  本地广播的几触及优势:
  (1)可以肯定地精通在发送的播报不会师去我们的程序,因而不需操心机密数据外泄的题目。
  (2)其他的主次不能用播发送至我们先后的中间,由此不欲贪心会发生安全漏洞的隐患。
  (3)发送本地广播于从发送系统全局广播将会还敏捷。
10.于播音接收器里启动活动,因而一定要于Intent插足FLAG_ACTIVITY_NEW_TASK这些标志。需要将对话框的门类设为TYPE_SYSTEM_ALERT,那样对话框在播放接收器里能够弹出。
11.弹生出系统级另外对话框,必须使讲明android.permission.SYSTEM_ALERT_WINDOW权限。

第6节 数据存储全方案,详解持久化技术

1.眨眼间日常数因那多少个存储在内存当中,有或会晤以程序关或者外原因导致内存为回收而不见的多少,比如登录界面的账号和密码。
2.数目持久化就是凭将这个内存中的转数量保存到存储设备中,保证即便以堂弟大或电话关闭的动静下,这个数量依旧未会晤掉。保存在内存中的数量是高居刹那时状态的,而保存在存储设备中之数是居于持久状态的,持久化技术虽然是供平等种机制好吃数据在转手状态和持久状态中举办转换。
  Android系统被根本提供了两种植格局用于简单地实现多少持久化功效,即文件存储、SharedPreference存储和数据库存储。除了及时二种植艺术外,还好将数据保存于表弟大的SD卡中,不过以文件、SharedPreference或数据库来保存数据会相对还简便有,而且比较由以数据保存于SD卡中会愈发的安全。
3.文本存储是Android中尽中央的如出一辙种多少存储方,它不针对存储的内容展开其他的格式化处理,所有数据都是原封不动地保存至文件中的,因此它们于吻合用于存储一些简单的文书数据仍然二进制数据。假如您想接纳文件存储的法来保存有相比较复杂的文件数据,就需要定义一模仿自己之格式规范,这样方便于之后以数据从文本被再分析出。
  Context类中提供了一个openFileOutput()方法,可以用于将数据存储到指定的公文中。这些方法接收两单参数,第一单参数是文本称,在文件创设的当儿下的哪怕是此名称,注意这里指定的文件称无可以涵盖路径,因为具备的文书都默认存储到/data/data/<packagename>/files/目录下之。第二个参数是文件的操作格局,主要暴发零星种模式可选,MODE_PRIVATE和MODE_APPEND。其中MODE_PRIVATE是默认的操作情势,表示当指定同文件称的手,所描绘的始末将相会蒙原文件被的内容,而MODE_APPEND则表示只要该公文已经存在就是向文件里加内容,不存即创制新文件。其实文件的操作格局本来还有另外两种植,MODE_WORLD_READABLE和MODE_WORLD_WRITEABLE,这简单种格局代表同意任何的应用程序对我们先后中的文书举办读写操作,不过鉴于当下片种格局过于危险,很爱滋生应用之安全性漏洞,现都在Android
4.2版本被被扔。
  openFileOutput()方法重返的凡一个FileOutputStream对象,得到了之目的下便可以动用Java六的方法拿数据写入到文件中了。
  类似于用数据存储到文件被,Context类中还提供了一个openFileInput()方法,用于自文本被读取数据。这多少个主意要相比openFileOutput()简单有,它然则接到一个参数,即要读取的公文称,然后系统会活动到/data/data/<package
name>/files/目录下来加载是文件,并再次回到一个FileInputStream对象,得到了这目的后又经过java流的办法就得将数据读取出来了。
  对字符串举办非空判断的实收使用了TextUtils.isEmpty()方法,这是一个相当好用的计,它可五次性举办简单栽空值的论断。当传入的字符串等于null或者当空字符串的下,这一个主意还会合回到true,从而让大家无需要独自去判断那片种空值,再使逻辑运算符连接起来。
4.SharedPreferences凡是使键值对的章程来存储数据的。也就是说当保存一久数的下,需要给当时长长的数提供一个对应的键,这样以读取数据的时节便足以经这一个键将相应的值取出来。而且SharedPreferences还协助多种不同的数据类型存储。
  Android中一言九鼎提供了三栽办法用于取SharedPreferences对象。
    (1)Context类中的getSharedPreferences()方法
      此方接收四只参数,第一只参数用于指定SharedPreferences文件的名目,虽然指定的文本未存则会创一个,SharedPreferences文件如故存放在/data/data/<package
name>/shared_prefs/目录下之。第二单参数用于指定操作形式,重要出零星栽格局可择。MODE_PRIVATE和MODE_MULIT_PROCESS。MODE_PRIVATE仍旧是默认的操作情势。和直接招入0的效应是一模一样之,表示除非当前底应用程序才可以针对这SharedPreferences文件进行读写。MODE_MULIT_PROCESS则一般是用于会生出多单过程被。
    (2)Activity类中的getPreferences()方法
      这些法和Context中的getSharedPreferences()方法丰裕相似,然则她独自接收一个操作形式参数,因为用是格局时会自行将目前移动的类名作为SharedPreferences的文书称。
    (3)PreferenceManager类中的getDefaultSharedPreferences()方法
      这是一个静态方法,它接受一个Context参数,并机关使用时应用程序的包名作为前缀来命名SharedPreferences文件。
  拿到了SharedPreferences对象下,就得起为SharedPreferences文件被存储数据了,重要得分为三步实现:
    (1)调用SharedPreferences论文的edit()方法来赢得一个SharedPreferences.Editor对象。
    (2)向SharedPreferences.Editor对象中上加多少,比如添加布尔型数据就是之所以putBoolean方法,
    (3)调用commit()方法将增长的数目交到,从而成就数据存储操作。
  SharedPreferences对象被提供了一致层层之get方法用于对存储的数目举行读取,每种get方法都指向诺了SharedPreferences.Editor中的相同栽put方法,比如读取一个布尔型数据就之所以getBoolean()方法。这多少个get方法还收下两独参数,第一个参数是键,传入存储数据平常凡因此的键就能够获取相应的价了,第二独参数是默认值,即意味着传入的键找不至相应的价平日,会坐什么的默认值举行重回。
5.SQLite凡是均等放缓轻量级的干项目数据库,它的演算速度特别急匆匆,占用资源非凡少,平日就需要几百K的内存就够了,由此特别吻合在活动设备上利用。
  SQLite不仅襄助标准的SQL语法,还遵照了数据库的ACID事务。
  SQLite比一般的数据库要简明得多,它甚至毫无安装用户称及密码就足以采纳。
  Android为了为咱能进一步有利地保管数据库,专门供了一个SQLiteOpenHelper帮忙类,借助这多少个近乎即得异常简单地针对数据库举行创办同提高。
  SQLiteOpenHelper是一个抽象类,这表示一旦我们回忆要动她吧,就得创立一个投机的援救类似去继承它们。
  SQLiteOpenHelper中发出一定量个抽象方法,分别是onCreate()和onUpgrade(),必须于和谐之扶类似中还写就片独道,然后分别于就有限个措施被失去落实创设、升级数据库的逻辑。
  SQLiteOpenHelper中海油两独要命关键之实例方法,getReadableDatabase()和getWritableDatabase()。这片单道都可创建或者打开一个现有的数据库(如若数据库已经在则一向打开,否则创制一个新的数据库),并重临一个然则对数据库进行读写操作的对象。不同的凡,当数据库不可写副的早晚(如磁盘空间已满)getReadableDatabase()方法重临的对象将因为只念之计去开辟数据库,而getWriteableDatabase()方法即使拿出现相当。
  SQLiteOpenHelper中出一定量单构造方法可供应重写,一般以参数少一些之怪构造方法即可。这多少个构造方法中经受四独参数,第一个参数是Context,必须要起它才会对数据库举办操作。第二独参数是数量库名,创设数据库时采纳的即便是此处指定的号。第三单参数允许我么在询问数据的时光回来一个自定义的Cursor,一般仍然流传null。第三独参数表示手上数据库的版号,可用于对数据库举行提高操作。构建有SQLiteOpenHelper的实例之后,再调用它的getReadableDatabase()或getWritableDatabase()方法就可知创设数据库了,数据库文件会满怀放在/data/data/<package
name>/databases/目录下。此时,重写的onCreate()方法也相会收获推行,所以便会以那边处理局部创设表的逻辑。
  SQLiteDatabase中提供了一个insert()方法,这些办法就是特意用来添加数据的。它接受三独参数,第一个参数是表名,大家意在往哪张表里添加多少,这里就是扩散该表的名字。第二独参数用于在不指定添加数据的图景下为某些可为空的排列自动赋值NULL,一般我们由此非顶这效果,直接传入null即可。第三独参数是一个ContentValues对象,它提供了同一多级的put()方法重载,用于为ContentValues中上加多少,只需要拿表中的每个列名以及相应的急需上加多少传即可。
  SQLiteDatabase中为是提供了一个不行好用的uodate()方法用于对数码举办翻新,这一个艺术接收三只参数,第一只参数和insert()方法同样,也是表名,在这边指定去革新哪张表里的数量。第二单参数是ContentValues对象,要将立异数据在此处组装进去。第三季独参数用于约束更新某平实践抑某个几乎履遭的数额,不指定的话语默认就是翻新具有执行。
  SQLiteDatabase中提供了一个delete()方法专门用来去数据,这些法接收三单参数,第一只参数仍然表名,第二、三独参数又是用来去约删除某平执抑有几乎执的数量,不点名的语默认就是去所有执行。
  SQLiteDatabase中提供了一个query()方法用于对数码开展查新。那一个办法的参数非凡复杂,最紧缺的一个方法重载也用传入四只参数。第一只参数是表名,表示大家想于哪张表中询问数据。第二单参数用于指定去哪查询哪几列,如若非指定则默认查询所有列。第三、第四独参数用于约束查询有平执抑有几乎尽的数额,不点名则默认是询问所有行的多少。第两只参数用于指定要去group
by的排列,不指定则表示未汇合询问结果举办group bu操作。第六单参数用于对group
by之后的数举办更为的过滤,不点名则意味未开展过滤。第七单参数用于指定询问结果的排序方法,不指定则象征以默认的排序格局。
  query()方法参数 对许SQL部分 描述
  table from table_name 指定询问的表名
  columns select column1,column2 指定询问的列明
  selection where column = value 指定where的束缚规范
  selectionArgs – 也where中的占有位符提供具体的价
  groupBy group by column 指定要group by的排
  having having column = value 为group by 后底结果更加约束
  orderBy order by column1,column2 指定询问结果的排序情势
  调用query()方法后会回去一个Cursor对象,查询到的具备数据都将由夫目的中取出。
  除了查询数据的下调用的是SQLiteDatabase的rawQuery()方法,其他的操作都是调用的execSQL()方法。
  SQLite数据库是支撑工作的,事务的性状可确保为有一样层层之操作依旧全部完了,要么一个都无相会做到。
  Android中工作的正统用法,首先调用SQLiteDatabase的beginTransaction()方法来开一个政工,然后在一个怪捕获的代码块被错过实践实际的数据库操作,当有着的操作都得未来,调用setTransactionSuccessful()表示事情都尽成功了,最终以finally代码块被调用endTransaction()来收尾工作。

第7章节 跨程序共享数据,商讨内容提供器

1.利用臼齿化技术所保存之数目还只可以当手上次中走访。
2.内容提供器(Content
Provider)重要用来在不同之应用程序之间实现数据共享的法力,它提供了同一套完整的建制,允许一个程序访问另一个程序中之数据,同时仍能保证为拜数据的安全性。如今,使用内容提供器是Android实现跨程序共享数据的正规方法。
  不同让文件存储和SharedPreferences存储着的片种全局可读写操作形式,内容提供器可以选拔就针对啊部分数码开展共享,从而确保我们先后中的苦数据不汇合发生泄露的高风险。
  内容提供器的用法一般有半点栽,一栽是采纳现有的始末提供器来读取和操作相应程序中之多少,另一样栽是创制和谐的情提供器给咱先后的数据提供外部看接口。
3.当一个应用程序通过情节提供器对这数额提供了表看接口,任何其余的应用程序就都得对就片数额举行访问。Android系统遭到于带的电话簿、短信、媒体库等先后还提供了近乎之造访接口,这就是让第三在应用程序可以尽量地运这有数目来促成还好的听从。
  对于每一个应用程序来说,假使想要拜内容提供器中共享的多寡,就决然要负ContentResolve类,可以通过Context中的getContentResolver()方法拿到到此类的实例。ContentResolver中提供了千篇一律体系之法用于对数码举行CRUD操作,其中insert()方法用于添加数据,update()方法用于更新数据,delete()方法用于去数据,query()方法用于查询数据。
  不同为SQLiteDatabase,ContentResolver中之增删改查方法都是匪接收表名参数的,而是利用一个Uri参数代替,这些参数为誉为内容URI。内容URI给内容提供器中之数码建立了唯一标识符,它最重要由于少局部组成,权限(authority)和路径(path)。权限是用于对两样之应用程序做区分的,一般为防止争辩,都谋面以程序包名的方法来进展命名。路径则是用以对同样应用程序中不同的表做区分的,平常都会面补充加至权力的后边。
  调用Uri.parse()方法,就可拿内容URL字符串解析成Uri对象了。
  可以使Uri对象来查询table表中的多寡,代码如下所示:
    Cursor cursor = getContentResolver().query(
        uri,
        projection,
        selection,
        selectionArgs,
        sortOrder
    )
  query()方法参数    对许SQL部分         描述
  uri                         from table_name
       指定询问有应用程序下之有同张表
  projection        select column1,column2    指定询问的列名
  selection       where column = value    
指定where的律原则
  selectionArgs            –            
   为where中的占位符提供切实的价
  orderBy        order by column1,column2  
指定询问结果的排序情势
  查询好后返的依然是一个Cursor对象,这时我们不怕足以用数据由Cursor对象吃逐一个读取出来了。读物的思绪还是是透过动游标的职务来所有历Cursor的有执行,然后又取出每一样实践被相应列的数目。
4.开立自己之情节提供器需要连续ContentProvider,ContentProvider类中有六独泛方法。
  (1)onCreate()
    起头化内容提供器的当儿调用。通常会以此完成对数据库的创立和擢升等操作,再次来到true表示内容提供器开头化成功,再次来到false则代表失败。注意,只有当在ContentResolver尝试访问大家先后中的数量时,内容提供器才会叫起先化。
  (2)query()
    从内容提供器中询问数据。使用uri参数来规定询问哪张表,projection参数用于确定询问哪些列,selection和selectionArgs参数用于约束查询哪些行,sortOrder参数用于对结果开展排序,查询的结果存放于Cursor对象中归。
  (3)insert()
    更新内容提供器中补充加同条数据。使用uri参数来规定要补偿加到之申,待添加的数保存在values参数中,selection和selectionArgs参数用于约束更新哪些行,瘦影响之行数将作重临值再次来到。
  (4)update()
    更新内容提供器中已经部分数据。使用uri参数来确定更新哪一样摆表中的数,新数据保存在values参数中,selection和selectionArgs参数用于约束更新哪些行,受影响的行数将用作再次来到值重返。
  (5)delete()
    从内容提供器中删除数据。使用uri参数来规定删除哪一样摆放表中的数,selection和selectionArgs参数用于约束删除哪些行,被去除的行数将当重临值再次来到。
  (6)getType()
    依照传入的情URI来回到相应的MIME类型。
5.一个正式的情URI写法是那般的:
  content://com.example.app.provider/table1
  这就算象征调用方期望访问的凡com.example.app这几个利用之table1表中的数量。除此之外,大家尚好当这与人URI的后长一个id,如下所示:
  content://com.example.app.provider/table1/1
  内容URI的格式重要就是只有上述两栽,以路径结尾就意味着要访问该表中持有的数量,以id结尾就代表期望访问该表中装有相应id的数额。我们好应用通配符的不二法门来分别匹配这片种格式的内容URI,规则如下:
  (1)*:表示非常任意长度的擅自字符
  (2)#:表示分外任意长度的多少
  所以:一个可知兼容任意表的内容URI格式就可描绘成:content://com.example.app.provider/*
  而一个克匹配table1表中擅自一行数的内容URI格式就好形容成:content://com.example.app.provider/table1/#
  我们更借助UriMatcher这多少个看似就足以轻松地实现匹配内容URI的功用。UriMatcher中提供了一个addURI()方法,这多少个模式接收三独参数,可以分别将权力、路径和一个自定义代码传进。这样,当调用UriMatcher的match()方法时,就得拿一个Uri对象传入,重返值是有可以兼容这个Uri论文所对应的自定义代码,利用是代码,我们就可以判明出调用方期望访问的凡哪张表中的多寡了。
6.一个情URI所对应的MIME字符串重固然因为三有组成,Android对就三单部分做了之类格式规格:
  (1)必须以vnd开头。
  (2)假使情节URI以路径结尾,则晚接android.cursor:dir/,假如情节URI以id结尾,则晚接android.cursor.item/。
  (3)最终连上vnd.<authority>.<path>。
  所以,对于content://com.example.app.provider/table1这个内容URL,它所对应之MIME类型就好形容成:vnd.android.cursor.dir/vnd.com.example.app.provider.table1
  对于content://com.example.app.provider/table1/1这多少个情URI,它所对应的MIME类型就得描绘成:vnd.android.cursor.item/vnd.com.example.app.provider.table1
7.Git资了同等种植可配性很强的机制来允许用户用点名的文件或者目录排除以版本控制之外,它会检查代码仓库的根目录下是否有一个叫作吧.gitignore的公文,假诺是的说话就是错过一行行读取这些文件被之情节,并将各类一行指定的文本或者目录排除以版本控制之外。注意.gitignore中指定的文件或者目录是好运用“*”通配符的。
  查看文件修改情状用status命令。
  git diff 可以查到拥有文件的改动内容。
  想使收回修改得利用checkout命令。这种撤废形式仅适用于这么些还没履过add命令的文件。执行过add命令的文书撤废添加应用的凡reset命令(get
reaset HEAD <fileName>)。
  使用git log命令查看历史提交新闻。
  使用git log commit-id
查看中同样长达记下,加-1参数表示大家就想见见一行记录,加-p参数,查看这漫长提交记录具体修改了呀内容。

第8节 充裕而的主次,运行手机多媒体

1.文告(Notification)是Android系统面临较起特色之一个意义,当有应用程序希望朝着用户暴发一些指示音信,而该应用程序又非往日台运行时,就足以靠通知来贯彻。发出同样漫漫公告后,手机最顶端之状态栏中会展现一个公告的图标,下拉状态栏后可以看出布告之详尽内容。
2.创立通告的详实步骤:首先需要一个NotificationManager来对通报举办田间管理,可以调用Context的getSystemService(Service)()方法取得到。getSystemService()方法接收一个字符串参数用于确定取系统的哪位服务,这里我们传入Context.NOTIFICATION_SERVICE即可。因而,获取NotificationManager的实例就好描绘成:
  NotificationManager manager =
(NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
  接下去需要成立一个Notification对象,那多少个目的用于存储文告所待的各种音讯,咱们可行使她的有参构造函数来举行创办。Notification的有参构造函数接收多少个参数,第一单参数用于指定文告的图标,第二只参数用于指定布告之ticker内容,当公告刚给创立的时光,它会以网的状态栏一闪而过,属于同一种植眨眼间时之提醒音讯。第四只参数用于指定通告为成立的大运,以毫秒为单位,当下拉网状态栏时,这里指定的岁月会合突显在对应的打招呼及。因而,创造一个Notification对象就是得描绘成:
    Notification notification = new
Notification(R.drawable.icon,”This is ticker
text”,System.current提姆(Tim)eMillis());(已经休引进用,可以使用Builder)
  创立好了Notification对象后,大家尚亟需对通报的布局举行设定,这里才待调用Notification的setLatest伊芙nInfo()方法就好叫通设置一个正式的布局。这么些法接收六个参数,第一单参数是Context,第二只参数用于指定文告之题目内容,下拉系统状态栏就可以看到即有的内容。第多个参数用于指定通告之正文内容,同样下拉系统状态栏就能够看到顿时一部分情。第七只参数暂时用不至,可以先行传出null。由此,对通报之布局举行设定就好形容成:
    notification.setLatest伊芙ntInfo(context, “This is content
title”, “This is content text”,
null);(已经休引进以,可以利用Builder)
  以上工作做到之后,只待调用NotificationManager的notify()方法就是可以让通报展现出来了。notify()方法接收两独参数,第一独参数是id,要管为每个布告所指定的id都是例外之。第二只参数则是Notification对象,这里直接拿我们正好创建好之Notification对象传入即可。因而,展现一个通告就好写成:
    manager.notify(1, notification);
3.PendingIntent起名字上看起便跟Intent有几类似,它们中吧确存在正在众多共同点。比如其都得以错过指明某一个“意图”,都足以用于启动活动、启动服务以及发送广播等。不同的凡,Intent更加倾向于去这执行某动作,而PendgingIntent更加倾向于当有合适的时机夺履行某动作。所以,也得吧PendingIntent简单地解呢延迟执行的Intent。
  PendingIntent的用法很粗略,它至关重要提供了几乎独静态方法用于获取PendingIntent的实例,可以按照需求来挑选是拔取getActivity()方法、get布罗德cast()方法、仍然getService()方法。这三只艺术所收到的参数依旧均等之。第一个参数是Context,第二单参数一般用非顶,同创都是传入0即可。第三独参数是一个Intent独享,可以透过是目的构建起PendingIntent的“意图”。第四单参数用于确定PendingIntent的所作所为,有FLAG_ONE_SHOT、FLAG_NO_CREATE、FLAG_CANCEL_ACCESS,CURRENT和FLAG_UPDATE_CURRENT这四种价值可选。
4.接到短信的权:android.permission.RECEIVE_SMS
  接收短信的播报的action:android.provider.Telephony.SMS_RECEIVED
  发送短信的权杖:android.permission.SEND_SMS
5.启动相机的intent:Intent intent = new
Intent(“android.media.action.IMAGE_CAPTURE”);
  裁剪程序的intent:Intent intent = new
Intent(“com.android.camera.action.CROP”);
  向SD卡中描写多少要表明的权力:android.permission.WRITE_EXTERNAL_STORAGE
  打开相册获取图片的intent:Intent intent = new
Intent(“android.intent.action.GET_CONTENT”);
    intent.setType(“image/*”);
    intent.putExtra(“crop”,true);//是否同意剪
    intent.putExtra(“scale”,true);//是否允许缩放
    intent.putExtra(MediaStore.EXTRA_OUTPUT,image);//图片的输出地点
6.以Android中播放音频文件一般如故下MediaPlayer来来实现的,它对强格式的音频文件提供了丰盛周全的决定方法,从而使播放音乐之做事易得万分简单。
  MediaPlayer类中部分较为常用的支配措施:
  方法名                                效率描述
  setDataSource()      设置要播的音频文件的职位。
  prepare()          在起始广播前调用那多少个措施成功准备干活。
  start()                  最先或接续播放音频。
  pause()                              暂停播放音频。
  reset()            将MediaPlayer对象重置到刚刚创设的状态。
  seekTo()           从指定的职位上马广播音频。
  stop()           
截止播放音频。调用这么些点子后底MediaPlayer对象无法还播音频。
  release()                          
释放掉与MediaPlayer对象相关的资源。
  isPlaying()         判断时MediaPlayer是否正在播放音频。
  getDuration()       获取载入的音频文件的时长。
  MediaPlayer的劳作流程:首先要创建有一个MediaPlayer对象,然后调用setDataSource()方法来安音频文件的路径,再调用prepare()方法要MediaPlayer进入到准备状态,接下去调用start()方法就足以起来播放音频,调用pause()方法就是会半途而废播放,调用reset()方法就是会见停止播放。
7.播放录像文件紧即便使用VideoView类来落实的。这一个类将录像的亮与操纵集于一身,使得我们只有依靠其就是足以完成一个大概的视频播放器。
  VideoView的常用方法:
  方法名        效率描述
  setVideoPath()    设置要播的录像文件的地方 。
  start()        开头或接续播放视频。
  pause()        暂停播放视频。
  resume()        将录像重头最先播放。
  seekTo()        从指定的地方上马播放视频。
  isPlaying()       判断当前下正在播放录像。
  getDuration()    获取载入的视频文件的时长。
  VideoView并无是一个能文能武的录像播放工具类。它在视频格式的援助与播放效能方面都是在比充分的贫。所以,假若想只要一味以VideoView就编写一个功力非常强大的视频播放器是无绝现实的。不过若只是用于广播一些娱乐之片头订花,或者有应用之录像宣传,使用VideoView依然绰绰有余的。

第9节 后大默默的生产者,商讨服务

1.劳务(瑟维斯(Service)(Service))是Android中实现程序后台运行的化解方案,它分外适合用于去实施这些未欲以及用户交互而且还求老运行的职责。服务的运转为靠让另外用户界面,固然当次于切换来后台,或者用户打开了此外一个应用程序,服务还是可以维持正规运作。
然需要注意的凡,服务并无是运作于一个单独的进程中的,而是靠让创建服务时所当的应用程序进程。当某个应用程序进程被坏掉时,所有乘让该过程的劳动吗会师终止运行。
  另外,也决不受劳务之后台概念所迷惑,实际上服务并无相会活动启线程,所有的代码都是默认运行在主线程当中之。也就是说,大家得以服务的中手动创造子线程,并于此举行实际的任务,否则即闹或出现主线程给组塞住的情事。
2.Android遭的异步音讯处理重要出于两个组成部分组成,Message、Handler、MessageQueue和Looper。
  (1)Message
    Message是当线程之间传递的音信,它可以以里边引导少量之信,用于在不同线程之间互换数据。
  (2)Handler
    Hnadler顾名思义也即使是处理者的意,它根本是用来发送和拍卖信息之。发送音信一般都是应用Handler的sendMessage()方法,而生之消息经同雨后春笋地辗转处理后,最终会合传递到Handler的handleMessage()方法吃。
  (3)MessageQueue
    MessageQueue是信队列的意,呀重要用来存放有通过Handler发送的信息。这有音讯会平昔留存为新闻队列中,等待于拍卖。每个线程中可是会时有发生一个MessageQueue对象。
  (4)Looper
    Looper是每个线程中的MessageQueue的管家,调用Looper的loop()方法后,就会进来及一个尽循环中,然后在发现MessageQueue中在一样条信息,就会以它取出,并传递到Handler的handleMessage()方法吃。每个线程中为仅仅会面暴发一个Looper对象。
3.异步音讯处理的全体流程:首先需要以主线程当中成立一个Handler对象,一碗水端平写handleMessage()方法。然后当子线程中要展开UI操作时,就创制一个Message对象,并透过Handler将及时长长的音信发送出。之后这漫长音讯会受补加到MessageQueue的行列中待于处理,而Looper则会从来尝试从MessageQueue中取出要处理音讯,最终分发回Handler的handleMessage()方法吃。由于Handler是在主线程碰着开创的。所以这时候handleMessage()方法中之代码也会师当主线程遭遇运行,于是我们以这边就好安心地进行UI操作了。
4.AsyncTask悄悄的落实原理为是因异步信息处理体制的。
  AsyncTask是一个抽象类,假使想如若动用它从不抢救得成立一个子类去继续其。在继承时大家可以吗AsyncTask类指定三个泛型参数,这三单参数的用如下:
    (1)Params
      在尽AsyncTask时需传入的参数,可用于在后台任务中应用。
    (2)Progress
      后台任务执行时,假若用在界面上出示当前之速度,则动用此指定的泛型作为进度单位。
    (3)Result
      当任务尽完毕后,倘诺急需对结果开展重返,则使用此指定的泛型作为重回值类型。
  AsyncTask需要经常重复写的不二法门:
    (1)onPreExecute()
      这个方法会在后台任务起先施行前调用,用于开展有界面及之初始化操作,必须出示一个快长对话框等。
    (2)doInBackfround(Params…)
      这一个法吃的装有代码都晤面于子线程中运作,大家应当于这边失去处理所有的耗时任务。任务而好就得经return语句来以任务的尽结果回到,虽然AsyncTask的老五只泛型参数指定的凡Void,就可以无回去任务执行结果。注意,在此措施吃凡是不得以展开UI操作的,倘诺急需更新UI元素,假诺急需更新UI元素,比如说反馈当前任务的实施进度,可以调用publishProgress(Progress…)
    (3)onProgressUpdate(Progress…)
      当于后台任务中调用了publishProgress(Progress…)方法后,这几个措施就是会师飞速为调用,方法被带的参数就是在后台任务中传送过来的。在这法子被得以对UI进行操作,利用参数中之数值便好针对界面元素进行对应地改进。
    (4)onPostExecute(Result)
      当后台任务执行了并因此return语词进行再次来到时,这几个法子就飞会受调用。重临的数据会作为参数传递到此方吃,可以使重回的数目举行局部UI操作。
  使用AsyncTask的门道是,在doInBackground()方法中错过实践实际的耗时任务,在onProgressUpdate()方法被开展UI操作,在onPostExecute()方法中履行有职责的了断工作。

5.服务的常用到之单个方法,其中onCreate()方法会在劳动创造的早晚调用,onStartCommand()方法会在历次服务启动的当儿调用,onDestory()方法会在劳务销毁之时光调用。
6.假如在路之别职务调用了Context的start瑟维斯(Service)(Service)()方法,相应的劳动就是碰面启动起来,并回调onStartCommand()方法。假诺此服务在此以前还尚未创设了,onCreate()方法会先于onStartCommand()方法执行。服务启动了下会一向维系运行状态,直到stopService()或stopService()方法被调用。注意尽管每调用同蹩脚start瑟维斯(Service)()方法,onStartCommand()就会执行同样涂鸦,实际上每个服务都不过会是一个实例。所以管您调用多少坏start瑟维斯(Service)()方法,只待调用一遍于stopService()或stopSelf()方法,服务就是会师截止下来了。
  还好调用Context的bindService()来获取一潮服务之恒久连接,那时便会晤回调服务遭遇的onBind()方法。类似地,淌如果服务前还并未成立了,onCreate()方法会先于onBind()方法执行。之后,调用方可以拿走到onBind()方法里重回的IBinder对象的实例,这样虽可知自由地跟劳动开展通信了。只要调用方和服务中间的连接没有断开,服务就是晤面直接保持运行状态。
  当调用start瑟维斯(Service)()方法后,又去调用stopService(Service)()方法,这时服务着的onDestroy()方法就会尽,表示服务和销毁了。类似地,当调用了bindService(Service)()方法后,又失去调用unbindService(Service)()方法,onDestroy()方法为会实施。然而急需留意,我们是截然发生或针对一个服务就调用了startService()方法,又调用了bind瑟维斯(Service)()方法的,依照Android系统的建制,一个服务使吃启动或为绑定了未来,就相会平昔处在运行状态,必须要被以上二种口径还要不饱,服务才可以被灭绝。所以,要又调用stopService(Service)()和unbindService()方法,onDestroy()方法才会晤执行。
7.劳务几乎都是于后台运行的,从来以来它如故私下地做着麻烦的行事。然则服务的系统优先级如故比没有之,当系统出现内存不足的动静下,就可能会见回收掉在后台运行的劳动。假使你望劳动得平素维持运行状态,而无会师出于系统内存不足的原由促成受回收,就可考虑使用前台服务。前台服务和普通劳动最好要命之界别就在,它谋面直接闹一个正在运作的图标在系的状态栏彰显,下拉状态栏后可以见到越来越详实的音信,非凡相近于通知的听从。当然有时你为说不定不仅仅是为防备服务被回收掉才是因以前台服务之,有些项目由独特之要求要使用前台服务。
8.IntentService类,可以当onHandleIntent()抽象方法被处理局部现实逻辑,而且不要担心ARN的问题,因为这措施已是于子线程中运行了,任务就劳动会自行终止。
9.Android被之定时任务一般有半点栽实现模式,一种植是选拔Java
API里提供的提姆er类,一栽是行使Android的Alarm机制。这有限种植方法在多数情况下都能兑现类似的成效,但提姆er有一个彰着的短板,它并无顶适合吃这些需要漫长未来台运行的定时任务。大家掌握,为了可以吃电池更耐用,每种手机都会晤有协调的休眠策略,Android手机就会见于增长时未操作的意况下活动为CPU进入及睡眠状态,这即便发生或导致提姆(Tim)er中的定时任务不能正常运行。而Alarm机制即使非在这种气象,它有唤醒CPU的法力,既好包每一回要实施定时任务之时段CPU都能正常工作。需要小心,这里提示CPU和指示屏幕完全无是与一个定义。
10.AlarmManager要就因了AlarmManager类来贯彻的,通过调用Context的getSystemService(Service)()方法来博实例的,需要传入参数是Context.ALARM_SERVICE。获取实例就得描绘成:
  AlarmManager manager = (AlarmManager)
getSystemService(Context.ALARM_SERVICE);
  接下调用AlarmManager的set()方法就是足以设置一个定时任务了,比如安一个任务在10分钟后进行:
    long triggerAtTime = SystemClock.elapsedRealtime() + 10 *
1000;
    manager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, triggAtTime,
pendingIntent);
  set()方法的老三单参数,第一单参数是一个整型参数,用于指定AlarmManager的工作类,有四种植价值可挑选,分别是ELAPSED_REALTIME、ELAPSED_REALTIME_WAKEUP、RTC和RTC_WAKEUP。其中ELAPSED_REALTIME表示于定时器表示让定时任务的出发时打网开机始算从,但不会合唤起CPU。ELAPSED_REALTIME_WAKEUP同表示让定时任务之出发时自网起初开算从,但会指示CPU。RTC代表定时任务之触发时从1970年三月1日0时伊始算打,但不会晤指示CPU。RTC_WAKEUP同代表让定时任务之接触时由1970年3月1日0时起算从,但会指示CPU。
  使用SystemClock.elapsedRealtiome()方法可以获到网开机至今所涉时间的阿秒数,使用System.curretn提姆eMillis()方法可以博到1970年12月1日0沾至今所经历时间的飞秒数。
  第二只参数就是定时任务点的日,以毫秒为单位。假设第一个参数使用的凡ELAPSED_REALTIME或ELAPSED_REALTIME_WAKEUP,则这里流传开机至今以增长延迟执行之时刻。假设第一单参数使用的凡RTC或RTC_WAKEUP,则这里传出1970年十二月1日0碰交后天的时光重新增长延迟执行之年华。
  第三单参数是一个PendingIntent,这里我们一般会调用get布罗德(Broad)cast()方法来得到一个可以实施广播的PendingIntent。这样当定时任务嘛出发的当儿,广播接收器的onReceiver()方法就能够得推行。
11.由Android
4.4版最先,Alarm任务之点时以会师变得不精确,有或会合延迟一段时间后任务才可以得到推行。这不是个bug,而是系统于好点性方面举办的优化。系统会自动检测近期来多敲Alarm任务在,然后用沾时将近的几乎独任务在一块儿实施,这虽可大幅度地减小CPU被唤醒的次数,从而有效延伸电池的以时间。
  倘若您要求Alarm任务的实践时间必须规范无误,Android依然提供了化解方案。使用AlarmManager的setExact()方法来替代set()方法,就可抱枕任务如期执行了。

第10节 看看好的世界,使用网络技术

1.HTTP协议的劳作规律就是是客户端向服务器发同样漫漫HTTP请求,,服务器收到请求后会回到一些数据给客户端,然后客户端再指向这么些数据举办辨析及处理便足以了。
2.每当Android上发送HTTP请求的道一般生点儿种,HttpURLConnection和HttpClient。
3.HttpURLConnection的用法:
  首先用取拿到HttpURLConnection的实例,一般但待new出一个URL对象,并传播目标的网络地址,然后调用一下openConnection()方法即可,如下所示:
    URL url = new URL(“http://www.baidu.com“);
    HttpURLConnection connection = (HttpURLConnection)
url.openConnection();
  得到了HttpURLConnection的实例之后,我们得以安装一下HTTP请求所运用的方。常用之方要出少数独,GET和POST。GET表示要于服务器这里获取数据,而POST则意味想交给数据被服务器。写法如下:
    connection.setRequestMethod(“GET”);
  接下就是可以开展有随便地定制了,比如设置连接超时,读取超时的毫秒数,以及服务器希望赢得的部分信头等。这有些情节据悉自己的实际境况展开编辑,示例写法如下:
    connection.setConnectionTimeout(8000);
    connection.setReadTimeout(8000);
  之后还调用getInputStream()方法就可以得到服务器重回的输入流了,剩下的任务便是本着输入流举办读取,如下所示:
    InoutStream in = connection.getInputStream();
  最终能够调用disconnect()方法以这HTTP连接关闭掉,如下所示:
    connection.disconnection();
  提交数据费服务器,只待拿HTTP请求的章程改化POST,并以取输入流此前将要付出的数量形容来即可。注意每条数据都设坐键值对的样式有,数据以及数据里面为此&符号隔开,比如说我们想念倘使为服务器交由用户称与密码,就好这么勾画:
    connection.setRequestMethod(“POST”);
    DataOutputStream out = new
DataOutputStream(connection.getOutputStream());
    out.writeBytes(“username=admin&password=123456”);
4.HttpClient是Apache提供的HTTP网络访问接口,从同开端之时段便叫引入到了Android
API中。它可得及HttpURLcONNECTION几乎一样的效用,但两者之间的用法也以较充足的区别。
5.HttpClient的用法:
  首先你要通晓,HttpClient是一个接口,由此无法创设它的实例,经常意况下还相会创设一个DefaultHttpClient的实例,如下所示:
    HttpClient httpClient = new DefaultHttpClient();
  接下去要想要提倡一长达GET请求,就可创制一个HttpGet对象,并传到目标的网络地址,然后调用HttpClient的execute()方法即可。
    HttpGet httpGet = new HttpGet(“http://www.baidu.com“);
    httpClient.execute(httpGet);
  假倘若发起一条POSY请求会比GET稍微复杂一点,我们要创制一个HttpPost对象,并传播目标的网络地址,如下所示:
    HttpPost httpPost = new HttpPost(“http://www.baidu.com“);
  然后经过一个NameValuePair集合来存放在待提交的参数,并以这多少个参数集合传入到一个UrlEncodedFormEntity中,然后调用HttpPost的setEntity()方法以构建好的UrlEncodeFormEntity传入,如下所示:
    List<NameValuePair> params = new
ArrayList<NameValuePair>();
    params.add(new BasicNameValuePair(“username”,”admin”));
    params.add(new BasicNameValuePair(“password”,”123456″));
    UrlEncodedFromEntity entity = new UrlEncodedFormEntity(params,
“utf-8”);
    httpPost.setEntity(entity);
  接下的操作就与HttpGet一样了,调用HttpClient的execute()方法,并将HttpPost对象传入即可:
    httpClient.execute(httpPost);
  执行execute()方法之后会回来一个HttpResponse对象,服务器所返的具有消息就是会蕴藏在就之中。通常状态下我们都晤面优先取出服务器再次回到的状态码,尽管当200哪怕表明要与响应都成功了,如下所示:
    if (httpResponse.getStatusLine().getStatusCode == 200) {
      //请求和应都成功了
    }
  接下去当斯if判断的中间取出服务再次来到的具体内容,可以调用getEntity()方法赢得到一个HttpEntity实例,然后再一次用EntityUtils.toString()那一个静态方法将HttpEntity转换成字符串即可,如下所示:
    HttpEntity entity = httpResponse.getEntity();
    String response = EntityUtils.toString(entity);
  注意要服务器重返的数目是带有闽南语的,间接调用EntityUtils.toString()方法举行更换会出乱码的景观出现,那多少个时节就需要在转换的上说字符集指定成utf-8就好了,如下所示:
    String response = EntityUtil.toString(entity, “utf-8”);
6.比起XML,JSON的重要性优势在于它的体积更有些,在网络及传的当儿可以还省流量。单缺点在于,它的和异性比差,看起不如XML直观。

第11章 Android特色开发,基于地点的劳动

1.基为地点的劳动简称LBS,紧要的做事原理就是以无线电通讯网络要GPS等固定法来确定有活动设备所于的职。
2.基叫地方的服务以Android中要因LocationManager这一个类似实现。
3.倘诺怀念使用LocationManager就必须使先拿到到它们的实例,大家得以调用Context的getSystem瑟维斯(Service)(Service)()方法拿到到。getSysytemService()方法接收一个字符串参数用于确定取系统的哪位服务,这里传出Context.LOCATION_SERVICE即可。由此,获取      LocationManager饿实例就好描绘成:
  LocationManager locationManager = (LocationManager)
getSystemService(Context.LOCATION_SERVICE);
  就大家用采纳一个地方提供器来确定设备时之职。Android中一般有三栽职位提供器可供应选取,GPS_PROVIDER、NETWORK_PROVIDER和PASSIVE_PROVIDER。其中前边少栽接纳的可比多,分贝表示勇士GPS定位以及动网络稳定。这片种固定法各有特点,GPS定位的精确度相比大,可是大耗电,而网稳定的精准度较差,但耗电量比少、我们应因自己的实际情形来选用用啊一样种职位提供器,当地点精度要求特别大之早晚,最好以GPS_PROVIDER,二一模一样次情形下,使用NETWORK_PROVIDER会更加得划算。
  需要小心的是,定位功效必不可少要由用户积极去启动才行,不然任何应用程序都爱莫能助获取到手机时底职位音讯。
  将甄选好的岗位提供器传入到getLastKnownLocation()方法吃,就可以赢得一个Location对象,如下所示:
    String provider = LocationManager.NETWORK_PROVIDER;
    Location location =
locationManager.getLastKnownLocation(provider);
  这多少个Location对象被含有了经度、纬度、海拔等一律文山会海之职位信息,然后从中取出大家所涉的那么有数码即可。
  判断发生哪些地方提供器可用,如下所示:
    List<String> providerList =
locationManager.getProviders(true);
  getProviders()方法接收一个布尔值参数,传入truw就象征除非启用的职务提供器才汇合给归。之后再次从providerList中判断是否含有GPS定位的职能就是实施了。
  调用getLastKnownLocation()方法即便可拿走到装备时的岗位消息,然而用户是完全产生或含移动装备随时移动的,那么咋样才能在装置地点暴发变更之上拿到到最新的岗位音讯吗?LocationManager还提供了一个requestLocationUpdates()方法,只要传入一个LocationListener的实例,并简要布置几乎个参数就足以兑现上述功效了,写法如下:
  locationManager.requestLocationUpdates(LocationManager.GPS_PRIVIDER,
5000, 10, new LocationListener() {
    @Override
    public void onStatusChanged(String provider, int status, Bundle
extras){}

    @Override
    public void onProviderEnabled(String provider) {}

    @Override
    public void onProviderDisabled(String provider) {}

    @Override
    public void onLocationChanged(Location location) {}
  });
  这里requestLocationUpdates()方法接收六只参数,第一只拔取数是岗位提供器的序列,第二独参数是监听地点别之日子间隔,以纳秒为单位,第三单参数是监听地点别之挑唆隔,以米为单位,第四独参数则是LocationListener监听器。
4.其实Android本身便提供了地理编码的API,重假若行使GeoCoder这个近乎来促成之。他可十分简单地得正向同反向的地理编码功效,从而轻松地将一个经纬值转换成为看得清楚的职消息。
  GeoCoder长时间存在着部分相比较严重的bug,在反向地理编码的下会时有暴发肯定的票房价值不可能分析出地方的信,这样固然不能确保地方分析的安居。
  Google又提供了一如既往法Geocoding
API,使用其的言辞也堪完成反向地理编码的干活,只不过它的用法稍微复杂了有,但平静要相比GeoCoder强得几近。
  Geocoding
API的做事原理并无黑,其实就是以HTTP协议。在表哥大端我们好于Google的服务器发起一久HTTP请求,并将通过纬度的价值作为参数异同传递过去,然后服务端会匡助我们拿此经纬值转换成为看得精通的岗位音讯,再用那多少个音讯再次来到给手机端,最后手机端去分析服务器重回的音,并展开拍卖就足以了。
  Geocoding API中确定了很多假说,其中反向地理编码的接口如下:
    http://maps.googleapis.com/maps/api/geocode/json?latlng=40.714224,-73.96145&sensor=true\_or\_false
  其中http://maps.googleapis.com/maps/api/geocode/是固定的,表示接口的连接地址。json表示希望服务器能够返回JSON格式的数据,这里也可以指定成xml。latlng=40.714224,-73.96145表示传递给服务器去解码的经纬值是北纬40.714224度,西经73.96145度,sensor=true\_or\_false表示这条请求是否来自于某个设备的位置传感器,通常指定成false即可。
5.子是版本控制工具中于高档且较重要的一个定义,它至关紧要的用意就是是当存活代码的基本功及开辟一个分叉口,使得代码能够在主干线和分支线上而开展付出,且相互不会师影响。
  查看时底版本库当中发生什么样分支,可以运用git branch -a 命令.
  创制分支命令:       git branch 分支名
  切换分支命令:       git checkout 分支名
  合并分支代码命令:git checkout 分支名(先切换分支) git merge
分支名(合并哪个分支的代码)
  删除分支命令:       git branch -D 分支名
  将当地修改的情节并到长途版本库上:git push origin
master,其中origin部分指定的是长途版本库底Git地址,master部分指定的凡共啊一个子上。上述命令就得了拿地点代码同步到本库底master分支上的效益。
  将远程版本库上之修改共到地点。Git提供了点滴种命令来好这功效,分别是fetch和pull,fetch的语法规则和push是多的,如下所示:
    git fetch origin master
  执行命令后,就会晤以远程版本库上的代码同步到当地,然则同下来的代码并无会面联合到外分支上,而是会存放于一个origin/master分支上,这是咱可通过diff命令来查远程版本库上待敌修改了争东西:
    git diff origin/master
  之后更调用merge命令将origin/master分支上的修改合并及主分支上即可,如下所示:
    git merge origin/master
  而pull命令则是一定给用fetch和merge这点儿独令在同以执行了,它可以打远程版本库上抱最新的代码并且统一及地点,用法如下:
    git pull origin master

第12章 Android特色开发,使用传感器
1.手机搭的传感器是相同种植小型的物理设备,它吗可以探测、感受及外面的信号,并遵从一定规律转换成大家所待的信。Android手机平常都相会支撑多序列型的传感器,如光照传感器、加速度传感器、地磁传感器、压力传感器、温蒂传感器等。
2.光照传感器在Android中的下或比广泛的,比如系统即发生只机关调整屏幕亮度的效益。它会检测手机周围环境的光照强度,然后针敌手机屏幕的亮度进行对应地调动,一不成保证不管在光线仍旧弱光下,手机屏幕都能看得彻底。
3.Android中每个传感器的用法其实还较像样。首先第一步而获取到SensorManager的实例,方法如下:
  SensorManager sensorManager =
(SensorManager)getSystemService(Context.SENSOR_SERVICE);
  SensorManager是系统具有传感器的管理器,有矣它们的实例之后就是可以调用getDefaultSensor()方法来拿到任意的传感器项目了,如下所示:
  Sensor sensor =
sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);
  这里运用Sensor.TYPE_LIGHT常量来指定传感器项目,此时底Sensor实例就意味着正在一个光照传感器。
  接下去需要针对传感器输出的信号举办监听,这就要负Sensor伊芙ntListener来实现了。Sensor伊夫ntListener是一个接口,其中定义了onSensorChanged()和onAccuracyChanged()这有限独办法。当传感器的精度暴发变化时虽会调用onAccuracyChanged()方法,当传感器监测到之数值暴发变化时就是谋面调用onSensorChanged()方法。onSensorChanged()方法中盛传了一个Sensor伊芙nt参数,这些参数里以饱含了一个values数组,所有传感器输出的音讯仍然存于这边的。
  下来还索要调用SensorManager的registerListener()方法来报Sensor伊夫ntListener才会如其收效,registerListener()方法来报Sensor伊芙(Eve)ntListener才会要该收效,registerListener()方法接收三独参数,第一个参数就是Sensor伊夫(Eve)ntListener的实例,第二单参数是Sensor的实例。第六只参数是用于表示传感器输出音信的改进速率,共有SENSOR_DELAY_UI、SENSOR_DELAY_NORMAL、SENSOR_DELAY_GAME和SENSOR_DELAY_FASTEST这五只价可卜,它们的革新速率是同样不佳递增的。
  始终要记,当次退出或传感器使用完毕时,一定要调用unregisterListener()方法将运用的资源自由掉。
4.沾Sensor实例的下假诺指定一个加速度传感器的常量,如下所示:
  Sensor sensor =
sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
  加速度传感器输出的信息一致也是存于Sensor伊夫nt的values数组中的,只可是此时底values数组中会出三独价值,分别表示手机当X轴、Y轴、Z轴方向直达之加速度。
5.获到一个用来表示方向传感器的Sensor实例,如下所示:
  Sensor sensor =
sensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);
  之后又onSensorChanged()方法中经Sensor伊夫nt的values数组,就可以拿走传唤器输出的所有值了。方向传感器会记录手机当装有矛头上之团团转角度。其中,values[0]笔录在手机围绕Z轴的旋角度,values[1]笔录在手机围绕X轴的盘角度,values[2]记录在手机围绕Y轴的旋转角度。
  但遗憾的凡,Android早就抛了Sensor.TYPE_ORIENTATION这种传感器项目,即使代码如故实惠之,但曾经不复推荐这么写了。事实上,Android获取手机旋转的动向与角度是透过加速度传感器和地磁传感器共同总计得出的,这也是Android近来推荐应用的章程。
  首先我们得各自获拿到加速度传感器和地磁传感器的实例,并于她注册监听器,如下所示:
    Sensor accelerometerSensor =
sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
    Sensor magneticSensor =
sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
    sensorManager.registerListener(listener,
accelerometerSensor,SensorManager.SENSOR_DELAY_GAME);
    sensorManager.registerListener(listener,
magneticSensor,SensorManager.SENSOR_DELAY_GAME);
  由于可行性传感器的精确度要求一般都相比较强,这里大家管传感器输出此案次的换代速率提高了有,使用的凡SENSOR_DELAY_GAME。
  接下当onSensorChanged()方法被得取到Sensor伊夫nt的values数组,分别记录着加速度传感器和地磁传感器输出的价。然后将登时半个价值传入到SensorManager的getRotationMatrix()方法吃就得拿走一个富含旋转矩阵的R数组,如下所示:
    SensorManager.getRotationMatrix(R, null, acceler0meterValues,
magneticValues);
  其中第一个参数R是一个长短也9之float数组,getRotationMatrix()方法总括出底团团转数组就会赋值到那么些数组中。第二独参数是一个用来将地磁向量转换成引力坐标的旋矩阵,日常指定为null即可。第三暨季只参数则分级就是加速度传感器和地磁传感器输出的values值。
  得到了R数组之后,接着便可以调用SensorManager的getOrientation()方法来测算手机的盘数据了,如下所示:
    SensorManager.getOrientation(R, values);
  values是一个长短也3之float数组,手机在相继方向达成之转数据都会面于寄放到之数组当中。其中values[0]记录在手机围绕Z轴的旋转弧度,values[1]记录在手机围绕X轴的转弧度,values[2]记录在手机围绕Y轴的团团转弧度。
  注意这里总计起之数量仍旧以弧度为单位之,因而而您想拿其转换成为角度还欲调用如下方法:
    Math.toDegrees(values[0]);

第13节 继续进阶,你还当通晓的尖端技术

1.以Intent来传递对象平时发生有限栽实现形式,Sericalizable和Paracelable。
  Serizable是连串化的意,表示用一个目的转换成为可存储或可传输的状态。系列化后的对象可以在网达到拓展传输,也得以储存到地头。至于连串化的法门吗深粗略,只待让一个类似趋势线Serializable这么些接口就得了。
  除了Serializable之外,使用Parcelable也得兑现同之力量,不过不同为用目的开展连串化,Parcelable情势的落实原理是以一个一体化的对象开展分解,而说后底诸一样片段还是Intent所支撑之数据类型,这样啊即便实现传递对象的法力了。
  Serializable的法较为简单,但由于会将全体对象开展体系化,因而效用方面会比Parcelable情势没有有,所以当平凡状态下要越来越推荐用Parcelable的艺术实现Intent传递对象的功力。

第14回 进入实战,开发酷欧天

第15章 最终一步,将拔取发表到Google Play

相关文章