《第一行代码》笔记1--初识Android与Android Studio

说明:因为之前学习过一些Android开发相关的内容,所以这个阅读笔记主要是对知识的梳理,主要侧重于不太擅长的地方,欢迎大家读文章和一起交流O(∩_∩)O

1.初识Android

1.1 Android系统架构

四层架构,五块区域
1.Linux内核层 -提供底层驱动
2.系统运行库层
特性支持: C/C++库,如SQLite库提供了数据库的支持,OpenGL|ES库提供了3D绘图的支持,Webkit库提供浏览器内核支持(webkit主要是Safari和Chrome的浏览器渲染引擎)
Android运行时库: Java核心库、Dalvik虚拟机(作用是使app运行在核心进程中,它对手机性能、CPU性能有限等情况做了处理)
3.应用框架层 -各种API
4.应用层 -app

1.2 Activity

(1)Activity的跳转

使用Intent跳转有显式和隐式两种方式,其中隐式跳转方式如下:
(隐式保存方式相当于通过匹配action和category来跳转Activity,更通俗地讲,它不需要通过指明明确的Activity路径
1.在AndroidManifest.xml清单文件中注册被跳转Activity的action和category:

《第一行代码》笔记1--初识Android与Android Studio_第1张图片
AndroidManifest.xml文件中设置activity的action和category

注意:intent-filter中必须加上默认的catagory,也就是下面的语句,不然会报错


这说明隐式跳转的Activity需要在intent-filter中加上默认的catagory,而在Activity中不需要通过intent.addCategory();方法添加这个默认的catagory。

2.在MainActivity中写跳转语句:


《第一行代码》笔记1--初识Android与Android Studio_第2张图片
Intent的隐式跳转

其它隐式跳转:

  • 跳转到网页
    action写为:
《第一行代码》笔记1--初识Android与Android Studio_第3张图片
跳转网页的Action

Activity中写为:

《第一行代码》笔记1--初识Android与Android Studio_第4张图片
跳转网页的隐式Intent写法

其中Intent实例的参数要跟AndroidManifest.xml中的一致
(通过 setData();方法进行设置,通过 Url.parse()方法,将网络地址字符串解析成一个Uri对象)

最后的效果:


《第一行代码》笔记1--初识Android与Android Studio_第5张图片
打开网页的效果

最后的效果显示了可以打开网页的所有程序

清单文件中data标签可以配置的内容有:
android:scheme---数据协议(如http协议、geo(地理位置协议)、tel(拨打电话))
android:host---主机名(如www.baidu.com)
android:port---端口
android:path---域名之后的路径
android:mimeType---例如(text/html)

  1. 当前页面返回到上一个页面时的传值
    创建一个只用于传值的Intent,并用setIntent(RESULT_OK,intent)

通常,从当前页返回上一页用button来实现,如果用手机上的返回键返回上一页时,可以通过onBackPressed()方法来解决这个问题:

@override
public void onBackPressed(){
  Intent intent=new Intent();
  intent.putExtra("data_return","data_content");
  setResult(RESULT_OK,intent);
  finish();
}

(2)活动的生命周期

活动的生存期:
onCreate()---活动的初始化操作,如加载布局、绑定事件等。
onStart()---活动由不可见变为可见时
onResume()---活动由不可见变为可见或部分可见变为可见时
onPause()---用于启动或恢复另一个活动时,可以在这里释放CPU资源,保存数据(但是方法要快,不能影响新的栈顶活动的使用),或者部分可见时
onStop()---完全不可见时
onDestroy()---销毁活动时,在该方法中完成销毁活动等释放内存操作
onRestart()---活动重新被启动时

  • 当把一个Activity变为Dialog时,需要在AndroidManifest.xml文件中添加一个属性:
android:theme="@android:style/Theme.Dialog"
  • 活动被回收之前,调用onSavaInstanceState()可以携带Bundle类型的参数用于保存数据。

(3)活动的启动模式

Android使用任务(Task)来管理活动,一个任务就是一组存放在栈里的活动的集合,该栈也称返回栈(Back Stack),默认情况下,当启动了一个新的活动,该活动入栈顶,当按下Back键或调用finish()方法销毁一个活动时,栈顶活动出栈。
系统总是显示处于栈顶的活动给用户。
standard(默认)、singleTop、singleTask、singleInstance
可以通过在AndroidManifest.xml中给activity添加android:launchMode属性来选择启动模式
standard:启动相同的Activity时,不管返回栈中有没有该活动,都会入栈,每次都会创建新实例
singleTop:启动活动时如果发现返回栈的栈顶是该活动时,可以直接使用它(不是栈顶时会再创建一个)
singleTask:让某个活动在应用程序的整个上下文中只存在一个实例,如果返回栈中有该实例,该实例上的活动会统统出栈,直接使用该实例
调用之前的活动时会调用OnRestart()方法,当该实例完全显示出来后,原来的Activity会调用onDestroy()方法
singleInstance:单独的返回栈管理该活动,其它应用程序就可以到这里来访问它,解决了共享活动实例的问题,通过getTaskId()可以获取到当前活动所在的返回栈的Id,可以查看哪些活动在同一个栈中,哪个在单独的栈中,来验证singleInstance模式;
当按下back键时,会显示同栈内的栈顶活动,其次显示其它栈的栈顶元素,也是同理~
根据书上的例子来理解,更好理解哦~

(4)活动的最佳实践

实践1:

快速判断当前页面是哪个活动:
方法:

  • 创建一个继承Activity的BaseActivity类
  • 在BaseActivity中重写onCreate()方法,并在其中加入如下语句:


    《第一行代码》笔记1--初识Android与Android Studio_第6张图片
    指明当前页面所在的activity的语句
  • 其它Activity原先继承Activity,全部改为继承BaseActivity
    这样,当运行页面时,Logcat页面就会有如下字样:


    logcat相应日志

实践二:

随时退出程序
一个神奇的可以完成随时退出功能的类:

package com.example.test.foralltest;

import android.app.Activity;
import java.util.ArrayList;
import java.util.List;

/**
 * 可以随时随地退出程序
 */
public class ActivityCollector {

    public static List activityList = new ArrayList<>();

    /**
     * addActivity
     * @param activity
     */
    public static void addActivity(Activity activity) {
        activityList.add(activity);
    }

    public static void removeActivity(Activity activity) {
        activityList.remove(activity);
    }

    public static void finishAll() {
        for (Activity activity : activityList) {
            if (!activity.isFinishing()) {
                activity.finish();
            }
        }
        //退出时杀掉当前进程
        android.os.Process.killProcess(android.os.Process.myPid());
    }
}

然后按如下方法调用

《第一行代码》笔记1--初识Android与Android Studio_第7张图片
调用万能的随时退出类

如果想在哪里直接退出应用,可以直接调用 Activity Collector.finishAll()方法

实践三:

方便调用下一个Activity(适用于不是只有自己开发的情况)
在被调Activity中写一个:

《第一行代码》笔记1--初识Android与Android Studio_第8张图片
让调用者可以知道传参数量的情况,更方便调用

实践四:

拯救进入停止状态之后被回收的活动的临时数据得不到保存的问题
当活动(A)进入停止状态,可能会被系统回收,这时如果想通过当前活动(B)返回A,未被回收的A会调用onRestart()方法,而被回收的A会调用onCreate()方法,这时如果A中有未完成的工作,重新创建A会使未完成的工作丢失,影响用户体验,所以用onSaveInstanceState()方法存数据,而在onCreate()方法中取数据:

《第一行代码》笔记1--初识Android与Android Studio_第9张图片

(5)活动中使用Menu

第一步是在res目录下创建menu文件夹,再在menu文件夹下创建名为main的菜单文件,菜单文件中的内容为:


    

    

标签根节点是menu
一个item代表菜单里的一个按钮

第二步是在对应Activity中重写onCreateOptionsMenu()方法,主要用到的语句是:

getMenuInflater().inflate(R.menu.main,menu);

2. Android Studio目录结构

2.1 目录结构1-全局目录

《第一行代码》笔记1--初识Android与Android Studio_第10张图片
全局目录

.gradle和.idea: Android Studio自动生成的文件
app: 代码资源等 和开发工作 在该目录下
build: 编译时自动生成的文件
gradle: 使用gradle wrapper的方式如果没有的话会自动缓存,也可以在网上下载对应版本的gradle压缩包(网络不好或下载很慢的情况)放到C:\Users\belie\.gradle\wrapper\dists\gradle-4.6-all下,文件名的版本名称和压缩包的要对应好
.gitignore: 将指定的目录或文件排除在版本控制之外
build.gradle: 项目全局的gradle构建脚本
gradle.properties: 全局的gradle配置文件,这里的配置会影响项目中所有的gradle编译脚本
*.imi 用于标识这是一个IntelliJ IDEA项目,不需要修改
local.properties: 指定本机中的Android SDK路径(通常自动生成)
settings.gradle: 指定项目中所有引用的模块,通常情况下模块的引用都是自动完成的

2.2 目录结构2--app目录

《第一行代码》笔记1--初识Android与Android Studio_第11张图片
app目录

build: 和外层build目录类似,不过里面的内容更多更杂
libs: 放第三方jar包
androidTest: 写Android Test测试用例用,对项目的一些自动化测试
java: 存放java代码
res: 存放图片、布局、字符串等各种资源
AndroidManifest.xml: 组件注册、权限声明
test: 编写Unit Test测试用例,对项目自动化测试的另一种方式
gitignore: 将app模块内指定的目录或文件排除在版本控制之外
app.iml: IntelliJ IDEA项目自动生成的文件
build.gradle: app模块的gradle构建脚本
proguard-rules.pro: 指定项目代码的混淆规则,当代码开发完成后打成安装包文件,如果不希望代码被别人破解,通常会将代码混淆

2.3 目录结构3-资源目录

《第一行代码》笔记1--初识Android与Android Studio_第12张图片
res目录

drawable开头: 放图片,可以自己创建drawable-hdpi等代表不同分辨率的文件夹
mipmap开头: 放应用图标,很多个mipmap文件夹是为了兼容各种设备
values开头: 放字符串、样式、颜色等配置
layout: 放布局文件

对于资源文件中的数据:

《第一行代码》笔记1--初识Android与Android Studio_第13张图片
xml文件中的数据格式

有两种引用方式,在java中的引用方式为:

《第一行代码》笔记1--初识Android与Android Studio_第14张图片
在java文件中中引用资源

在xml文件中的引用方式为:

在布局文件中引用资源

2.4 详解build.gradle文件

gradle构建工具使用基于Groovy的领域特定语言(DSL,Domain Specific Language)来声明项目设置,摒弃了传统基于XML(如Ant和Maven)的各种繁琐配置。
全局下的(外层)build.gradle文件:

《第一行代码》笔记1--初识Android与Android Studio_第15张图片
外层build.gradle文件

内层build.gradle文件:

《第一行代码》笔记1--初识Android与Android Studio_第16张图片

《第一行代码》笔记1--初识Android与Android Studio_第17张图片
内层build.gradle文件

3. Android日志工具Log

为什么使用Log而不使用System.out?
因为后者日志打印不可控制,打印时间无法确定,无法通过添加过滤器进行筛选,没有级别区分
Log的快捷输入:
logd
logi
logw
...

logt+tab键 :以当前类名作为值自动生成一个tag常量


庆祝第一篇文章完结,撒花★,°:.☆( ̄▽ ̄)/$:.°★

你可能感兴趣的:(《第一行代码》笔记1--初识Android与Android Studio)