窗外再次飘起了小雪,还有1周就过年了,2016年即将到来,来年不知道自己将身处何处,船到桥头自然直吧。还是继续学习吧,上次学习了Activity,那么如果是两个Activity之间,怎么从一个Activity切换到另外一个Activity呢?那便是Intent,intent中文的意思就是意图,目的的意思。也就是从个一个Activity到另一个Activity了。下面就来个例子比较直观吧。

接着上次的学习,首先再新建一个Activity:

新建Activity,命名为SecondActivity并自动生成layout为activity_second:

然后添加一个Button,命名为Button2,如下图所示:

修改代码去处标题栏:

package com.example.jared.activitystudy;

import android.support.v7.app.ActionBar;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle; public class SecondActivity extends AppCompatActivity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActionBar actionBar = getSupportActionBar();
actionBar.hide();
setContentView(R.layout.activity_second);
}
}

在AndroidManifest.xml中添加Activity,其实在创建空的Activity的时候,软件已经为我们添加了。

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

Intent的方式有两种,一种是显式的方式,一种是隐式的方式,先看下显式的方式。这里看下Intent的官方文档就有说明,构造函数Intent,其中packageContext是提供一个启动活动的上下文,cls是要启动的活动的class。

public Intent (Context packageContext, Class<?>
cls)

    然后通过startActivity()方法来启动一个活动,

参数是一个Intent,说了这些听着也不明白,还是来个例子明白。

    就像一般App,点击了按钮或者链接来启动新的一个Activity,FirstActivity中正好有一个button,所以就监听button的事件来触发。代码如下所示:
package com.example.jared.activitystudy;

import android.content.Intent;
import android.support.v7.app.ActionBar;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast; public class FirstActivity extends AppCompatActivity { private Button button; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActionBar actionBar = getSupportActionBar();
actionBar.hide();
setContentView(R.layout.activity_first); button = (Button)findViewById(R.id.button1);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(FirstActivity.this, "Button1 is clicked!!",
Toast.LENGTH_SHORT).show();
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
startActivity(intent);
}
});
}
}

这里先定义了Button,然后通过findViewById来指定button1,然后调用setOnClickListener来监听这个button的事件。其中的Toast主要是用来显示一下小通知给用户的。

    运行,并且按button1显示如下:
 
           
    Intent的功能就很好的体现出来了,这个就是显式Intent了,意图非常的明显。而隐式Intent指定了一系列更为抽象的action和category等信息,然后交由系统自己去分析这个Intent,并帮我们找出合适的Activity去启动。
    通过<activity>标签下配置<intent-filter>的内容,可以指定当前活动能够响应的action和category,action表示的是普通的将被执行的行动,例如ACTION_VIEW,ACTION_EDIT,ACTION_MAIN等。category表示为之心的行动提供额外的信息。然后在AndroidManifest.xml中添加代码如下:
<activity android:name=".SecondActivity">
<intent-filter>
<action android:name="com.example.jared.activitystudy.ACTION_START" />
<category android:name="android.intent.category.DEFAULT" />
</intent

然后在FirstActivity代码中添加如下:

button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(FirstActivity.this, "Button1 is clicked!!",
Toast.LENGTH_SHORT).show(); //Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
Intent intent = new Intent("com.example.jared.activitystudy.ACTION_START");
startActivity(intent);
}
});

如上Intent传入了这个action,然后在AndroidManifest中也添加了同样的action,而category是DEFAULT的,所以这样就实现了Intent的功能。如果定义自己的category,那么修改代码如下:

<activity android:name=".SecondActivity">
<intent-filter>
<action android:name="com.example.jared.activitystudy.ACTION_START" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="com.example.jared.activitystudy.MY_CATEGORY"/>
</intent-filter>
</activity>
    FirstActivity代码如下:
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(FirstActivity.this, "Button1 is clicked!!",
Toast.LENGTH_SHORT).show(); //Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
Intent intent = new Intent("com.example.jared.activitystudy.ACTION_START");
intent.addCategory("com.example.jared.activitystudy.MY_CATEGORY");
startActivity(intent);
}
});
   
运行代码如上面的显式的方式一样的效果,这里就不再添图了。
    关于Intent,还有很多的隐式用法,使用Intent不仅仅可以启动我们自己想要启动的Activity,还可以启动其他程序的Activity,这样就使得多个Android应用程序之间的功能得到共享。比如我想要在应用中显示一个网页,调用内部的浏览器就可以了。
    先来实现下,修改FirstActivity代码如下:
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(FirstActivity.this, "Button1 is clicked!!",
Toast.LENGTH_SHORT).show(); Intent intent = new Intent("Intent.ACTION_VIEW");
intent.setData(Uri.parse("http://blog.csdn.net/eastmoon502136"));
startActivity(intent);
}
});

这里的ACTION_VIEW是android系统的内置动作。Uri.parse()的方法,将网址字符串解析成一个Uri对象,再调用Intent的setData()方法将这个对象传递进去。然后运行程序,点击button显示如下:


    此外如果我们想要调用系统拨号的界面,那么就需要用到Intent.ACTION_DIAL了,修改代码如下:
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(FirstActivity.this, "Button1 is clicked!!",
Toast.LENGTH_SHORT).show(); Intent intent = new Intent(Intent.ACTION_DIAL);
intent.setData(Uri.parse("tel:10086"));
startActivity(intent);
}
});

运行后,点击button按钮显示如下:


关于隐式的Intent就介绍到这里了,其他的可以参考android官方的文档。

比如我第一个Activity里面填写了一些信息,要在另一个Activity中用到,那么怎么才能把信息从第一个Activity传递到第二个Activity中呢?当然这里还是需要用到Intent了。

这里还是以例子来得实际吧,依然继承上面的代码,这里用putExta方法来实现。首先在FirstActivity中添加代码:

button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(FirstActivity.this, "Button1 is clicked!!",
Toast.LENGTH_SHORT).show();
String data = "I am from FirstActivity";
String name = "exta_data";
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
intent.putExtra(name, data);
startActivity(intent);
}
});

这里的putExta需要两个参数,一个是名字,一个是数据。这里名字定义为:exta_data,数据就根据需求了。好了既然这个FirstActivity代码已经写完了,那么接收端SecondActivity就需要处理数据了。为了能在SecondActivity中显示,顾这里在activity_second.xml中添加一个textview(之后添加控件就不多做说明了):

添加完后我们再回到SecondActivity中来编写接收到的数据并显示的代码:

public class SecondActivity extends AppCompatActivity {
private TextView textview; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActionBar actionBar = getSupportActionBar();
actionBar.hide();
setContentView(R.layout.activity_second); String name = "exta_data";
Intent intent = getIntent();
String data = intent.getStringExtra(name);
textview = (TextView)findViewById(R.id.exta_data);
textview.setText(data);
}
}

这里定义了TextView,通过findViewById来获取exta_data这个textview,然后通过intent的getStringExta(如果传入的是int类型,那么就用getIntExta方法,其他类似)来获取传递过来的数据,通过textview的setText来显示接收到的数据,运行结果如下:

那么如果按了back按键,SecondActivity的数据能传递回给FirstActivity呢?答案是肯定的。那么我们还是来测试下吧:

首先也为FirstActivity添加个textview:

这里和SecondActivity的类似,然后修改SecondActivity代码:

button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String name = "return_data";
String data = "I am from SecondActivity";
Intent intent1 = new Intent();
intent1.putExtra(name, data);
setResult(RESULT_OK, intent1);
finish();
}
});

这里实例化一个intent1,传入name为return_data,数据自定义。然后通过setResult方法来回调给FirstActivity,这里调用finish主要是为了销毁SecondActivity使FirstActivity在栈顶,其中RESULT_OK是返回值,还有RESULT_CANCELED。

接着就是修改FirstActivity的代码了。替换startActivity方法如下,这个方法是有返回值,并且能在onActivityResult方法中回调的。

startActivityForResult(intent, 1);

然后就是在onActivityResult方法中实现了:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
case 1:
if(resultCode == RESULT_OK) {
String name = "return_data";
String returnData = data.getStringExtra(name);
textView = (TextView)findViewById(R.id.return_data);
textView.setText(returnData);
}
break;
default:
}
}

其中的名字和SecondActivity对应,运行显示如下:

好了,关于Intent差不多就学习到这里了。

Android开发学习之路--Activity之Intent的更多相关文章

  1. Android开发学习之路--Activity之初体验

    环境也搭建好了,android系统也基本了解了,那么接下来就可以开始学习android开发了,相信这么学下去肯定可以把android开发学习好的,再加上时而再温故下linux下的知识,看看androi ...

  2. Android开发学习之路--Activity之四种启动模式

    后天终于可以回家了,马上就要过年了,趁着年底打酱油的模式,就多学习学习,然后记录记录吧.关于Activity已经学习了七七八八了,还有就是Activity的四种启动模式了,它们分别为,standard ...

  3. Android开发学习之路--Activity之生命周期

    其实这篇文章应该要在介绍Activity的时候写的,不过那个时候还不怎么熟悉Activity,还是在这里详细介绍下好了.还是参考下官方文档的图吧: 从上面的流程,我们可以看出首先就是打开APP,开始执 ...

  4. Android开发学习之路--基于vitamio的视频播放器(二)

      终于把该忙的事情都忙得差不多了,接下来又可以开始good good study,day day up了.在Android开发学习之路–基于vitamio的视频播放器(一)中,主要讲了播放器的界面的 ...

  5. Android开发学习之路-RecyclerView滑动删除和拖动排序

    Android开发学习之路-RecyclerView使用初探 Android开发学习之路-RecyclerView的Item自定义动画及DefaultItemAnimator源码分析 Android开 ...

  6. Android开发学习之路--Android Studio cmake编译ffmpeg

      最新的android studio2.2引入了cmake可以很好地实现ndk的编写.这里使用最新的方式,对于以前的android下的ndk编译什么的可以参考之前的文章:Android开发学习之路– ...

  7. Android开发学习之路--网络编程之xml、json

    一般网络数据通过http来get,post,那么其中的数据不可能杂乱无章,比如我要post一段数据,肯定是要有一定的格式,协议的.常用的就是xml和json了.在此先要搭建个简单的服务器吧,首先呢下载 ...

  8. Android开发学习之路--Android系统架构初探

    环境搭建好了,最简单的app也运行过了,那么app到底是怎么运行在手机上的,手机又到底怎么能运行这些应用,一堆的电子元器件最后可以运行这么美妙的界面,在此还是需要好好研究研究.这里从芯片及硬件模块-& ...

  9. Android开发学习之路--MAC下Android Studio开发环境搭建

    自从毕业开始到现在还没有系统地学习android应用的开发,之前一直都是做些底层的驱动,以及linux上的c开发.虽然写过几个简单的app,也对android4.0.3的源代码做过部分的分析,也算入门 ...

随机推荐

  1. UVA 3713 Astronauts

    The Bandulu Space Agency (BSA) has plans for the following three space missions: • Mission A: Landin ...

  2. 本地缓存,Redis缓存,数据库DB查询(结合代码分析)

    问题背景 为什么要使用缓存?本地缓存/Redis缓存/数据库查询优先级? 一.为什么要使用缓存 原因:CPU的速度远远高于磁盘IO的速度问题:很多信息存在数据库当中的,每次查询数据库就是一次IO操作所 ...

  3. Python从入门到实践 学习笔记(二)元祖686gffs

    列表是可以修改的,而不可变的列表被称为元组 . 定义 * 用圆括号来标识.定义元组后,使用索引来访问其元素,就像访问列表元素一样 修改变量 * 不能修改元组的元素,但可以给存储元组的变量赋值 修改元素 ...

  4. 【vuejs深入二】vue源码解析之一,基础源码结构和htmlParse解析器

    写在前面 一个好的架构需要经过血与火的历练,一个好的工程师需要经过无数项目的摧残. vuejs是一个优秀的前端mvvm框架,它的易用性和渐进式的理念可以使每一个前端开发人员感到舒服,感到easy.它内 ...

  5. Java锁Synchronized对象锁和类锁区别

    java的内置锁:每个java对象都可以用做一个实现同步的锁,这些锁成为内置锁.线程进入同步代码块或方法的时候会自动获得该锁,在退出同步代码块或方法时会释放该锁.获得内置锁的唯一途径就是进入这个锁的保 ...

  6. 643. Maximum Average Subarray

    Given an array consisting of \(n\) integers, find the contiguous subarray of given length \(k\) that ...

  7. 让互联网更快,Server Push 特性及开启方式详解

    过去 Nginx 并不支持 HTTP/2 的 Server Push 特性,幸运的是 Nginx 1.13.9 已支持该特性,详情介绍请移步 Nginx 官方博客. Server Push 这个特性是 ...

  8. JAVA反射之Class类的练习

    package zhang; /** * JAVA反射之CLass类的练习 * * 在面向对象的语言里,万事万物皆对象,那么类是谁的对象呢? * 类的类型是CLass * * */ class Tes ...

  9. 解析配置文件redis.conf

    units单位: # 1k => 1000 bytes # 1kb => 1024 bytes # 1m => 1000000 bytes # 1mb => 1024*1024 ...

  10. kafka Centos7.2 单机集群搭建

    前提是已经安装好了zk集群 1.下载  kafka_2.11-1.0.0.tgz  下载网址 http://kafka.apache.org/documentation.html 2.解压  tar ...