《第一行代码》笔记1--初识Android与Android|《第一行代码》笔记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,也就是下面的语句,不然会报错
这说明隐式跳转的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)
- 当前页面返回到上一个页面时的传值
创建一个只用于传值的Intent,并用setIntent(RESULT_OK,intent)
@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类型的参数用于保存数据。
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 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代表菜单里的一个按钮
第二步是在对应Activity中重写
onCreateOptionsMenu()
方法,主要用到的语句是:getMenuInflater().inflate(R.menu.main,menu);
2. Android Studio目录结构 2.1 目录结构1-全局目录
文章图片
全局目录
.gradle和.idea: Android Studio自动生成的文件2.2 目录结构2--app目录
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: 指定项目中所有引用的模块,通常情况下模块的引用都是自动完成的
文章图片
app目录
build: 和外层build目录类似,不过里面的内容更多更杂2.3 目录结构3-资源目录
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: 指定项目代码的混淆规则,当代码开发完成后打成安装包文件,如果不希望代码被别人破解,通常会将代码混淆
文章图片
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常量【《第一行代码》笔记1--初识Android与Android|《第一行代码》笔记1--初识Android与Android Studio】庆祝第一篇文章完结,撒花★,°:.☆( ̄▽ ̄)/$:.°★ 。
推荐阅读
- 慢慢的美丽
- 《真与假的困惑》???|《真与假的困惑》??? ——致良知是一种伟大的力量
- 《跨界歌手》:亲情永远比爱情更有泪点
- 诗歌:|诗歌: 《让我们举起世界杯,干了!》
- 期刊|期刊 | 国内核心期刊之(北大核心)
- 《魔法科高中的劣等生》第26卷(Invasion篇)发售
- 人间词话的智慧
- 《一代诗人》37期,生活,江南j,拨动心潭的一泓秋水
- 广角叙述|广角叙述 展众生群像——试析鲁迅《示众》的展示艺术
- 书评——《小行星》