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的代码继续 ...
随机推荐
- 2018上C语言程序设计(高级)作业- 第4次作业成绩及总结
作业地址 https://edu.cnblogs.com/campus/hljkj/CS2017-01/homework/1842 评分准则 第4次作业各项成绩包括三项: 完成WC项目:60分:基本功 ...
- 如何让浏览器直接输出HTML代码而不解析
方法一: 将HTML代码嵌入到<script type='text/html' style='display:block'></scipt>中 <script type= ...
- Python学习之路基础篇--08Python基础+ 文件的基本操作和 注册小作业
1 文件的基本操作 #1. 打开文件的模式有(默认为文本模式): r ,只读模式[默认模式,文件必须存在,不存在则抛出异常] w,只写模式[不可读:不存在则创建:存在则清空内容] a, 只追加写模式[ ...
- 修改hots指向
C:\Windows\System32\drivers\etc hots文件 IP 服务器名称
- mysql安装杂记
绿色版安装 先进入bin目录下初始化 命令:mysqld -initialize-insecure mysqld --initialize --user=mysql --console 初 ...
- 在安卓手机上安装完整kali linux系统
俗话说,没图说个JB.好我马上上图 提醒:我在这里只是提供一个思路过程,希望可以帮到你,同时我也做一个记录,有任何问题欢迎 0.0.:I87OI94664 威信 :Z2tsYmI1MjA= (b ...
- c#函数地址传入c++
c# private delegate void ValidateEvent(int eventCode); private static void ValidateEventCallback(int ...
- Cygwin,一个提供linux命令行体验的Windows命令行工具
安装 从官网下载,选择合适节点(带edu结尾的优先),安装 使用 未完待续...
- 18.17 U-Boot+内核移植
18.17.1 移植U-Boot-2012.04.08 1.下载.建立source insight工程.编译.烧写.如果无运行分析原因. $ .tar.bz2 $ cd u-boot- $ make ...
- update_engine-DownloadAction(一)
通过update_engine-整体结构(一),(二),(三)对update_engine整体的运行机制有了一定的认识之后.开始逐个分析重要的Action.先从DownloadAction开始分析. ...