Android学习笔记二之初始Activity
初识Activity,跟着教程学习敲了一遍这一章的内容,下面根据目录结构总结知识点:
一、活动是什么
上篇博文中我们提到了Android四大组件,其中有一个Activity,我们将之称为活动。活动是最容易吸引用户的地方,它包含用户界面的组件,主要和用户进行交互。
我们可以用HTML页面的例子理解:
每一个HTML页面中有各种HTML元素,例如按钮、文本框等,这些元素存在HTML网页中并通过HTML展示、或与我们交互,
我们可以把一个HTML网页看成一个活动,它也是用来包含各种组件与用户交互的。
二、活动的基本用法
1、手动创建活动
展开java目录,在我们的包名上右键——New——Activity——Empty Activity(可选其他样式),出现配置活动的对话框,其中各选项上篇博文已解释过,其中Launcher Activity表示设置此活动为主活动,我们不勾选,Finish完成创建。
2、创建并加载布局
创建活动时默认勾选Generate Layout File以生成对应的布局文件,如若要自行创建我们可以在layout目录上右键——New——Layout resource file,在对话框中我们填写布局文件名称及布局方式。
3、在AndroidManifest.xml中注册
上篇博文中我们说过应用中所有的四大组件都必须在配置文件中进行注册,没有注册的活动是不能使用的。 我们可以将主活动从配置文件中去掉,你会发现项目都起不来。
4、销毁一个活动
我们可以使用finish()方法销毁一个活动
三、使用Intent在活动间穿梭
Q:主活动是点击应用图标启动的活动,那么怎么启动另一个活动呢?
A:Intent(我不知道还有没有其他的启动方法,一步步来)
1、Intent的概念
Intent这个英语单词的本意是意图、目的。Intent是一种运行时绑定(runtime binding)机制,它能在程序运行的过程中连接两个不同的组件。用于向其他组件发送请求。根据Intent种类分为:显式Intent、隐式Intent。
2、显式Intent(明确指定需要启动的目标组件)
要启动一个名叫SecondActivity活动时我们可以这样写:
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//创建指定目标活动的Intent对象
//第一个参数是Context对象,Activity是Context子类,所以所有的Activity都可以向上转型为Context对象
//第二个参数是Class对象,当前情景应该传入目标活动的Class对象
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
startActivity(intent);
}
});
如需启动一个带有返回值的活动,我们可以将第8行改为:
startActivityForResult(intent, 1);//第二个参数是一个int类型的请求码
怎么在SecondActivity活动中返回参数呢,我们可以这样写:
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(SecondActivity.this, FirstActivity.class);
intent.putExtra("data_return", "Hello FirstActivity");
setResult(RESULT_OK, intent);//第一个参数是int类型的resultCode
finish();//销毁活动
}
});
如何在FirstActivity中接受SecondActivity活动返回的参数呢?我们可以在FirstActivity中重写onActivityResult(int requestCode, int resultCode, Intent data)方法,我们可以这样写:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {//还记得我们启动SecondActivity活动传过去的请求码吗
case 1:
if (resultCode == RESULT_OK) {//判断结果码
//因为FirstActivity返回的是String类型的参数,所以我们调用getStringExtra()方法,int类型我们可以调用getIntExtra()方法,以此类推
String returnedData = data.getStringExtra("data_return");
Log.d("FirstActivity", returnedData);//打印日志,debug层级
}
break;
default:
}
}
3、隐式Intent(并不明确指定要启动的活动,而是指定一系列抽象的action和category信息,交由系统分析找出适合的活动去启动)
Q:什么叫适合的活动呢?
A:简单说就是可以响应我们隐式Intent的活动。
我们可以在AndroidManifest.xml中的活动中配置<intent-filter>指定当前活动能响应的action和category。打开配置文件,修改SecondActivity活动,修改代码成如下:
<activity android:name=".SecondActivity" >
<intent-filter>
<action android:name="com.example.zhangshuaige.activitytest.ACTION_START" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
在action中我们指定了当前活动可以响应 com.example.zhangshuaige.activitytest.ACTION_START这个action,<category>标签包含一些附加信息,更精确的指明了当前活动能够响应的Intent中还可能带有的category。只有两个标签中的内容都匹配上Intent中指定的action和category时,这个活动才能响应该Intent。
修改FirstActivity活动中的onClick()方法,我们可以这样写:
button1.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View view) {
Intent intent = new Intent("com.example.zhangshuaige.activitytest.ACTION_START");
startActivity(intent);//默认就是default category
}
});

在FirstActivity活动界面我们点击button1我们成功启动了SecondActivity活动,如下:

每个Intent中只能指定一个action,但是能指定多个category,目前Intent中中有default category,现在我们再加一个,修改FirstActivity活动中的onClick()方法,代码如下:
button1.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View view) {
Intent intent = new Intent("com.example.zhangshuaige.activitytest.ACTION_START");
intent.addCategory("com.example.zhangshuaige.activitytest.MY_CATEGORY");//添加代码
startActivity(intent);
}
});
再运行一次,你会发现程序 挂了:

查看logcat,有如下错误信息:

错误信息提示我们,没找到可以响应我们Intent的活动,原因就是我们新加了一个category,但是并没有在SecondActivity的<intent-filter>标签中声明,现在让我们去添加一个:
<activity android:name=".SecondActivity" >
<intent-filter>
<action android:name="com.example.zhangshuaige.activitytest.ACTION_START" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="com.example.zhangshuaige.activitytest.MY_CATEGORY" /><!--新增代码-->
</intent-filter>
</activity>
再次运行,没毛病。
除了启动自己程序的活动还可以启动其他程序的活动,例如调用系统浏览器打开百度首页,
调用拨号盘拨10086等等
在FirstActivity中修改onClick()方法参考如下6-8 10-12两段:
button1.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View view) {
Intent intent = new Intent(Intent.ACTION_DIAL);
intent.setData(Uri.parse("tel:10086"));
startActivity(intent); //启动活动
//Intent intent1 = new Intent(Intent.ACTION_VIEW);
//intent1.setData(Uri.parse("http://www.baidu.com"));
//startActivity(intent1);
//Intent intent = new Intent("com.example.zhangshuaige.activitytest.ACTION_START");
//intent.addCategory("com.example.zhangshuaige.activitytest.MY_CATEGORY");
//startActivity(intent);
//Toast.makeText(FirstActivity.this,"You clicked Button 1",
// Toast.LENGTH_SHORT).show();
// finish(); 销毁活动
//优化写法
//SecondActivity.actionStart(FirstActivity.this, "data1", "data2");
}
});
更多隐式Intent等你自己去发现了~
四、活动的声明周期
1、返回栈
Android是使用任务来管理活动,一个任务就是一组存放在栈里的活动的集合,这个栈叫返回栈。栈是一种数据结构,先入后出。
2、活动的状态
a、运行状态 活动位于栈顶
b、暂停状态 活动不位于栈顶,但可见
c、停止 活动不可见
d、销毁 活动出栈
3、活动的声明周期
活动声明周期主要由Activity类中的几个方法体现:
我们已经见过的onCreate() 活动第一次创建时被调用;onStart() 活动由不可见变为可见时调用;onResume() 活动位于栈顶,准备和用户交互时调用;onPause() 活动准被启动另一活动时调用;onStop() 活动完全不可见时调用;onDestroy() 活动销毁之前调用;onRestart() 活动由停止变为运行时调用;
下面是张别人的图:

建议可以自己重写这几个方法然后打印日志,会比较直观的看到效果。
五、活动的启动模式
1、standard 总是创建新的该活动实例
2、singleTop 查看栈顶活动是否为此活动,如果不是,创建新的此活动实例
3、singleTask 查看整个栈是否存在此活动,存在则将此活动上的所有活动出栈,将此活动处于栈顶,不创建新的此活动实例
4、singleInstance 使用独立的返回栈对此活动进行管理,用于共享实例
*可以自己去修改配置文件中的Activity试试,例如:
<activity
android:name=".FirstActivity"
android:launchMode="singleTask"
android:label="This is FirstActivity"><!--Look This "android:launchMode"-->
<intent-filter>
<action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".SecondActivity"
android:launchMode="singleInstance">
<intent-filter>
<action android:name="com.example.zhangshuaige.activitytest.ACTION_START" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="com.example.zhangshuaige.activitytest.MY_CATEGORY" />
</intent-filter>
</activity>
六、好的编写活动手法(别人书籍里写的)
接手一个旧项目,不知道单前活动是那个Activity,可以自己写一个类继承Activity或其子类,在onCreate()方法中打印日志,让其他类继承自己编写的类。
随时随地退出程序:常见一个集合,管理所有实例,清除所有活动。
启动活动好的写法:编写一静态方法,在方法中对Intent进行参数绑定
好了,初识Activity就写到这里,感谢所有分享知识的人,我所看的书和用的软件都在上上篇博文底有链接,自取。有写的不对的地方欢迎指正。有朋友说安卓前景不好,其实我也不关注好不好,只是周末无聊,学点东西挺好,又不知道学什么,感觉每天都用到那么多app,自己学学,捣鼓捣鼓瞎玩不也不错嘛!加油
Android学习笔记二之初始Activity的更多相关文章
- Android学习笔记(一)——Activity简介 和 View
源文链接:http://www.cnblogs.com/shyang--TechBlogs/archive/2011/03/14/1984195.html Android SDK ( Software ...
- android学习笔记二、Activity深入学习
一.创建和使用: 1.Activity是android的四大组件之一,需要继承Activity并在清单文件中进行声明才能使用.没有声明则报错. 2.启动Activity是通过Intent,有两种方式: ...
- Android学习笔记二:activity的理解
转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/7513290.html 一:activity定义了app的页面 一个app有很多个页面组成,一个页面其实就是一个 ...
- Android学习笔记(十) Activity的生命周期
一.如何在一个应用程序中定义多个Activity -定义一个类,继承Activity -复写onCreate() setContentView(R.layout.secondLayout):设定该Ac ...
- android学习笔记二
ADT(Android Development Tools)安卓开发工具. android项目目录简介 ==> src==>源代码文件 res==>资源文件 AndroidManif ...
- Android学习笔记(六) Activity和View基础
一.Activity的启动流程 操作系统首先查看AndroidManifest.xml来决定启动哪一个Activity. 生成对应的Activity对象(系统自动完成). 调用它的onCreate() ...
- android学习笔记二:Intent
1.Intent作用 协助完成各个组建间的通信.如activity间.启动service.Broadcast. 2.Intent构成 1.Componet name:要启动的目的组建. 2.Actio ...
- Android 学习笔记二 自定义按钮形状 颜色 点击渐变
问题:自定义按钮的颜色 形状弧度 渐变效果 1.新建自定义属性button_login.xml (借鉴某大神) <?xml version="1.0" encoding=& ...
- 【转】 Pro Android学习笔记(二二):用户界面和控制(10):自定义Adapter
目录(?)[-] 设计Adapter的布局 代码部分 Activity的代码 MyAdapter的代码数据源和构造函数 MyAdapter的代码实现自定义的adapter MyAdapter的代码继续 ...
随机推荐
- 记一次idea启动tomcat后控制台乱码的坑
IDEA的编码配置大致跟<IntelliJ IDEA 控制台中文乱码解决方案>一样 但是启动后依旧乱码!why? 后来想起来,之前因为在win10控制台下跑tomcat乱码,所以,改过一个 ...
- Python3.7 练习题(-) 如何使用Python生成200个优惠卷(激活码)
# 如何使用Python生成200个优惠卷(激活码) import random import string # string.ascii_letters 26个大小写 # -9数字 # 获得激活码中 ...
- 网络操作基础(one)
P12 一.什么是网络操作系统?网络操作系统具有哪些基本功能? 二.网络操作系统具有哪些特征? 三.常用的网络操作系统有哪些?它们各具有什么特点? 四.在网络操作系统中主要可提供哪些? ———— —— ...
- RabbitMQ全网资料收集
RabbitMQ是一个由erlang开发的AMQP(Advanced Message Queue )的开源实现.AMQP 的出现其实也是应了广大人民群众的需求,虽然在同步消息通讯的世界里有很多公开标准 ...
- sqlserver2008简介
sql 数据库简介 应该掌握的部分: 1. 数据库的基本概念 2. 数据库模型的基本概念 3. 实体联系模型的基本概念 4. 关系模型的基本概念和性质 5. 数据库优化理论 6. 掌握创建 ...
- Yii2 设计模式——工厂方法模式
工厂方法模式 模式定义 工厂方法模式(Factory Method Pattern)定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个.工厂方法让类吧实例化推迟到子类. 什么意思?说起来有这么 ...
- Java扩展方法之SPI
API:API(Application Programming Interface)表示应用程序编程接口 SPI:SPI(Service Provider Interface)表示服务提供商接口 A ...
- C 运算符, 有符号数据运算,
1. b++运算 ; ; a = b++ + b++;printf("a=%d\n",a);printf("b=%d\n",b); 输出结果: a=3 b=3 ...
- Css之 间距初始化
粗暴初始化: * {margin:0;padding:0;border:0px none;} 优化初始化: /*css reset code */ /**** 文字大小初始化,使1em=10px ** ...
- 【原创】Bug管理操作规范个人经验总结
1. 禅道简介 禅道是一个基于“敏捷开发”模式的软件开发全生命周期管理软件,在国内的软件开发公司里占据最大的份额,从大公司到小公司,都能适用. 笔者使用禅道多年,根据自己的经验总结了一套Bug管理的方 ...