《第一行代码》笔记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:

AndroidManifest.xml文件中设置activity的action和category

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

<category android:name="android.intent.category.DEFAULT"/>

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

2.在MainActivity中写跳转语句:


Intent的隐式跳转

其它隐式跳转:

  • 跳转到网页
    action写为:
跳转网页的Action

Activity中写为:

跳转网页的隐式Intent写法

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

最后的效果:


打开网页的效果

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

清单文件中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()方法,并在其中加入如下语句:


    指明当前页面所在的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<Activity> 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());
    }
}

然后按如下方法调用

调用万能的随时退出类

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

实践三:

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

让调用者可以知道传参数量的情况,更方便调用

实践四:

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

(5)活动中使用Menu

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

<menu ....>
    <item
          android:id="@+id/add_item"
          android:title="Add">

    </item>
</menu>

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

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

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

2. Android Studio目录结构

2.1 目录结构1-全局目录

全局目录

.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目录

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-资源目录

res目录

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

对于资源文件中的数据:

xml文件中的数据格式

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

在java文件中中引用资源

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

在布局文件中引用资源

2.4 详解build.gradle文件

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

外层build.gradle文件

内层build.gradle文件:


内层build.gradle文件

3. Android日志工具Log

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

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


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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,657评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,889评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,057评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,509评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,562评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,443评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,251评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,129评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,561评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,779评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,902评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,621评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,220评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,838评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,971评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,025评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,843评论 2 354

推荐阅读更多精彩内容