Android:随手记(小知识点)

说明
更新日期 2019-01-23

重要链接:

IntentFilter
Intent以及IntentFilter详解
Android——四大组件、六大布局、五大存储

Java的流式输入输出建立在4个抽象类的基础上:InputStream,OutputStream,Reader和Writer。它们用来创建具体的流式子类。InputStream和OutputStream类被设计为字节类,而Reader和Writer被设计为字符流类。

一般,处理字符和字符串用字符流类,字节和二进制文件用字节类。


drawable 开头的文件夹都是用来放图片的,所有以 values 开头的文件夹都是用来放字符串的, layout 文件夹是用来放布局文件的,menu 文件夹是用来放菜单文件的。

  • ConnectivityManager主要管理和网络连接相关的操作;
  • TelephonyManager则管理和手机、运营商等的相关信息;
  • WifiManager则管理和wifi相关的信息。
  • NetworkInfo类包含了对wifi和mobile两种网络模式连接的详细描述,通过其getState()方法获取的State对象则代表着连接成功与否等状态。

Android四大组件分别为activity、service、content provider、broadcast receiver

IntentFilter(意图过滤器)
主要用来过滤隐式意图。当用户进行一项操作的时候,Android系统会根据配置的 “意图过滤器” 来寻找可以响应该操作的组件,服务。

Android系统会根据我们配置的Intent Filter),来进行匹配测试。匹配的时候,只会考虑三个方面:动作、数据(URI以及数据类型)和类别

另外,当对其他App程序开放组件和服务的时候也需要配置Intent Filter,一个Activity可以配置多个<intent-filter>。

  • 动作测试:

对应<intent-filter>中的<action/>标签;
(1) 如果<intent-filter>标签中有多个<action/>,那么Intent请求的Action,只要匹配其中的一条<action/>就可以通过了这条<intent-filter>的动作测试。

(2) 如果<intent-filter>中没有包含任何<action/>,那么无论什么Intent请求都无法和这条<intent-filter>匹配。

(2) 如果Intent请求中没有设定Action(动作),那么这个Intent请求就将顺利地通过<intent-filter>的动作测试(前提是<intent-filter>中必须包含有<action/>,否则与第二条冲突)。

  • 类别测试:

对应<intent-filter>中的<category />标签;

(1)Intent中的类别必须全部匹配<intent-filter>中的<category />,但是<intent-filter>中多余的<category />将不会导致匹配失败。

例如:Intent中有3个类别,而意图过滤器中定义了5个,如果Intent中的3个类别都与过滤器中的匹配,那么过滤器中的另外2个,将不会导致类别测试失败。

注意:有一个例外,Android把所有传给startActivity()的隐式意图当作他们包含至少一个类别:"android.intent.category.DEFAULT" (CATEGORY_DEFAULT常量)。 因此,想要接收隐式意图的活动必须在它们的意图过滤器中包含"android.intent.category.DEFAULT"。(带"android.intent.action.MAIN"和"android.intent.category.LAUNCHER"设置的过滤器是例外)

  • 数据测试:

对应<intent-filter>中的<data>标签;

<data>元素指定了可以接受的Intent传过来的数据URI和数据类型,当一个意图对象中的URI被用来和一个过滤器中的URI比较时,比较的是URI的各个组成部分。

例如:

如果过滤器仅指定了一个scheme,所有该scheme的URIs都能够和这个过滤器相匹配;

如果过滤器指定了一个scheme、主机名但没有路经部分,所有具有相同scheme和主机名的URIs都可以和这个过滤器相匹配,而不管它们的路经;

如果过滤器指定了一个scheme、主机名和路经,只有具有相同scheme、主机名和路经的URIs才可以和这个过滤器相匹配。

当然,一个过滤器中的路径规格可以包含通配符,这样只需要部分匹配即可。

比较规则如下:

(1) 一个既不包含URI也不包含数据类型的意图对象,仅在过滤器也同样没有指定任何URI和数据类型的情况下才能通过测试。

(2)一个包含URI但没有数据类型的意图对象,仅在它的URI和一个同样没有指定数据类型的,过滤器里的URI匹配时才能通过测试。这通常发生在类似于mailto:和tel:这样的URIs上:它们并不引用实际数据。

(3)一个包含数据类型但不包含URI的意图对象,仅在这个过滤器列举了同样的数据类型,而且也没有指定一个URI的情况下才能通过测试。

(4)一个同时包含URI和数据类型(或者可从URI推断出数据类型)的意图对象可以通过测试,如果它的类型和过滤器中列举的类型相匹配的话。如果它的URI和这个过滤器中的一个URI相匹配或者它有一个内容

content:或者文件file: URI,而且这个过滤器没有指定一个URI,那么它也能通过测试。换句话说,一个组件被假定为支持 ”content: 数据“和“file: 数据”,如果它的过滤器仅列举了一个数据类型。

提示:在同一个应用内,能使用显示意图,就尽量使用显示意图,增加程序的效率,理论上隐式意图匹配规则是需要花时间寻找的。

该部分意图过滤器参考自简述 IntentFilter(意图过滤器),在此表示感谢。


abstract 和 interface

  1. 抽象类可以有构造方法,接口不能有构造方法;
  2. 抽象类中可以有普通成员变量,接口中没有普通成员变量;
  3. 抽象类中可以包含非抽象的普通方法,接口中的所有方法必须是抽象的,不能有非抽象的普通方法;
  4. 抽象类中抽象方法的访问类型可以是public,protected和默认类型虽然(eclipse下不报错,但应该也不行),但接口中的抽象方法只能是public类型,并且默认即为public abstract类型;
  5. 抽象类中可以包含静态方法,接口中不能包含静态方法;
  6. 抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是public static final类型,并且默认即为public static final类型;
  7. 一个类可以实现多个接口,但只能继承一个抽象类。

给listView设置分割线:并设置偏移
可以在drawable里创建list_divider_bg.xml

<?xml version="1.0" encoding="utf-8"?>
<inset xmlns:android="http://schemas.android.com/apk/res/android"
    android:insetLeft="10dp"
    android:insetRight="10dp">

    <shape android:shape="rectangle">
        <solid android:color="#ff0025"/>
    </shape>
</inset>

设置listView

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <ListView
        android:id="@+id/lv_fruit"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:divider="@drawable/list_divider_bg"
        android:dividerHeight="1dp"/><!--必须设置dividerHeight-->

</LinearLayout>

注意:如果android:divider配置的是一个颜色,或者setDivider()配置的是一个ColorDrawable对象,一定要通过android:dividerHeight或setDividerHeight()来设置分割线的高度。不能试图只设置分割线颜色,然后让ListView使用默认分割线高度。

活动启动的最佳方式--actionStart()
为了避免开发过程中会产生沟通上的问题,比如参数是什么之类的,很影响我们开发的效率。

// 要被调用的活动里,定义类方法
public static void actionStart(Context context, String param) {
        Intent intent = new Intent(context, SecondActivity.class);
        intent.putExtra("key", param);
        context.startActivity(intent);
    }

// 在上个活动里直接调用
SecondActivity.actionStart(MainActivity.this, "string data");

2028539-2ad5eb60c3d7fd4e.png
限定符

fragment的几个回调

1. onAttach()
    当碎片和活动建立关联的时候调用。
2. onCreateView()
    为碎片创建视图(加载布局)时调用。
3. onActivityCreated()
    确保与碎片相关联的活动一定已经创建完毕的时候调用。
4. onDestroyView()
    当与碎片关联的视图被移除的时候调用。
5. onDetach()
    当碎片和活动解除关联的时候调用。
2028539-fd326cc15f7ee36a.png
图示

数组中的数据是无法直接传递给 ListView 的,我们还需要借助适配器来完成。

活动的启动模式(launchMode):standard(默认模式,每次都会创建新的实例)、singleTop(当在栈顶时,不会创建新的实例;但没在栈顶,仍会创建新实例)、singleTask(每次启动该活动时系统首先 会在返回栈中检查是否存在该活动的实例,如果发现已经存在则直接使用该实例,并把在这 个活动之上的所有活动统统出栈,如果没有发现就会创建一个新的活动实例)、singleInstance(在这种模式下会有一个单独的返回栈来管理这个活动,不管是哪个应用程序来访问这个活动,都共用的同一个返回栈,也就解决了共享活动实例的问题。)。

Activity状态:1、运行;2、暂停;3、停止;4、销毁。

活动的生存期:

  1. onCreate()
    这个方法你已经看到过很多次了,每个活动中我们都重写了这个方法,它会在活动 第一次被创建的时候调用。你应该在这个方法中完成活动的初始化操作,比如说加载布 局、绑定事件等。
  2. onStart()
    这个方法在活动由不可见变为可见的时候调用。
  3. onResume()
    这个方法在活动准备好和用户进行交互的时候调用。此时的活动一定位于返回栈的
    栈顶,并且处于运行状态。
  4. onPause()
    这个方法在系统准备去启动或者恢复另一个活动的时候调用。我们通常会在这个方 法中将一些消耗 CPU 的资源释放掉,以及保存一些关键数据,但这个方法的执行速度 一定要快,不然会影响到新的栈顶活动的使用。
  5. onStop()
    这个方法在活动完全不可见的时候调用。它和 onPause()方法的主要区别在于,如 果启动的新活动是一个对话框式的活动,那么 onPause()方法会得到执行,而 onStop() 方法并不会执行。
  6. onDestroy()
    这个方法在活动被销毁之前调用,之后活动的状态将变为销毁状态。
  7. onRestart()
    这个方法在活动由停止状态变为运行状态之前调用,也就是活动被重新启动了。
    以上七个方法中除了 onRestart()方法,其他都是两两相对的,从而又可以将活动分为三种生存期。
    a. 完整生存期
    活动在 onCreate()方法和 onDestroy()方法之间所经历的,就是完整生存期。一般情 况下,一个活动会在 onCreate()方法中完成各种初始化操作,而在 onDestroy()方法中完 成释放内存的操作。
    b. 可见生存期
    活动在 onStart()方法和 onStop()方法之间所经历的,就是可见生存期。在可见生存 期内,活动对于用户总是可见的,即便有可能无法和用户进行交互。我们可以通过这两 个方法,合理地管理那些对用户可见的资源。比如在 onStart()方法中对资源进行加载, 而在 onStop()方法中对资源进行释放,从而保证处于停止状态的活动不会占用过多内存。
    c. 前台生存期
    活动在 onResume()方法和 onPause()方法之间所经历的,就是前台生存期。在前台 生存期内,活动总是处于运行状态的,此时的活动是可以和用户进行相互的,我们平时 看到和接触最多的也这个状态下的活动。
2028539-ce2cdb50aedc3f63.png
图示
  1. Log.v ()用于打印那些最为繁琐的、意义最小的日志信息。对应级别verbose,是Android日志里面级别最低;
  2. log.d ()用于打印一些调试信息,有助于调试程序和分析问题,对应级别debug,比verbose高一级;
  3. log.i ()用于打印一些比较重要的数据,这些数据是你非常想看到的数据、可帮你分析数据。对应info;
  4. log.w()用于打印一些警告信息,提示程序在这个地方存在潜在风险,最好去修复出现警告的地方。对应warn;
  5. log.e()用于打印程序中错误信息,比如程序进入到catch语句当中,当有错误信息打印出来时,一般代表你的程序出现严重问题了,必须尽快修复。对应级别error。

当 android:orientation="vertical" 时, 只有水平方向的设置才起作用,垂直方向的设置不起作用。 即:left,right,center_horizontal 是生效的。 当 android:orientation="horizontal" 时, 只有垂直方向的设置才起作用,水平方向的设置不起作用。 即:top,bottom,center_vertical 是生效的。

一般带layout_的都是相对于父视图或兄弟组件来说。


创建shape/selector

切换到Project,选Drawable Resource File,然后将Root element改成相应的类型。

<solid android:color = "xxx"> 这个是设置背景颜色的
<stroke android:width = "xdp" android:color="xxx"> 这个是设置边框的粗细,以及边框颜色的
<padding android:bottom="xdp"...> 这个是设置边距的
<corners android:topLeftRadius="10px"...> 这个是设置圆角的
<gradient> 这个是设置渐变色的,可选属性有: startColor:起始颜色 endColor:结束颜色 centerColor:中间颜色 angle:方向角度,等于0时,从左到右,然后逆时针方向转,当angle = 90度时从下往上 type:设置渐变的类型

TextView设置阴影在设置的时候必须要设置shadowRadius

如:

android:shadowColor="#ff0025"
android:shadowRadius="3"
android:shadowDx="10"
android:shadowDy="10"

2028539-544f0e1689bb07b4.png
效果图

TextView支持的HTML标签:

<font>:设置颜色和字体。
<big>:设置字体大号
<small>:设置字体小号
<i><b>:斜体粗体
<a>:连接网址
<img>:图片

2028539-0c8a3d91a792426d.png
LinearLayout
2028539-f14d654c876c5a11.png
RelativeLayout
2028539-1c57b3881098482a.png
Grid

注:该部分图片来自于网络


猜你喜欢

转载自blog.csdn.net/weixin_34067102/article/details/86963198