天天看点

《第一行代码》读书笔记(第七章,第八章,第九章)

第7章 跨程序共享数据 探究内容提供器 

7.2 访问其他程序中的数据  7.2.1 ContentResolver的基本用法  ContentResolver中的增删改查方法都是不接受表名参数的,而是使用一个Uri参数代替,这个参数被称为内容Uri。内容Uri给内容提供器中的数据建立了唯一标识符,它主要由两部分组成,权限(authority)和路径(path)。 权限是用来对不同的程序做区分的。路径则是用于对同一应用程序中不同的表做区分的。

第8章 丰富你的程序,运用手机多媒体  8.1 通知  1、首先需要一个NotificationManager来对通知进行管理  2、创建一个Notification对象,这个对象用于存储通知所需的各种信息,我们可以使用它的有参构造函数来进行创建。Notification的有参构造函数接受三个参数,第一个参数用于指定通知的图标,第二个参数用于指定通知的ticker内容,第三个参数用于指定通知被创建的时间,以毫秒为单位。 3、创建好Notification对象后,我们还需要对通知的布局进行设定,只需要调用Notification的setLatestEventInfo()方法就可以给通知设置一个标准的布局。这个方法接受四个参数, 第一个参数是Context, 第二参数用于指定通知的标题内容,下拉系统状态栏可以看到这部分内容, 第三个参数用于指定通知的正文内容,同样下拉系统状态栏可以看到这部分内容 第四个参数暂时用不到可以传入null 4、调用NotificationManger的Notify()方法就可以让通知显示出来。notify有两个参数,第一个参数是id,第二个参数是Notification对象。要保证为每个通知所指定的id都是不同的。第二参数则是Notification对象。

Pendingintent 从名字上看起来和Intent有些类似,它们之间也确实存在着不少共同点。比如它们都可以指明某一个意图,都可以用于启动活动,启动服务以及发送广播等。不同的是,Intent更加倾向于立即执行某个动作,而PendingIntent更加倾向于在某个合适的时机去执行某个动作。所以,也可以把PendingIntent简单地理解为延迟执行的Intent。

PendingIntent主要提供了几个静态方法用于获取PendingIntent的实例,可以根据需求来选择是使用getactivity()方法,getBroadcast()方法,getService()方法。接受的参数是 1、context  2、一般用不到传入0 3、传入Intent对象 4、用于确定PendingIntent行为。四种值可选。

它可以在通知发出的时候播放一段音频,这样就能够更好地告知用户有通知到来。 我们还可以在通知到来的时候让手机进行振动,使用的是vibrate这个属性。它是一个长整型的数组,用于设置手机静止和振动的时长,以毫秒为单位。下标为0的值表示手机静止的时长,下标为1的值表示手机振动的时长,下标为2的值又表示手机静止的时长。以此类推。

第9章 后台默默的劳动者,探究服务  9.1服务是什么? 服务是Android中实现程序后台运行的解决方案,它非常适合用于去执行那些不需要和用户交互而且还要求长期运行的任务。服务的运行不依赖于任何用户界面,即使当程序被切换到后台。服务的运行不依赖于任何用户界面,即使当程序被切换到后台,或者用户打开了另外一个应用程序,服务仍然能够保持正常运行。 不过需要注意的是,服务并不是运行在一个独立的进程当众,而是依赖于创建服务时所在的应用程序进程。当某个应用程序进程被杀掉时,所有依赖于该进程的服务也会停止运行。

9.2 Android 多线程 Android不允许在子线程中进行UI操作。

9.2.3解析异步消息处理机制  Android中的异步消息处理主要由四个部分组成,Message、Handler ,MessageQueue和Looper。 1、Message Message是在线程之间传递的消息,它可以在内部携带少量的消息,用于在不同线程之间交换数据。使用Message的what字段,除此之外还可以使用arg1和arg2,使用obj字段携带一个Object对象。 2、Handler Handler顾名思义也就是处理者的意思,它主要是用于发送和处理消息的,发送消息一般是使用Handler的sendMessage()方法,而发出的消息经过一系列辗转处理后,最终会传递到handler的handleMessage()方法中。 3、MessageQueue MessageQueue是消息队列的意思,它主要用于存放所有通过Handler发送的消息。这部分消息会一直存在于消息队列中,等待被处理。每个线程中只会有一个MessageQueue对象。 4、Looper Looper是每个线程中的MessageQueue的管家,调用Looper的loop()方法后,就会进入到一个无限循环当中,然后每当发现MessageQueue中存在一个消息,就会将它取出,并传递到Handler的handlemessage()方法。 (1)首先需要在主线程当中创建一个Handler对象,并重写handleMessage()方法 (2)然后当子线程中需要进行UI操作时,就创建一个Message对象,并通过Handler对象将这条消息发送出去。 (3)之后这条消息会被添加到Messagequeue的队列中等待被处理,而Looper则会一直尝试从MessageQueue中取出待处理消息。 (4)最后分发回Handler的handleMessgae()方法。 

9.2.4 使用AsyncTask AsyncTask是一个抽象类,所以如果我们想使用它,就必须要创建一个子类去继承它。在继承时,我们可以为AsyncTask类指定三个泛型参数,这三个参数的用途如下: 1、Params  在执行AsyncTask时需要传入的参数,可用于在后台任务中使用。 2、Progress 后台任务执行时,如果需要在界面上显示当前的进度,则使用这里指定的泛型作为进度单位。 3、Result 当任务执行完毕后,如果需要对结果进行返回,则使用这里指定的泛型作为返回值类型。

例: class DownloadTask extend AsyncTask<Void ,Integer,Boolean>{} 第一个参数void,在执行AsyncTask不需要传入参数给后台任务 第二个参数Integer,使用整型数据来作为进度显示单位  第三个参数Boolean,使用布尔型数据来反馈执行结果

1、onPreExecute() 这个方法会在后台任务开始执行之前调用。用于一些界面上的初始化操作 2、doInbackground(Params。。) 这个方法中的所有代码都会在子线程中运行,我们应该在这里去处理所有的耗时任务。反馈当前任务的执行进度,可以调用PublishgProgress(Progress...)方法来完成。 3、onProgressUpdate(Progress...) 当在后台任务中调用了publishProgress(Progress。。)方法后,这个方法就会很快被调用。 4、onPostExecute(Result) 当后台任务执行完毕并通过return语句进行返回时,这个方法很快会被调用。返回的的数据进行一些UI操作。

9.3 服务的基本用法  9.3.1 定义一个服务 

一旦在项目的任何位置调用了Context的startService()方法,相应的服务就会启动起来,并回调onStartCommand()方法。如果这个服务之前还没有创建过,onCreate会先于onStartCommand()方法执行。服务启动了之后会一直保持运行状态,直到stopService或stopSelf()方法执行。每个服务只会存在一个实例。

还可以调用Context的bindService()来获取一个服务的持久连接,这时就会回调服务中的onBinde()方法。类似地,如果这个服务之前还没有创建过,onCreate()方法会先于onBind()方法执行。

9.5.1 使用前台服务  这种服务一旦启动之后,就会一直处于运行状态,必须调用stopService()或者stopSelf()方法才能让服务停止下来。 Android专门提供了一个IntentService类。这个类很好地剞劂了前面所提到的两种尴尬。

Android中的定时任务一般有两种实现方式,一种是使用java API里提供的Timer类,一种是使用Android 的Alarm机制。这种方式在多数情况下都能实现类似的效果,但Timer有一个明显的短板,它并不太适用于那些需要长期在后台运行的定时任务。 Alarm机制则不存在这种情况,它具有唤醒CPU的功能,即可以保证每次需要执行定时任务的时候,CPU都能正常工作。

用于指定指定AlarmManager的工作类型,有四种值可选,分别是 ELapsed-Realtime:让定时任务从开系统开机开始算起 ELapsed_realtime_wakeup::让定时任务从开系统开机开始算起 ,但会唤醒CPU  RTC :让定时任务的触发事件从1970年1月1日0点开始算起 RTC_WAKEUP:让定时任务的触发事件从1970年1月1日0点开始算起,但会唤醒CPU 

继续阅读