android开发学习笔记(二)

三、Android系统提供的开发常用的包名及作用
    android.app :提供高层的程序模型、提供基本的运行环境
    android.content :包含各种的对设备上的数据进行访问和发布的类
    android.database :通过内容提供者浏览和操作数据库
    android.graphics :底层的图形库,包含画布,颜色过滤,点,矩形,可以将他们直接绘制到屏幕上.
    android.location :定位和相关服务的类
    android.media :提供一些类管理多种音频、视频的媒体接口
    android.net :提供帮助网络访问的类,超过通常的 java.net.* 接口
    android.os :提供了系统服务、消息传输、 IPC 机制
    android.opengl :提供 OpenGL 的工具
    android.provider :提供类访问 Android 的内容提供者
    android.telephony :提供与拨打电话相关的 API 交互
    android.view :提供基础的用户界面接口框架
    android.util :涉及工具性的方法,例如时间日期的操作
    android.webkit :默认浏览器操作接口
    android.widget :包含各种 UI 元素(大部分是可见的)在应用程序的屏幕中使用
        
四、Android系统提供的开发常用包的接口详解
    1、import android.annotation(安卓注解)
        annotation字面意思注解,位于framework 包的android.annotation中,其中所有注解类型都是通过java自带的@interface自定义的注解,而且
        每个自定义注解的用处在其对应的.java中都有说明。
        Android Annotations是一个开源框架,通过使用它开放出来的注解api,可以大大的减少无关痛痒的代码量,简洁代码
        Android Annotation Features(AA特性)
            Dependency injection(依赖注入 ): inject views, extras, system services, resources, ...
            Simplified threading model(简化了线程操作): annotate your methods so that they execute on the UI thread or on a background
            thread.
            Event binding(事件绑定): annotate methods to handle events on views, no more ugly anonymous listener classes!
            REST client(REST支持): create a client interface, AndroidAnnotations generates the implementation.
            No magic(AA不是魔法,只是生成了"SampleActivity_"的子类): As AndroidAnnotations generate subclasses at compile time, you can
            check the code to see how it works.
            体积小,无反射, 无运行时影响,所以性能也不会受到影响 AndroidAnnotations provide those good things and even more for less
            than 150kb, without any runtime perf impact!        
        注意:Android注释中MainThread,UiThread,WorkerThread,BinderThread之间的区别
            @MainThread ,应用程序启动时首次运行Thread
            @UiThread ,从MainThread运行UI工作
            @WorkerThread ,在程序员定义线程时运行
            @BinderThread ,用于ContentProvider中的query()/ insert()/ update()/ delete()方法
        
        还有一些annotation是放在androidx.annotation里或其他位置的,比如:
            @GuardedBy注解,类似于Java关键字synchronized关键字,但使用代替锁。用法是@GuardedBy(lock),这意味着有保护的字段或方法只能
            在线程持有锁时被某些线程访问。 故和synchronized的用意一样,是为了解决并发问题,确保线程互斥的访问同步代码。我们可以将锁定指定
            为以下类型:
                this : 在其类中定义字段的对象的固有锁。
                class-name.this : 对于内部类,可能有必要消除“this”的歧义; class-name.this指定允许您指定“this”引用的意图。
                itself : 仅供参考字段; 字段引用的对象。
                field-name : 锁对象由字段名指定的(实例或静态)字段引用。
                class-name.field-name : 锁对象由class-name.field-name指定的静态字段引用。
                method-name() : 锁对象通过调用命名的nil-ary方法返回。
                class-name :指定类的Class对象用作锁定对象。
                如下,这个是一个同步锁,只有在线程持有mResourcesManager对象锁时,才能使用这写变量!
                    private final ResourcesManager mResourcesManager;
                    @GuardedBy("mResourcesManager")
                    int mLifecycleSeq = 0;
                    
                    private int getLifecycleSeq() {
                        synchronized (mResourcesManager) {
                            return mLifecycleSeq++;
                        }
                    }
            注意:由上例也可以看出,当使用@GuardedBy时,是与synchronized呼应的!
            @VisibleForTesting可以把这个注解标注到类、方法或者字段上,以便在测试的时候可以使用。
                这个Annotation只是一个指示作用,告诉其他开发者该函数为什么有这么大的可见程度(为了测试单元或者其他类对其测试使用)。
                因此经常用来修饰public和protected,用其修饰private不会报错,但是意义很小。
                它不能改变任何权限。
            @NonNull可以标注在方法、字段、参数之上,表示对应的值不可以为空
            @Nullable注解可以标注在方法、字段、参数之上,表示对应的值可以为空
            
    2、import android.content.Context;
        Context字面意思上下文,位于framework 包的android.content.Context中,其实该类为LONG型,类似Win32中的Handle句柄,很多方法需要
        通过 Context才能识别调用者的实例,比如说Toast的第一个参数就是Context,一般在Activity中我们直接用this代替,代表调用者的 实例为
        Activity,而到了一个button的onClick(View view)等方法时,我们用this时就会报错,所以我们可能使用ActivityName.this来解决,主要原因
        是因为实现Context的类主要有Android特有的几个模型,Activity、Service以及BroadcastReceiver。
        Context提供了关于应用环境全局信息的接口。它是一个抽象类,它的执行被Android系统所提供。它允许获取以应用为特征的资源和类型。同时启
        动应用级的操作,如启动Activity,broadcasting和接收intents。
        比如微信聊天,此时的“环境”是指聊天的界面以及相关的数据请求与传输,Context在加载资源、启动Activity、获取系统服务、创建View等操作
        都要参与。
        在应用程序中Context的具体实现子类就是:Activity,Service,Application。那么 Context数量=Activity数量+Service数量+1。当然如果你足
        够细心,可能会有疑问:我们常说四大组件,这里怎么只有Activity,Service持有Context,那Broadcast Receiver,Content Provider呢?
        Broadcast Receiver,Content Provider并不是Context的子类,他们所持有的Context都是其他地方传过去的,所以并不计入Context总数。
        
    3、android.content.Intent;
        Intent是“意图”的意思,位于framework 包的android.content.Intent中,Intent通过指明当前组件想要执行的动作,让系统知道我们的“意图”之
        后,完成的一系列操作,除此之外,Intent还可以在不同组件之间传递数据。Intent一般可被用于启动活动(Activity(startActivity(intent)))、
        启动服务(Service(startService(intent)))以及发送广播(Broadcast(sendBroadcast(intent)))等场景。Intent大致可以分为两种:显式Intent
        和隐式Intent。
        1.Intent的七大属性
            ComponentName(组件):目的组件
            Action(动作):用来表现意图的行动
            Category(类别):用来表现动作的类别
            Data(数据):表示与动作要操纵的数据
            Type(数据类型):对于data范例的描写
            Extra(扩展信息):扩展信息
            Flags(标志位):期望这个意图的运行模式
            按照分类可以分为以下三种:
                1.用于启动:ComponetName(显式)、Action(隐式)、Category(隐式)
                2.用于传递数据:Data(隐式)、Type(隐式)、Extra(显式、隐式)
                3.用于规定启动模式:Flags
        下面记载Intent启动活动的知识:
        2.显式Intent
            Intent有多个构造函数的重载,其中一个是:
            Intent(Context packageContext,Class<?> cls)
            第一个参数Context要求提供一个启动活动的上下文;
            第二个参数Class指定想要启动的活动目标.
            通过这个构造函数就可以构建出Intent的“意图”,最后调用startActivity()方法就可以启动目标活动了
        3.隐式Intent
            隐式Intent并不明确指出我们想要启动哪一个活动,而是通过指定一系列更为抽象的action和category等信息,然后交由系统去分析这个
            Intent,并帮我们找出合适的活动去启动。
            通过隐式配置的Activity可以跨应用被启动。
            如果不想被别的应用启动,可以在activity配置中加上:android:exported="false"(默认为true)
        注意:
            android.content.IntentFilter;
            intentFilter是实现隐形的intent通信,当我们不想显性表露我们的意图可以使用 IntentFIlter
            简单来说,我们可以通过 intent.setAction(), .setData(), .addCategory(); 对intent添加标识符,然后通过intentFilter通过action,
            data,category识别出自己的intent,然后触发相应组件。
        
    4、Lifecycle
        1.为什么要使用Lifecycle
            Activity 和 Fragment 是有生命周期的,开发时我们的很多操作需要写在声明周期的方法中,比如,下载、文件操作等。这样很多情况下会
            导致,我们在 Activity中 的生命周期方法中写越来越多的代码,从而使得 Activity 或者 Fragment 越来越臃肿,代码维护越来越困难。
            这时我们使用Lifecycle就可以很好的解决这类问题。
            Lifecycle代码简洁,我们可以通过实现LifecycleObserver 接口来监听声明周期,然后我们在Activity和Fragment中去注册监听。
        2.几个重要的类和接口
            Lifecycle: Lifecycle是一个持有组件生命周期状态(如Activity或Fragment)的信息的类,并允许其他对象观察此状态。
            Event :从框架和Lifecycle类派发的生命周期事件。这些事件映射到活动和片段中的回调事件。
            State :由Lifecycle对象跟踪的组件的当前状态。
            LifecycleOwner (重要)Lifecycle持有者:实现该接口的类持有生命周期(Lifecycle对象),该接口的生命周期(Lifecycle对象)的改变会被
                其注册的观察者LifecycleObserver观察到并触发其对应的事件。
            LifecycleObserver(重要)Lifecycle观察者:实现该接口的类,通过注解的方式,可以通过被LifecycleOwner类的addObserver
                (LifecycleObserver o)方法注册,被注册后,LifecycleObserver便可以观察到LifecycleOwner的生命周期事件。
        3.LifeCycleOwner 和 LifecycleObserver
            LifecycleOwner(生命周期持有者接口)
                简单来说,LifecycleOwner 就是一个接口,谁继承了它,就持有了lifecycle对象。然后就可以调用getLifecycle()方法获取继承了抽象
                类Lifecycle的LifecycleRegistry,然后调用 addObserver(@NonNull LifecycleObserver observer) 方法来注册监听。这样,该接口的
                生命周期 (Lifecycle对象) 的改变会被其注册的观察者LifecycleObserver观察到并触发其对应的事件。
                注意:Support Library 26.1.0 及其以后的版本,Activity 和Fragment 已经实现了LifecycleOwner 接口。我们可以直接在Activity
                    和Fragment中使用getLifecycle()方法来获取 Lifecycle 对象,来添加观察者监听。
                    
                    getLifecycle() 方法能够获得它所拥有的Lifecycle 对象。
                    FragmentActivity 和 Fragment 均已实现该接口,可以直接使用。当然开发者也可以自定义。
                    LifecycleService 和 ProcessLifecycleOwner 是另外两个内置的实现类。
            LifecycleObserver(生命周期观察者接口)
                LifecycleObserver 是一个观察者接口,实现了它,可以通过注解或者继承的方式,来管理声明周期的监听。只要在持有lifecycle的类中
                注册了它,当声明周期发生变化时,它就能收到,进行我们自定义的操作。
        4.Lifecycle
            Lifecycle 类表示Android应用组件的生命周期,是被观察者。这是一个抽象类,它的实现是 LifecycleRegistry 类。另外,它通过使用两类
            数据来跟踪应用组件的生命周期变化,一种是事件,另一种是状态。
            Lifecycle.Event 表示生命周期的事件,与应用组件的生命周期回调一一对应,这些事件分别是:ON_CREATE、ON_START、ON_RESUME、
            ON_PAUSE、ON_STOP、ON_DESTROY、ON_ANY。最后一种事件可以代表前面任意一种。
            举个例子,当 Activity 的 onCreate() 生命周期方法被调用时会产生 ON_CREATE 事件,观察者可以监听该事件以便处理Activity此时的生命
            周期。
            Lifecycle.State 表示生命周期的状态,一共有5种,分别是:INITIALIZED、 DESTROYED、CREATED、STARTED、RESUMED。
            应用组件初始化之后进入 INITIALIZED 状态,在 onCreate() 生命周期方法调用后进入 CREATED 状态,在 onStart() 生命周期方法调用后
            进入 STARTED 状态,在 onResume() 生命周期方法调用后进入 RESUMED 状态。
            Lifecycle 对象有3个方法:
                添加观察者:void addObserver(LifecycleObserver observer)
                删除观察者:void removeObserver(LifecycleObserver observer)
                获取当前状态:State getCurrentState()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值