初识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的更多相关文章

  1. Android学习笔记(一)——Activity简介 和 View

    源文链接:http://www.cnblogs.com/shyang--TechBlogs/archive/2011/03/14/1984195.html Android SDK ( Software ...

  2. android学习笔记二、Activity深入学习

    一.创建和使用: 1.Activity是android的四大组件之一,需要继承Activity并在清单文件中进行声明才能使用.没有声明则报错. 2.启动Activity是通过Intent,有两种方式: ...

  3. Android学习笔记二:activity的理解

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/7513290.html 一:activity定义了app的页面 一个app有很多个页面组成,一个页面其实就是一个 ...

  4. Android学习笔记(十) Activity的生命周期

    一.如何在一个应用程序中定义多个Activity -定义一个类,继承Activity -复写onCreate() setContentView(R.layout.secondLayout):设定该Ac ...

  5. android学习笔记二

    ADT(Android Development Tools)安卓开发工具. android项目目录简介 ==> src==>源代码文件 res==>资源文件 AndroidManif ...

  6. Android学习笔记(六) Activity和View基础

    一.Activity的启动流程 操作系统首先查看AndroidManifest.xml来决定启动哪一个Activity. 生成对应的Activity对象(系统自动完成). 调用它的onCreate() ...

  7. android学习笔记二:Intent

    1.Intent作用 协助完成各个组建间的通信.如activity间.启动service.Broadcast. 2.Intent构成 1.Componet name:要启动的目的组建. 2.Actio ...

  8. Android 学习笔记二 自定义按钮形状 颜色 点击渐变

    问题:自定义按钮的颜色 形状弧度  渐变效果 1.新建自定义属性button_login.xml (借鉴某大神) <?xml version="1.0" encoding=& ...

  9. 【转】 Pro Android学习笔记(二二):用户界面和控制(10):自定义Adapter

    目录(?)[-] 设计Adapter的布局 代码部分 Activity的代码 MyAdapter的代码数据源和构造函数 MyAdapter的代码实现自定义的adapter MyAdapter的代码继续 ...

随机推荐

  1. 2PC(Two Phase Commitment Protocol)原理

    读TiDB原理部分,知道其分布式事务是参考的Google percolator.而percolator是一种2PC的优化. 分布式事务解决的是什么问题呢? 假设一个场景,一个电商网站,用户在购买商品时 ...

  2. 手动清除mac的广告弹框病毒 MacOSDefender

    最近在浏览亚马逊, 京东的时候, 发现会自动弹出很多广告到浏览器, 其实是中了病毒MacOSDefender. 这个病毒非常烦人, 会在你浏览电商网页的时候拼命的打开广告页面, 而且还会弹出一些提示, ...

  3. CentOS下将php和mysql命令加入到环境变量中-简单

    开发过程中.需要使用到php命令执行程序.但是php命令没有在全局命令中:每次执行都需要加上全路径特别麻烦,把php命令添加到全局变量中,以后每次只用输入php可以了 例: php -v  或 mys ...

  4. js常用随手记

    1. 判断是否是空对象 let myObject={} Object.keys(myObject).length 2. void 0 代替 undefined undefined 不是保留字,在局部作 ...

  5. 练习题:试使用C#编程实现银行、ATM等功能

    练习题:试使用编程实现银行.ATM等功能 using System; using System.Collections.Generic; using System.Linq; using System ...

  6. excle中表引用

  7. 各类排序算法的实现C#版

    using System;using System.CodeDom;using System.Collections.Generic;using System.Linq;using System.Ru ...

  8. 保卫"木叶",从火影剧情看网站攻防的演变

    精彩故事即将上演,敬请期待 一.下忍考试 关键词:内鬼.已知攻击.后门 二.佩恩入侵 关键词:未知攻击.零日漏洞 三.忍界大战 关键词:CC攻击.批量注册.模拟攻击 -- 时间过去很久,火影篇太多情节 ...

  9. 1.使用脚本控制模型的移动 --《Unity 3D 游戏开发》笔记

    由于最新版的unity已经不支持javascript语言啦,本人又是个C#小白,所以记录一下自己写的脚本. first 创建一个模型,放在平面上,调整下角度,就像这样: 然后写一个脚本来控制模型移动: ...

  10. 原生JS实现选中的radio变为未选中

    需求如下,radio已经选中,再点击,取消选中状态. 效果如链接:演示地址 直接上代码: <!DOCTYPE html> <html> <head> <met ...