安卓----第三周

自定义控件

dp、sp和px的爱与纠缠

是什么?

  • px:像素点
  • dp:与像素密度密切相关100px 200px
  • sp:相当于dp(用来修饰文字的)
  • dip:=dp

怎么用

  • 文字的尺寸一律用sp单位
  • 非文字的尺寸一律用dp单位
  • 偶尔需要使用px单位:例如需要在屏幕上画一条细的分割线:1px

Inflater如何使用?

  • LayoutInflater将XML文件解析为试图

获得LayoutInflater实例的三种方式

  • getLayoutInflater();
  • getSystemService(LAYOUT_INFLATER_SERVERCE);
  • LayoutInflater.from(context);

提取布局属性:theme&style(在res-values-styles.xml下)

  • Theme是针对窗体级别的,改变窗体样式
  • Style是针对窗体元素级别的,改变指定控件或者Layout的样式
  • 抽象view的共同属性
  • 可继承(可以覆盖父样式的属性)
  • 可改变Activity的样式

View是如何工作的?

  • 构造器-初始化
  • onMesure()定大小
  • onLayout() 定位置
  • onDraw() 绘制
  • invalidate() 刷新

自定义控件的三种主要形式:

创建形式:

  • 继承已有的控件来实现自定义控件
  • 通过继承一个布局文件实现自定义控件
  • 通过继承view类来实现自定义空间

如何自定义试图的属性

  • 在哪里创建属性(res-values下新建一个XML文件来定义属性)
  • 可以创建那些属性
  • 如何使用这些属性
    代码中引用
    布局中设置

如何使用大名鼎鼎的Fragment(很像一个activity,整个大房间中的一个小房间)

什么是Fragment

  • Fragment是activity界面中的一部分
  • 多个Fragment们组合到一个activity中
  • 多个activity中可重用一个Fragment

总结

  • Fragment相当于模块化的一段activity
  • 具有自己的生命周期,接收自己的事件
  • 在acitivity运行时被添加或删除

为什么要使用Fragment?

安卓----第三周_第1张图片
  • 支持更动态更灵活的界面设计
  • 在平板上的应用
  • Activity的layout分成Fragment

如何使用Fragment

Create Fragment
  • onCreate()
  • onCreateView()
  • onPause()

Add Fragment

  • Java Code
  • Layout

Replace Fragment

如何管理?

  • 查找
    findFragmentById();
    findFragmentByTag();
  • Fragment的后退
    Fragment Stack
    popBackStack()
    addOnBackStackChangedListerner()

总结

  • FragmentManager
  • FragmentTransaction
  • Add/Remove

Fragment的生命周期

安卓----第三周_第2张图片

三种状态

  • Resumed
  • Paused
  • Stoped

静态加载Fragment

安卓----第三周_第3张图片

示例代码:
Step 1:定义Fragment的布局,就是fragment显示内容的
Step 2:自定义一个Fragment类,需要继承Fragment或者他的子类,重写onCreateView()方法 在该方法中调用:inflater.inflate()方法加载Fragment的布局文件,接着返回加载的view对象

public class Fragmentone extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
View view = inflater.inflate(R.layout.fragment1, container,false); return view;
} }

Step 3:在需要加载Fragment的Activity对应的布局文件中添加fragment的标签, 记住,name属性是全限定类名哦,就是要包含Fragment的包名,如:

android:name="com.jay.example.fragmentdemo.Fragmentone" android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1" />

Step 4: Activity在onCreate( )方法中调用setContentView()加载布局文件即可!

动态加载Fragment

实现流程:

安卓----第三周_第4张图片

Fragment管理与Fragment事务

安卓----第三周_第5张图片

有用的Handler(线程之间进行通信)

  • 多线程与异步(不要在主线程里开发)

Fragment与Activity的交互

安卓----第三周_第6张图片

什么是Handler?

安卓----第三周_第7张图片
handle.jpg

用来做什么?

  • 定时执行Message和MessageQueue
  • 在不同线程中执行

Message、MessageQueue和Looper

  • Message
    2个整型值
    一个Object
  • MessageQueue
    Message的队列
    每一个线程最多只可以拥有一个
    Thread->Looper->MessageQueue
  • Looper
    消息泵

Looper的原理

  • Looper是做什么的?
  • 如何使用
    是MessageQueue的管理者
    Looper.prepare()
    每一个Looper对象和一个线程关联
    Looper.myLooper()可以获得当前线程的Looper对象
    Looper从MessageQueue中取出Message
    交由Handle的handleMessage进行处理
    调用Message.recyle()将其放入Message Pool中

怎么使用

obtainMessage()
sendMessage()
handleMessage()

Service----服务

  • Service作为Android四大组件之一,在每一个应用程序中都扮演着非常重要的角色。它主要用于在后台处理一些耗时的逻辑,或者去执行某些需要长期运行的任务。必要的时候我们甚至可以在程序退出的情况下,让Service在后台继续保持运行状态。
    MusicService 音乐服务

两种形式

  • Started
  • Bound
    binder通信的四个角色应该是client组件,server组件,serviceManager和binder驱动。client组件和server组件进行通信,要通过ServiceManager查询server组件的引用。server向ServiceManager注册一个binder尸体,client通过ServiceManager获得binder实体的一个引用,这样client和server就可以通信了。

在AndroidMainfest中申明Service


...

...

Service的生命周期

安卓----第三周_第8张图片

Bound Service Lifecyle

  • 当一个service的所有客户端都解除绑定,Android系统就销毁它(除非它是从onStartCommand()启动).如果你的service是一个纯boundservice,你不需管理它的生命期—Android系统会为你管理它.
  • 然而,如果你选择了实现onStartCommand()回调方法,那么你必须明确地停止service,因为service现在被认为是"开始的".在此情况下,service会一直运行,直到service使用stopSelf()停止它自己或另外的组件调用了stopService()停止了它,不管是否有客户端绑定了它.
  • 另外,如果你的service已经启动并且接受绑定,那么当系统调用你的onUnbind()方法,你可以选择返回true表示你想在客户端下一次绑定到service时接受一个对onRebind()的调用(而不是一个对onBind()的调用).onRebind()返回void,但是客户端依然会在它的onServiceConnected()回调中接收到IBinder.


    安卓----第三周_第9张图片

IntentService

  • IntentService是继承与Service并处理异步请求的一个类,在IntentService中有 一个工作线程来处理耗时操作,请求的Intent记录会加入队列
    工作流程:
    客户端通过startService(Intent)来启动IntentService; 我们并不需要手动地区控制IntentService,当任务执行完后,IntentService会自动停止; 可以启动IntentService多次,每个耗时操作会以工作队列的方式在IntentService的 onHandleIntent回调方法中执行,并且每次只会执行一个工作线程,执行完一,再到二这样!

Broadcast Receiver

是什么,怎么使用

  • 四大组件之一:广播(通知消息)接收器
  • 系统使用了很多广播:
    通知时间改变
    电池电量变低
    拍摄了照片
    改变了语言
  • 没有用户界面
  • extends BroadcastReceiver

两种注册方式

安卓----第三周_第10张图片

如何接受广播

  • onReceiver方法

广播的类型

  • Normal broadcasts
  • Ordered broadcasts

BroadcastReceiver的生命周期

  • Register
  • SendBroadcast
  • OnReceive
  • UnRegister

Webview

什么是Webview?

Android内置webkit内核的高性能浏览器,而WebView则是在这个基础上进行封装后的一个 控件,WebView直译网页视图,我们可以简单的看作一个可以嵌套到界面上的一个浏览器控件!

如何使用

  • 申请网络权限
  • 类结构
  • 常用设置:
    WebSettings
    WebViewClient
    WebChromeClient
  • 调试

更深入的使用

  • Cookie
  • History
  • 页面导航
  • Hybird
  • 如何拦截网络请求
  • 如何显示进度
  • 调试

注意事项

  • API版本
  • 离线Cookie管理
  • Token
  • 与原生交互Hybrid等

酷特性Widget

  • App Widget是应用程序窗口小部件(Widget)是微型的应用程序视图,它可以被嵌入到其它应用程序中(比如桌面)并接收周期性的更新。
  • 这里涉及到两个方面的内容:AppWidgetProvider类和appwidget-provider标签;

appwidget-provider标签

用来定义桌面widget的大小,初始状态等等信息的,它的位置应该放在res/xml文件夹下,具体的xml参数如下:

  • android:minWidth : 最小宽度
  • android:minHeight : 最小高度
  • android:updatePeriodMillis : 更新widget的时间间隔(ms),"86400000"为1个小时
  • android:previewImage : 预览图片
  • android:initialLayout : 加载到桌面时对应的布局文件
  • android:resizeMode : widget可以被拉伸的方向。horizontal表示可以水平拉伸,vertical表示可以竖直拉伸
  • android:widgetCategory : widget可以被显示的位置。home_screen表示可以将widget添加到桌面,keyguard表示widget可以被添加到锁屏界面。
  • android:initialKeyguardLayout : 加载到锁屏界面时对应的布局文件

AppWidgetProvider类

上面我们通过appwidget-provider标签就可以得到初始化的布局,视图等,但我们的widget要实时更新怎么办,要响应用户操作怎么办,这就需要额外的类来辅助处理了,这个类就是AppWidgetProvider。

  • onUpdate():
    在3种情况下会调用OnUpdate()。onUpdate()是在main线程中进行,因此如果处理需要花费时间多于10秒,处理应在service中完成。(第二篇会讲为什么还要有service)(1)在时间间隔到时调用,时间间隔在widget定义的android:updatePeriodMillis中设置;
    (2)用户拖拽到主页,widget实例生成。无论有没有设置Configure activity,我们在Android4.4的测试中,当用户拖拽图片至主页时,widget实例生成,会触发onUpdate(),然后再显示activity(如果有)。这点和资料说的不一样,资料认为如果设置了Configure acitivity,就不会在一开始调用onUpdate(),而实验显示当实例生成(包括创建和重启时恢复),都会先调用onUpate()。在本例,由于此时在preference尚未有相关数据,创建实例时不能有效进行数据设置。
    (3)机器重启,实例在主页上显示,会再次调用onUpdate()
  • onDeleted(Context, int[]):
    当 widget 被删除时被触发。
  • onEnabled(Context):
    当第1个 widget 的实例被创建时触发。也就是说,如果用户对同一个 widget 增加了两次(两个实例),那么onEnabled()只会在第一次增加widget时触发。
  • onDisabled(Context):
    当最后1个 widget 的实例被删除时触发。
  • onReceive(Context, Intent):**
    在接收到广播时,调用。

你可能感兴趣的:(安卓----第三周)