Android 四大组件 —— 活动(使用Intent 实现活动的显示跳转)

一、什么是Intent?

        Intent的中文意思是目的。在Android中也是“目的”的意思。就是我们要去哪里,从这个activity要前往另一个Activity就需要用到Intent。

下面是 Intent 两个最基本的函数:

1、定义一个Intent

[java] view plaincopy
在CODE上查看代码片派生到我的代码片
  1. Intent intent = new Intent(IntentDemo.this, AnotherActivity2.class);  

2、启动 Activity

[java] view plaincopy
在CODE上查看代码片派生到我的代码片
  1. startActivity(intent);  

以上示例代码的作用是从IntentDemo这个activity切换到AnotherActivity2。这是Intent其中一种构造方法,指定两个Activity。为什么需要指定两个活动呢?因为在Android中有一个活动栈,这样的构造方式才能确保正确的将前一个活动压入栈中,才能在触发返回键的时候活动能够正确出栈。

     Intent 是Android 程序中各组件之间进行交互的一种重要方式,它不仅可以指明当前组件想要执行的动作,还可以在不同组件之间传递数据。Intent 一般可被用于启动活动、启动服务、以及发送广播等场景.

 

Intent 的用法大致可以分为两种,显式Intent 和隐式Intent,我们先来看一下显式Intent如何使用。

二、使用 Intent 实现活动的显示跳转

这里我们以按钮实现活动跳转为例,为实现这个功能,我们需要三个步骤:

1、拿到按钮对象

       如何拿到按钮对象呢?通过资源id,前面我们提到过,在R.id.xxx 中会有我们的资源id,但button按钮是在layout 中创建的,系统不会为其创建资源id,所以我们需要在layout 设置 button 时自己加上id,、,具体方法如下:

[java] view plaincopy
在CODE上查看代码片派生到我的代码片
  1. <Button  
  2.        android:id="@+id/button1"  
  3.        android:layout_width="match_parent"  
  4.        android:layout_height="wrap_content"  
  5.        android:text="点我点我!"   
  6.        android:textSize="25sp"/>  

可以看到设置id 的方法是 id = "@+id/button1",这里button1 即我们将使用的资源id。

 

2、为此按钮设定点击监听事件

这样每当点击按钮时,就会执行监听器中的onClick()方法,我们只需要在这个方法中加入待处理的逻辑就行了;

具体代码如下:

[java] view plaincopy
在CODE上查看代码片派生到我的代码片
  1. public class MainActivity extends Activity {  
  2.     private Button button;  
  3.       
  4.     @Override  
  5.     protected void onCreate(Bundle savedInstanceState) {  
  6.         super.onCreate(savedInstanceState);  
  7.         setContentView(R.layout.activity_main);  
  8.           
  9.         button = (Button) findViewById(R.id.button);  
  10.           
  11.         button.setOnClickListener(new OnClickListener() {  
  12.             @Override  
  13.             public void onClick(View v) {  
  14.             // 在此处添加逻辑  
  15.             }  
  16.         });  
  17.     }  
  18. }  


3、实现跳转

      当然这是最重要的一步了,通过Intent 实现,我们先来了解一下Intent 函数;

Intent  意图,告诉系统我们要干什么,连接四大组件的纽带,可以启动活动、启动服务、发送广播;

公共构造函数:

1)、Intent() 空构造函数

2)、Intent(Intent o) 拷贝构造函数

3)、Intent(String action) 指定action类型的构造函数

4)、Intent(String action, Uri uri) 指定Action类型和Uri的构造函数,URI主要是结合程序之间的数据共享ContentProvider

5)、Intent(Context packageContext, Class<?> cls) 传入组件的构造函数,也就是上文提到的

6)、Intent(String action, Uri uri, Context packageContext, Class<?> cls) 前两种结合体

Intent有六种构造函数,3、4、5是最常用的,并不是其他没用!

Intent(String action, Uri uri)  的action就是对应在AndroidMainfest.xml中的action节点的name属性值。在Intent类中定义了很多的Action和Category常量。

 

下面,我们来具体实现:

1)、创建Intent 对象

[java] view plaincopy
在CODE上查看代码片派生到我的代码片
  1. Intent intent = new Intent();  

2)、把我们的意图封装进Intent 对象中

这里我们需要先了解 context :应用程序上下文,就是表示当前对象的一个语境,访问全局信息 的API

这里使用了Intent 的 setclass 方法,我们来看看其定义:

[java] view plaincopy
在CODE上查看代码片派生到我的代码片
  1. /** 
  2.     * Convenience for calling {@link #setComponent(ComponentName)} with the 
  3.     * name returned by a {@link Class} object. 
  4.     * 
  5.     * @param packageContext A Context of the application package implementing 
  6.     * this class. 
  7.     * @param cls The class name to set, equivalent to 
  8.     *            <code>setClassName(context, cls.getName())</code>. 
  9.     * 
  10.     * @return Returns the same Intent object, for chaining multiple calls 
  11.     * into a single statement. 
  12.     * 
  13.     * @see #setComponent 
  14.     */  
  15.    public Intent setClass(Context packageContext, Class<?> cls) {  
  16.        mComponent = new ComponentName(packageContext, cls);  
  17.        return this;  
  18.    }  

这里 packageContext 即我们现在的 activity ,而Class<?> cls 则是我们的目的activity ,我们看看具体实现:

[java] view plaincopy
在CODE上查看代码片派生到我的代码片
  1. intent.setClass(MainActivity.this,SecondActivity.class);  

 

3)告诉系统执行操作

[java] view plaincopy
在CODE上查看代码片派生到我的代码片
  1. startActivity(intent);  

实现这三步就能基本实现活动的跳转了;

 

三、向下一个活动传递数据

       Intent 还可以在启动活动的时候传递数据的,我们来一起看一下。

      在启动活动时传递数据的思路很简单,Intent 中提供了一系列putExtra()方法的重载,可以把我们想要传递的数据暂存在Intent 中,启动了另一个活动后,只需要把这些数据再从Intent 中取出就可以了。比如说FirstActivity 中有一个字符串,现在想把这个字符串传递到SecondActivity 中。注意这里putExtra()方法接收两个参数,第一个参数是键,用于后面从Intent中取值,第二个参数才是真正要传递的数据

1、putExtra 方法

[java] view plaincopy
在CODE上查看代码片派生到我的代码片
  1. public Intent putExtra(String name, String value) {  
  2.     if (mExtras == null) {  
  3.         mExtras = new Bundle();  
  4.     }  
  5.     mExtras.putString(name, value);  
  6.         return this;  
  7. }  

其中putstring 方法定义如下:

[java] view plaincopy
在CODE上查看代码片派生到我的代码片
  1. public void putString(String key, String value) {  
  2.     unparcel();  
  3.     mMap.put(key, value);  
  4. }  

所以这里,我们可以这样实现

[java] view plaincopy
在CODE上查看代码片派生到我的代码片
  1. putExtra("key","我是第一个活动");  

则会向跳转的活动发送字符串“我是第一个活动”;

 

2、接收方如何接受呢?

      这里调用getStringExtra 函数传入相应的键值,就可以得到传递的数据了。这里由于我们传递的是字符串,所以使用getStringExtra()方法来获取传递的数据,如果传递的是整型数据,则使用getIntExtra()方法,传递的是布尔型数据,则使用getBooleanExtra()方法,以此类推

[java] view plaincopy
在CODE上查看代码片派生到我的代码片
  1. public String getStringExtra(String name) {  
  2.     return mExtras == null ? null : mExtras.getString(name);  
  3. }  

其会调用getString 函数:

[java] view plaincopy
在CODE上查看代码片派生到我的代码片
  1. public String getString(String key) {  
  2.     unparcel();  
  3.     Object o = mMap.get(key);  
  4.     if (o == null) {  
  5.         return null;  
  6.     }  
  7.     try {  
  8.         return (String) o;  
  9.     } catch (ClassCastException e) {  
  10.         typeWarning(key, o, "String", e);  
  11.         return null;  
  12.     }  
  13. }  

并将其显示在TextView 上:

[java] view plaincopy
在CODE上查看代码片派生到我的代码片
  1. @android.view.RemotableViewMethod  
  2.    public final void setText(CharSequence text) {  
  3.        setText(text, mBufferType);  
  4.    }  


 

下面是实现具体代码:

MainActivity 方

[java] view plaincopy
在CODE上查看代码片派生到我的代码片
  1. package cn.com.qiang.buttondemo;  
  2.   
  3. import android.os.Bundle;  
  4. import android.app.Activity;  
  5. import android.content.Intent;  
  6. import android.view.View;  
  7. import android.view.View.OnClickListener;  
  8. import android.widget.Button;  
  9.   
  10. public class MainActivity extends Activity {  
  11.   
  12.     @Override  
  13.     protected void onCreate(Bundle savedInstanceState) {  
  14.         super.onCreate(savedInstanceState);  
  15.         setContentView(R.layout.activity_main);  
  16.           
  17.         Button button1 = (Button) findViewById(R.id.button1);  
  18.           
  19.         button1.setOnClickListener(new MyListon());  
  20.     }  
  21.       
  22.     class MyListon implements OnClickListener{  
  23.         @Override  
  24.         public void onClick(View v) {  
  25.             // TODO Auto-generated method stub  
  26.         Intent intent = new Intent();  
  27.         intent.setClass(MainActivity.this,SecondActivity.class);  
  28.         intent.putExtra("key""给你发个美女图片");  
  29.         startActivity(intent);  
  30.         }  
  31.     }     
  32. }  


SecondActivity 方

[java] view plaincopy
在CODE上查看代码片派生到我的代码片
  1. package cn.com.qiang.buttondemo;  
  2.   
  3. import android.app.Activity;  
  4. import android.content.Intent;  
  5. import android.os.Bundle;  
  6. import android.widget.TextView;  
  7.   
  8. public class SecondActivity extends Activity {  
  9.     @Override  
  10.     protected void onCreate(Bundle savedInstanceState){  
  11.         // TODO Auto-generated method stub  
  12.         super.onCreate(savedInstanceState);  
  13.         setContentView(R.layout.activity_second);  
  14.       
  15.         Intent intent = getIntent();  
  16.         String s = intent.getStringExtra("key");  
  17.         TextView tv = (TextView) findViewById(R.id.tv);  
  18.         tv.setText(s);  
  19.     }  
  20. }  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/401960.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

放学默示录Ⅰ:来!抠奖 移动游戏策划案

游戏名称&#xff1a;放学默示录游戏类型&#xff1a;休闲类 单机版带网络服务运营方式&#xff1a;道具收费&#xff0c;捐赠。游戏背景&#xff1a;以学生放学后的小摊游艺为参考。游戏玩法&#xff1a;游戏分为默示录模式&#xff0c;日常模式&#xff0c;大赛模式&#xff…

mod_wsgi的工作模式和配置

Openstack所有提供API接口的服务都是python web server&#xff0c;而其本身性能很弱&#xff0c;目前已经将它们配置到了apache上。但对于如何设置mod_wsgi的参数&#xff0c;我一直没有好好去阅读其文档。 参考了mod_wsgi 的两种模式和Process and Thread两篇文章后&#xff…

Android 项目在Eclipse中的目录结构

Android工程目录 如果使用Eclipse插件ADT开发应用程序&#xff0c;必须要熟悉工程的目录结构&#xff0c;清楚各个目录下面放置的是什么东西。Android工程主要的目录有&#xff1a;src、bin、gen、res等。 不同的Android平台目录结构是不同的&#xff0c;下面以Android 2.3.…

怎样判断网页是静态还是伪静态呢

怎样判断网页是静态还是伪静态呢? SEO文章看多了&#xff0c;经常能听到静态、伪静态这类的词语&#xff0c;那什么样的网页是静态的&#xff0c;什么样的网页是伪静态的呢&#xff1f; IE5浏览器以上&#xff1a;打开你想判断的网站后&#xff0c;再在网址框中输入javascript…

Exynos4412 Uboot 编译工具 —— 交叉工具链 arm-linux-gcc 的安装

一、什么是交叉编译&#xff1f; 在开发主机运行编译器编译内核、应用程序。内核和程序在目标机上运行&#xff0c;这个编译过程被称为交叉编译。编译器运行在开发主机&#xff08;通常是X86体系的PC机&#xff09;上&#xff0c;编译出的的代码是目标机体系结构的&#xff0c;…

Linux学习之CentOS(一)--CentOS6.4环境搭建

一、前言作为一个想从事j2ee后台开发的程序猿&#xff0c;linux系统怎能不学呢&#xff1f;所以&#xff0c;这几天自己准备学习一下linux操作系统。废话不多说&#xff0c;直奔主题。要学linux开发&#xff0c;首先得要安装linux系统吧&#xff0c;这里我在选择之前也挺迷茫&a…

Linux设备驱动入门----globalmem字符设备驱动

1、什么是globalmem虚拟设备 &#xff08;1&#xff09;、globalmem字符设备驱动中&#xff0c;分配一片内存大小为GLOBALMEM_SIZE(4K)的空间 &#xff08;2&#xff09;、提供对该片内存的读写、控制和定位函数 &#xff08;3&#xff09;、用户进程能够通过linux系统调用访问…

百度地图iOS API

http://www.cnblogs.com/wengzilin/p/3444471.html http://blog.csdn.net/iukey/article/details/7343650转载于:https://www.cnblogs.com/nathanou/p/3556347.html

find_cmd函数分析

一、概述 1、函数位置 common/command.c 2、函数功能分析 解析命令的关键环节是如何根据输入命令查找对应命令的信息&#xff0c;从而跳转到对应命令的函数处执行程序。这必然涉及到如何存放命令的详细信息这个问题。因为一种存法&#xff0c;对应一种查法&#xff0c;进…

ARM 指令集 VS Thumb 指令集

Thumb指令集Thumb指令可以看做是ARM指令压缩形式的子集&#xff0c;是针对代码密度【1】的问题而提出的&#xff0c;它具有16为的代码密度。Thumb不是一个完整的体系结构&#xff0c;不能指望处理程序只执行Thumb指令而不支持ARM指令集。因此&#xff0c;Thumb指令只需要支持通…

软件测试 -- alpha测试和beta测试的区别

alpha测试是在用户组织模拟软件系统的运行环境下的一种验收测试,由用户或第三方测试公司进行的测试,模拟各类用户行为对即将面市的软件产品进行测试,试图发现并修改错误。 Beta测试是用户公司组织各方面的典型终端用户在日常工作中实际使用beta版本,并要求用户报告异常情况,…

Linux 驱动头文件说明

#include <linux/***.h> //是在linux-2.6.29/include/linux下面寻找源文件。 #include <asm/***.h> //是在linux-2.6.29/arch/arm/include/asm下面寻找源文件。 #include <mach/***.h> //是在lin…

ACL访问控制

ACL访问控制概述&#xff1a;访问控制&#xff0c;当文件或目录的权限不能在完全满足访问控制的实现时&#xff0c;可以使用acl进行设置访问权限。即&#xff0c;对一个文件或者目录设置个别&#xff08;特殊&#xff09;用户对其有操作的权限ACL访问控制的作用&#xff1a;1&a…

内联函数 —— C 中关键字 inline 用法解析

一、什么是内联函数 在C语言中&#xff0c;如果一些函数被频繁调用&#xff0c;不断地有函数入栈&#xff0c;即函数栈&#xff0c;会造成栈空间或栈内存的大量消耗。 为了解决这个问题&#xff0c;特别的引入了inline修饰符&#xff0c;表示为内联函数。 栈空间就是指放置程式…

eclipse maven scm

http://my.oschina.net/OutOfMemory/blog/178512 1.安装eclipse的maven插件 m2e(http://wiki.eclipse.org/M2E_updatesite_and_gittags)Help->Install New Software...在work with中填入我们需要安装m2e的版本url&#xff1a;http://download.eclipse.org/technology/m2e/…

DS18B20 驱动编写

嵌入式开发平台&#xff1a;mini2440 DS18B20 所用GPIO&#xff1a;S3C2410_GPF(3) 一、DS18B20 时序分析 DS18B20的一线工作协议流程是&#xff1a;初始化→ROM操作指令→存储器操作指令→数据传输&#xff0c;其工作时序包括&#xff1a;初始化时序、写时序、读时序。 1、初…

Android 自定义View实现画背景和前景(ViewGroup篇)

2019独角兽企业重金招聘Python工程师标准>>> 在定义ListView的Selector时候&#xff0c;有个drawSelectorOnTop的属性&#xff0c;如果drawSelectorOnTop为true的话&#xff0c;Selector的效果是画在List Item的上面&#xff08;Selector是盖住了ListView的文字或者…

Linux的mmap内存映射机制解析

在讲述文件映射的概念时,不可避免的要牵涉到虚存(SVR 4的VM).实际上,文件映射是虚存的中心概念, 文件映射一方面给用户提供了一组措施,好似用户将文件映射到自己地址空间的某个部分,使用简单的内存访问指令读写文件&#xff1b;另一方面,它也可以用于内核的基本组织模式,在这种…

svn add Default@2x.png的文件含有@的文件名注意事项

为什么80%的码农都做不了架构师&#xff1f;>>> iOS的Icon里面&#xff0c;包含符号 &#xff0c;svn add Icon2x.png&#xff0c;没法加进去。 解决的办法是&#xff0c;在文件名最后加一个&#xff0c;例如 svn add Icon2x.png 或者svn add Icon\2x.png\ 转载于…

Linux 设备驱动的固件加载

作为一个驱动作者, 你可能发现你面对一个设备必须在它能支持工作前下载固件到它里面. 硬件市场的许多地方的竞争是如此得强烈, 以至于甚至一点用作设备控制固件的 EEPROM 的成本制造商都不愿意花费. 因此固件发布在随硬件一起的一张 CD 上, 并且操作系统负责传送固件到设备自身…