1、综述

Activity是Android四大组件(Application Components)之一,简单来说Activity就是平常所见到的用户界面,一般情况下,一个Activity所占的窗口是满屏的,但也可以是一个小的位于其它Activity之上的浮动窗口。一个Android工程至少有一个Activity,Activity上面可布有多个view实例,如文本框、进度条、复选框、按钮等等。多个Activity之间通过Intent来实现跳转。

[1]新建一个activity

(1)要继承(extends)Activity类,复写onCreate(bundle)方法,然后通过" setContentView() "绑定此activity的布局文件XML。

public class secondactivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.secondactivity);//绑定布局文件
}
}

(2)还必须在AndroidManifest.xml里面注册这个新增加的activity。

<activity
android:label="second"
android:name=".secondactivity" //activity所在.java类
>
</activity>

2、Intent的类来实现屏幕之间的跳转:

[1]显示意图跳转:要求必须知道被激活组件的包和class。

应用场景:在应用程序内部进行跳转。 缺点:耦合性较高。

常规使用方式:

(1)在layout中的" activity_main.xml " 中加入一个id为btn的按钮,另外再创建一个任意的layout(将要跳转到得layout),我取名为second。

(2)在java包中新增" SecondActivity.jar "作为目标Activity,如下:

package com.myandroid;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
public class SecondActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.second);
}
}

(3)在AndroidManifest中加入一个新的activity标签,至少要声明一个android:name属性,如下:

<activity android:name=".SecondActivity">
</activity>

(4)在起始Activity中添加跳转,需引入import android.content.Intent;命名空间,如下:

package com.myandroid;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Button;
import android.content.Intent; public class MainActivity extends Activity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button = (Button) this.findViewById(R.id.btn);
button.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
Intent intent = new Intent(); //实例化Intent类
          //第一个参数是Context,第二个参数是跳转Activity的类
intent.setClass(MainActivity.this, SecondActivity.class); //跳转
startActivity(intent); //启动
finish();//停止当前的Activity,如果不写,则按返回键会跳转回原来的Activity
}
});
}
}

另外两种显示方式:

/*** 方法一 ***/
Intent intent1 = new Intent();
//参数一是当前的包名,参数二跳转activity的类名,一定要加上包名
intent1.setClassName("com.myandroid", "com.myandroid.SecondActivity");
startActivity(intent1); /*** 方法二 ***/
Intent intent3 = new Intent();
// 参数一是当前的包名,参数二跳转activity的类名,一定要加上包名
ComponentName component = new ComponentName("com.myandroid", "com.myandroid.SecondActivity");
intent3.setComponent(component);
startActivity(intent3);

[2]隐式意图:只需要知道跳转activity的动作和数据,就可以激活对应的组件。

应用场景:在不知道某一应用程序的类名,包名,并且引用不到时。可以跳转到其他应用。带参数访问浏览器的实现。 优点:耦合性较低。

注意:data与type不可以分开写,使用setDataAndType()方法 常规使用方式:

(1)在AndroidManifest中加入一个新的activity标签,要用隐式的意图激活Activity,就要设置动作,类别,数据三个参数,Action及Category的名称是可以自己定义的,只要与openOtherActivity方法中对Intent的设置相一致就可以被过滤器找到并最终激活。如下:

<activity android:name=".SecondActivity">
<intent-filter>
<action android:name="com.myandroid.SecondActivity" />
<category android:name="com.myandroid.Default" />
</intent-filter>
</activity>

(2)对Intent的设置如下。

/*** 隐式意图***/
Intent intent = new Intent(); //只要动作名称与过滤器中的动作名称一致,就可以匹配,如果匹配成功就可以查看类别及数据
//如果没有类别及数据,那么只会匹配动作
intent.setAction("com.android.SecondActivity");
intent.addCategory("com.android.Default"); //startActivity(intent)为Intent对象注入了一个android.intent.category.DEFAULT类别,必须添加该类别,不然报错找不到activity;
//intent.addCategory("android.intent.category.DEFAULT"); startActivity(intent);

运行发现报错:

原因:startActivity(intent)为Intent对象注入了一个android.intent.category.DEFAULT类别,必须添加该类别,不然报错找不到activity;

解决:在AndroidManifest中对应的activity中的intent-filter下,添加对应的<categoryandroid:name="android.intent.category.DEFAULT"/>类别。

此时运行程序,可以跳转成功。

结论:只要Intent设置中的action及category在intent-filter中出现,就可以成功跳转,前提是在没有设置数据参数的情况下。

(3)添加参数的情况:

1)加入的数据是Uri类型的,上面代码的意思是匹配以itcast开头的,主机名为www.itcast.com的数据,后面的路径没有要求:

<activity android:name=".SecondActivity">  
       <intent-filter>
             <action android:name="com.myandroid.SecondActivity" />
             <category android:name="com.myandroid.Default" />
        <data
                    android:host="cn.host.android"
                    android:scheme="host" />
       </intent-filter>
</activity>

2)在startActivity(intent)前添加设置data属性,如下:

// 如果在声明activity的时候指定了data属性,就一定要设置他的data属性值,和配置的属性值相等
intent.setData(Uri.parse("host://cn.host.android/my"));

此时运行程序,可以跳转成功。

(4)对数据类型进行设置:

1)在intent-filter中添加设置:<data android:mimeType="image/*" />这句代码的意思是对image及所有的图片数据进行匹配。

2)在Intent对象中进行设置:intent.setType("image/jpeg");

运行发现报错:

原因:添加了setType()方法后,会自动清除intent.setData()方法中的数据设置,所以匹配数据不一致导致了失败,即使将intent.setType("image/jpeg");放在setData()方法之前也是不成功的。

解决方法:把setData()及setType()方法删除,然后,采用Intent对象的setDataAndType(),同时设置数据与类型就可以了,如下。

intent.setDataAndType(Uri.parse("host://cn.host.android/my"),"image/jpeg");

此时运行程序,可以跳转成功。

3、Intent数据传递

应用场景:传递数据,RP计算器。

Bundle:数据捆,打包传输

[1]方式一:

(1)发送页面

Intent intent = new Intent();
intent.setClass(MainActivity.this, SecondActivity.class);
Bundle bundle = new Bundle(); //打包发送
bundle.putString("name","123"); //绑定参数
intent.putExtra("maps",bundle);
startActivity(intent);

(2)接收页面

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
TextView tv = new TextView(this);
Intent intent = this.getIntent();
Bundle bundle = intent.getBundleExtra("maps"); //获取打包数据bundle
String name = bundle.getString("name"); //取出需要的数据
tv.setText(name);
setContentView(tv);
} 或者 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.second);
  TextView txt = (TextView)this.findViewById(R.id.txt);
  Intent intent = this.getIntent();
  Bundle bundle = intent.getBundleExtra("maps");     //获取打包数据bundle
  String name = bundle.getString("name");     //取出需要的数据
  txt.setText(name);
 }

[2]方式二:创建对象类(javabean)Person,实现Serializable接口

private static final long serialVersionUID = 1L;

(1)发送页面

Intent inent = new Intent();

intent.setClass(this,secondActivity.class);

Person person = new Person(name);     //序列化对象传递

intent.putExtra("person',person);

startActivity(intent);

(2)接收页面

TextView tv = new TextView(this);

Intent intent = this.getIntent();

Person p = (Person)intent.getSerializableExtra("person');

String name = p.getName();

4、Intent返回数据

[1]跳转前的Activity:

  如果想在Activity中得到新打开Activity关闭后返回的数据,需要使用Activity提供的 startActivityForResult(Intent intent,int requestCode) (startActivity()是context提供的抽象方法,而startActivityForResult方法是Activity自己特有的方法)方法打开新的Activity,新的Activity关闭后会向前面的Activity  传回数据,为了得到传回的数据,必须在" 跳转前页面 "的Activity中重写onActivityResult(int requestCode, intresultCode, Intent data)方法。

实例:

(1)改为用startActivityForResult(Intent intent,int requestCode)跳转;

Button button = (Button) this.findViewById(R.id.btn);
button.setOnClickListener(new View.OnClickListener(){ @Override
public void onClick(View v) {
Intent intent = new Intent();
intent.setClass(MainActivity.this, SecondActivity.class);
//第二个参数为请求码,可以根据业务需求自己编号
startActivityForResult (intent, 1);
} });

(2)重写onActivityResult(int requestCode, intresultCode, Intent data)方法;

//第一个参数为请求码,即调用startActivityForResult()传递过去的值
//第二个参数为结果码,结果码用于标识返回数据来自哪个新Activity
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if(requestCode == 1 && resultCode == Activity.RESULT_OK)
   {
        String result = data.getExtras().getString("result");//得到新Activity关闭后返回的数据
      TextView tv = (TextView)this.findViewById(R.id.txtBack);
      tv.setText(result);
   }
}

[2]跳转后的Activity返回数据:

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.second);
Button button = (Button) this.findViewById(R.id.back);
button.setOnClickListener(new View.OnClickListener(){ @Override
public void onClick(View v) {
Intent intent = new Intent();//数据是使用Intent返回
intent.putExtra("result", "成功返回结果");//把返回数据存入Intent
SecondActivity.this.setResult(RESULT_OK,intent);//设置返回数据
SecondActivity.this.finish();//关闭Activity
} });
}

注意:

[1]setResult()方法是Activity的特有方法,第一个参数值RESULT_OK是系统Activity类定义的一个常量,值为-1。

[2]在Activity A中打开一个Activity B,如果要在Activity B关闭的时候给Activity A传一些数据,那么在startActivityForResult (intent,  1)后不可以再使用MainActivity.this.finish();

5、横竖屏切换Activity的生命周期

默认情况下会重新加载activity,容易重新加载数据,造成数据丢失。如游戏。

具体流程:onPause -> onStop ->onDestory -> onCreate ->onStart ->onResume
避免横竖屏切换重新创建activity 在清单文件的activity节点中加入:android:configChanges="orientation|keyboardHidden "

6、任务栈

为了提高用户体验 一个应用程序包含多个activity 栈的顶部的activity会在界面中显示,获取焦点。

任务栈的特点:先进后出,后进先出。

7、AndroidManifest中的activity组件

AndroidManifest文件中含有如下过滤器的activity组件为默认启动组件,应用程序启动时,系统自动调用它。

Android 四大组件之 Activity(二)的更多相关文章

  1. 【Android开发日记】之入门篇(四)——Android四大组件之Activity

    在Android中,无论是开发者还是用户,接触最多的就算是Activity.它是Android中最复杂.最核心的组件.Activity组件是负责与用户进行交互的组件,它的设计理念在很多方面都和Web页 ...

  2. Android四大组件之Activity(活动)及其布局的创建与加载布局

    Android四大组件之Activity(活动)及其布局的创建与加载布局 什么是Activity ? 活动(Activity)是包含用户界面的组件,主要用于和用户进行交互的,一个应用程序中可以包含零个 ...

  3. Android四大组件之——Activity的生命周期(图文详解)

        转载请在文章开头处注明本博客网址:http://www.cnblogs.com/JohnTsai       联系方式:JohnTsai.Work@gmail.com       [Andro ...

  4. Android四大组件之——Activity的开启:StartActivity()和StartActivityForResult()(图文详解)

                如需转载请在文章开头处注明本博客网址:http://www.cnblogs.com/JohnTsai       联系方式:JohnTsai.Work@gmail.com   ...

  5. Android四大组件及activity的四大启动模式

    Android四大组件 1. 广播接收者的两种类型: (1)系统广播接收者,就是继承BroadcastReceiver这个类,然后还要在清单文件中注册,注册之后给他一个action.当系统发生了这个a ...

  6. Android四大组件之——Activity(一)定义、状态和后退栈(图文详解)

    什么是Activity 关键字:应用组件.四大组件.用户界面,交互. An Activity is an application component that provides a screen wi ...

  7. Android四大组件之Activity

    实验内容 了解Activity的四个状态 Activity的生命周期 启动另外一个Activity 实验要求 编码实现观察Activity的生命周期函数执行过程 编码实现启动另外一个Activity ...

  8. Android 四大组件之 Activity

    1 简介 Activity (活动) 即应用程序 显示的 界面.可以通过两种方式 设置显示的内容 1:纯代码方式 2:xml 布局方式 无论哪一种方式,都是通过 setContentView 来设置显 ...

  9. Android 四大组件之 Activity(一)

    1.Activity的定义及作用: Android系统中的四大组件之一,可以用于显示View.Activity是一个与用户交互的系统模块,几乎所有的Activity都是和用户进行交互的一个应用程序的组 ...

随机推荐

  1. Codeforces Round #248 (Div. 1) A. Ryouko's Memory Note 水题

    A. Ryouko's Memory Note 题目连接: http://www.codeforces.com/contest/434/problem/A Description Ryouko is ...

  2. Nginx负载均衡的五种策略

    nginx可以根据客户端IP进行负载均衡,在upstream里设置ip_hash,就可以针对同一个C类地址段中的客户端选择同一个后端服务器,除非那个后端服务器宕了才会换一个. nginx的upstre ...

  3. linux下如何挂接(mount)光盘镜像文件、移动硬盘、U盘、Windows网络共享和NFS网络共享

    首先,介绍一下挂接(mount)命令的使用方法,mount命令参数非常多,这里主要讲一下今天我们要用到的.      命令格式:      mount [-t vfstype] [-o options ...

  4. NSLog 不打印中文 - 解决

    解决方案:将项目的Debugger模式设置为 GDB 即可.(LLDB下不打印中文) 第一步: 第二步:

  5. 【微信小程序】微信小程序 文本过长,自动换行的问题

    小程序开发过程出现的问题: 文本过长,以致于在view中显示不全,没有自动换行的问题 解决方法: 在wxss样式文件中添加样式 .font-break { word-break:break-all; ...

  6. Selenium2+python自动化39-关于面试的题

    前言 最近看到群里有小伙伴贴出一组面试题,最近又是跳槽黄金季节,小编忍不住抽出一点时间总结了下, 回答不妥的地方欢迎各位高手拍砖指点.   一.selenium中如何判断元素是否存在? 首先selen ...

  7. java int类型转换成String , 不足10位 在前面补0

    String.format("%010d", 25); 0代表前面要补的字符 10代表字符串长度 d表示参数为整数类型 String s = "Hello World!& ...

  8. CASpringAnimation的使用

    CASpringAnimation的使用 效果 源码 https://github.com/YouXianMing/Animations // // CASpringAnimationControll ...

  9. ORACLE 修改已有存储过程(plsql工具修改)

    pl/sql 修改包下存储过程步骤: 假定有如下过程:pkg_ypgl_query.PROC_KCZQUERY; 1. pl/sql 右侧objects面板中选择Package bodies>P ...

  10. 《Windows核心编程》第1章——错误处理

    GetLastError: GetLastError返回错误编码,即便出错函数后边跟随一个正确执行了的函数,也不会覆盖原先的错误代码: 考虑多线程的情况.子线程中的错误代码不会被主线程捕获: 但是子函 ...