初识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. TP5对数据库操作的事物作用

    假如: 你写好了一段完整的代码,模型对数据库的操作,增删改查什么的,都没有问题,当然运行速度也是最快的,完全不用担心会出错, 前提肯定是已经写好的一整段代码, 但是,万一服务器中断了呢,执行一半,后面 ...

  2. 《Java编程思想》读书笔记-类与对象

    欢迎各位读者关注我的微信公众号,共同探讨Java相关技术.生命不止,学习不休! 也许你慢慢地对程序有了这样的认识:程序只是一些列带有方法的对象的组合,这些方法以其它对象为参数,可在任何地方返回,并发送 ...

  3. newinstance()和new有什么区别?

    在初始化一个类,生成一个实例的时候:newInstance() 和 new 有什么区别?用newInstance与用new是区别的,区别在于创建对象的方式不一样,前者是使用类加载机制,那么为什么会有两 ...

  4. Homestead的安装配置

    laravel学院教程 : http://laravelacademy.org/post/7658.html 参考博文:https://blog.csdn.net/xyxjn/article/deta ...

  5. DoTween之队列

    //引用命名空间 using DG.Tweening; // 初始化一个sequence Sequence sequence = DOTween.Sequence(); //添加动画 sequence ...

  6. appium---android元素定位

    原文链接:https://www.cnblogs.com/meitian/p/6103391.html 一.常用识别元素的工具 uiautomator:Android SDK自带的一个工具,在tool ...

  7. 我的代码-sql query

    # coding: utf-8 # In[ ]: WITH List AS (SELECT e.*,f.* FROM( SELECT DISTINCT c.lot_id, c.wafer_key,LE ...

  8. Eclipse 运行弹出A Java Exception has occurred.并报错Exception in thread 的解决方案

    这个问题是由较高版本的JDK编译的java class文件试图在较低版本的JVM上运行而产生的错误. 1.解决措施就是保证jvm(java命令)和jdk(javac命令)版本一致.如果是linux版本 ...

  9. WMware Vsphere取消某虚机的漂移

    由于一些业务特性,有一些虚机不应该完全受集群DSR控制.下面记录一下如何更改某一虚机的漂移属性. 1.环境 VMware Vsphere web client 6.5 2.点击需要配置虚机所在的集群, ...

  10. TensorFlow机器学习实战指南之第一章

    TensorFlow基础 一.TensorFlow算法的一般流程 1.导入/生成样本数据集 2.转换和归一化数据:一般来讲,输入样本数据集并不符合TensorFlow期望的形状,所以需要转换数据格式以 ...