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,一经查实,立即删除!

相关文章

Android 项目在Eclipse中的目录结构

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

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…

内联函数 —— 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 上, 并且操作系统负责传送固件到设备自身…

Linux USB 驱动开发(二)—— USB 驱动几个重要数据结构

前面我们学习了USB 驱动的一个描述符&#xff0c;下面来学习 USB 驱动的几个重要数据结构 一、struct usb_interface 接口函数 [cpp] view plaincopy struct usb_interface { struct usb_host_interface *altsetting; struct usb_host…

Linux USB 驱动开发(三)—— 编写USB 驱动程序

前面学习了USB驱动的一些基础概念与重要的数据结构&#xff0c;那么究竟如何编写一个USB 驱动程序呢&#xff1f;编写与一个USB设备驱动程序的方法和其他总线驱动方式类似&#xff0c;驱动程序把驱动程序对象注册到USB子系统中&#xff0c;稍后再使用制造商和设备标识来判断是否…

Linux USB 驱动开发(一)—— USB设备基础概念

在终端用户看来&#xff0c;USB设备为主机提供了多种多样的附加功能&#xff0c;如文件传输&#xff0c;声音播放等&#xff0c;但对USB主机来说&#xff0c;它与所有USB设备的接口都是一致的。一个USB设备由3个功能模块组成&#xff1a;USB总线接口、USB逻辑设备和功能单元&am…

Linux USB 驱动开发(四)—— 热插拔那点事

学习USB热插拔之前&#xff0c;先学习一些USB的硬件知识&#xff1a; 一、USB基础概念 1、硬件知识&#xff08;USB插座和插头&#xff09; 在最初的标准里&#xff0c;USB接头有4条线&#xff1a;电源&#xff0c;D-,D,地线。我们暂且把这样的叫做标准的USB接头吧。后来OTG出现…

Linux USB 驱动开发(五)—— USB驱动程序开发过程简单总结

设备驱动程序是操作系统内核和机器硬件之间的接口&#xff0c;由一组函数和一些私有数据组成&#xff0c;是应用程序和硬件设备之间的桥梁。在应用程序看来&#xff0c;硬件设备只是一个设备文件&#xff0c;应用程序可以像操作普通文件一样对硬件设备进行操作。 设备驱动程序是…

android软键盘上推ui解决

为什么80%的码农都做不了架构师&#xff1f;>>> http://bbs.csdn.net/topics/340198955 android软键盘上推ui解决 good job 转载于:https://my.oschina.net/macleo/blog/204882

Linux USB 驱动开发实例(一) —— USB摄像头驱动实现源码分析

Spac5xx的实现是按照标准的USB VIDEO设备的驱动框架编写&#xff08;其具体的驱动框架可参照/usr/src/linux/drivers/usb/usbvideo.c文件&#xff09;&#xff0c;整个源程序由四个主体部分组成&#xff1a; 设备模块的初始化模块和卸载模块&#xff0c;上层软件接口模块&#…

System Center 2012R2之SCVMM云部署SCOM(2-2)

SCVMM云部署SCOM安装过程1、在SCVMM中&#xff0c;使用WINDOWS SERVER 2012母盘创建云主机SCOM在SCVMM中先创建到一个私有云指定一个私有云名称选择资源主机指定逻辑网络默认选负载衡器跳过VIP模板跳过选择端口&#xff0c;下一步选择存储分类指定存储的VM路径各只读共享默认设…

Linux USB 驱动开发实例(二)—— USB 鼠标驱动注解及测试

参考2.6.14版本中的driver/usb/input/usbmouse.c。鼠标驱动可分为几个部分&#xff1a;驱动加载部分、probe部分、open部分、urb回调函数处理部分。 一、驱动加载部分 [cpp] view plaincopy static int __init usb_mouse_init(void) { int retval usb_register(&a…

MySQL5.6 更改字段属性仍旧会锁全表,注意这个坑!

如图&#xff1a;如果开发让修改表字段属性&#xff0c;建议用pt-online-schema-change。MySQL5.6的在线DDL会锁全表。注意这个坑。另外&#xff0c;增加、删除字段或索引不会锁全表&#xff0c;删除主键会锁全表。