注:上一周较忙,笔记比较草率。现整理部分前几周所学和在博客上的收获,希望都是对大家有帮助的干货。(倒序)

第四周:1.Service的基本用法相信大家都熟悉了(注意在mainfest中注册),这里对其中的几种方法深入了解下。

Service不是进程也不是线程,它只是为了在后台运行Service,事实上Service是运行在主线程里的,有兴趣的同学可以自己打个LOG测试一下。

既然Service运行在主线程中,当然不能在其中直接进行一些耗时操作,防止ANR。最好在Service当中创建Thread进行耗时操作。

既然在Service里也要创建一个子线程,那为什么不直接在Activity里创建呢?这是因为Activity很难对Thread进行控制,当Activity被销毁之后,就没有任何其它的办法可以再重新获取到之前创建的子线程的实例。而且在一个Activity中创建的子线程,另一个Activity无法对其进行操作。但是Service就不同了,所有的Activity都可以与Service进行关联,然后可以很方便地操作其中的方法,即使Activity被销毁了,之后只要重新与Service建立关联,就又能够获取到原有的Service中Binder的实例。因此,使用Service来处理后台任务,Activity就可以放心地finish,完全不需要担心无法对后台任务进行控制的情况。(转自第一行代码作者 guolin)

OnCreate只会在Service第一次创建时调用,当Service已经创建后,OnCreate方法不会再被调用。

想让Service与Activity之间进行通信,需要用到onBind()这个方法,他其实就是和Activity进行关联的方法,与Activity进行一个绑定,重写onServiceConnected()方法和onServiceDisconnected()方法,这两个方法分别会在Activity与Service建立关联和解除关联的时候调用。以下是Binder的代码:

至于销毁Service必须得了解到只有Service没有和Activity绑定并且处于stop状态时,才会被onDestroy(),你可以同时StartService和BindService,然后通过LOG来调试。

2.BroadcastReciver广播接收器

主要掌握BroadcastReciver的两种注册方式和它的机制,在之后的音乐播放器中将通过广播来实现一些交互的功能。 (1).静态注册:即在MainFest文件中注册:

注意action,你想接收什么类型的广播,可以通过设置action来实现。

(2)动态注册

注意之后还要反注册。

注意动态注册广播接收器还有一个特点,就是当用来注册的Activity关掉后,广播也就失效了。静态注册无需担忧广播接收器是否被关闭,只要设备是开启状态,广播接收器也是打开着的。也就是说哪怕app本身未启动,该app订阅的广播在触发时也会对它起作用。

3.Webview的使用

这里就是Webview的一些方法和对Webview一些用法的讲解,之后在与网络相关时详细分析。

4.Widget挂件

首先注册Widget和设置好Widget的布局,实际上它是继承于BroadcastReciver的:

在XML文件中设置好Widget的布局。

然后我们想通过点击Widget实现一些功能,即实现Widget中控件的交互:我们要靠RemoteViews,直译成中文是远程视图; 也就是说通过这个东西我们能够获得不在同一进程中的对象,这也就为我们编写appwidget的处理事件提供了帮助。我们使用一下代码来创建一个RemoteViews:

注意其中的PendingIntent,可理解为Intent的未来式,实际上它传过去的还是一个Intent,PendingIntent这个类用于处理即将发生的事情。比如在通知Notification中用于跳转页面,但不是马上跳转。所以我们可以将它理解成一个封装成消息的intent的。即这个intent并不是立即start,而是像消息一样被发送出去,等接收方接到以后,再分析里面的内容。

可以看到,PendingIntent是Intent的封装,在构造PendingIntent前,也要先构造一个Intent,并可以利用Intent的属性传进去action,Extra等,同样,在接收时,对方依然是接收Intent的,而不是接收PaddingIntent。这个问题,我们后面可以看到。 PendingIntent.getBroadcast(context, 0,intent, 0);指从系统中获取一个用于可以发送BroadcastReceiver广播的PendingIntent对象。(转自harvic).

我们把它放在OnUpdate这个方法中,也可提出来,在其中调用这个Method,然后利用updateAppWidget()将构造的RemoteView更新指定的widget界面。注意一个APP可以创建多个Widget,实际上要实现交互,还是得通过广播的收发,通过作业可以理解的更深刻。

具体的代码图片近两天会上传。

第三周:自定义控件,Fragment与Handler。

一.自定义控件:

这是控件树结构和UI架构,从图中可以看出控件分为ViewGroup和View两类,ViewGroup作为父控件可以包含多个View,Activity中的findViewById()方法就是在控件树中遍历查找对应元素。

在界面架构图中可以看出一个Activity包含了View,DecorView是顶层视图,封装了一些窗口操作的通用方法。我们要想自己定义控件,View的测量方法也得了解。

就像画图一样,我们当然得告诉它有多大和在哪个位置。这里Android为我们提供了MeasureSpec类,它可以帮助我们测量View。测量的模式有:1.EXACTLY(match_parent)

          默认只支持该方法。

        2.AT_MOST(wrap_content)

        3.UNSPECIFIDE(自定义时常用)

所以,要重写OnMeasure()方法才能使用2,3种模式。

这里有一段可以作为模板的代码:

set方法将测量后的宽高设置进去,判断测量的模式,来给予不同的测量值,match_parent和设置定值从代码中应该能看出,不详记了。(图例代码转自徐医生,Android群英传作者)。

二.Fragment解析

三.Handler与线程

第二周:ListView的用法扩展和优化(补充)

内容较多,持续更新。(每周五,日更新)

results matching ""

    No results matching ""