一个Android应用程序很少会只有一个Activity对象,如何在多个Activity之间进行跳转,而且能够互相传值是一个很基本的要求。

本次我们就讲一下,Android中页面跳转以及传值的几种方式!

Activity跳转与传值,主要是通过Intent类来连接多个Activity.

1. Intent显式意图

(1) 最常见最一般的页面跳转代码,很简单,如下:

Intent intent = new Intent(A.this, SecondActivity.class);
startActivity(intent);

也可以这样写:

Intent intent = new Intent();
intent.setClass(A.this, SecondActivity.class);
startActivity(intent);

(2) 当然,你需要新建一个SecondActivity的界面,并继承activity,重写onCreate方法:

 public class SecondActivity extends Activity {

     @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
} }

(3) 当然新建了一个activity后记得在清单文件中进行注册.

(4) 在onCreate方法里设置布局文件: R.layout.activity_second,所以需要在res目录下新建

这样就可以使用显示意图实现页面跳转了.

2.隐式意图

隐式意图与显式意图在写法上有以下几点不一样:

(1) 在清单文件中注册需要加意图过滤器

 <activity android:name="com.example.intent.SecondActivity">
<intent-filter > <action android:name="com.google.open02"/> <!-- 一般配置 隐式意图 的时候就需要写 category
表示用在 默认的设备中 (默认的运行在 手机中 的) --> <category android:name="android.intent.category.DEFAULT"></category> <data android:scheme="haha" />
<data android:mimeType="image/jpeg"/>
<data android:host="www.google.com"/>
</intent-filter>
</activity>

(2) 在创建Intent对象时:

 Intent intent = new Intent();

 intent.setAction("com.google.open02");

5 intent.addCategory("android.intent.category.DEFAULT");

 intent.setDataAndType(Uri.parse("haha://www.google.com"), "image/jpeg");

 startActivity(intent);

这里需要注意一点:

data和type可以单独使用,但是他俩是互斥的

也就是说,使用了data就不能使用type,这个看API可以知道

如果想同时使用他俩的话,就需要用setDataAndType方法

注意: 隐式意图必须包含动作(action),以及数据(data)

3. 显式意图和隐式意图的区别

  • 显式意图: 一般用于激活应用程序内部的
  • 隐式意图: 一般用于激活其他应用程序的组件

4. 数据传递

(1) 要想实现在页面跳转的同时传递数据,只需要用一个方法即可:putExtra()

 Intent intent = new Intent(this, SecondActivity.class);
intent.putExtra("name", et_name.getText()+"");
startActivity(intent);

(2) 如果要传递复杂一点的数据,如图片:

putExtra可以传递一个Parcelable对象,而图片的bitmap是Parcelable的子类

所以可以这样操作:

 Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.logo);
intent.putExtra("pic", bitmap);

5. 数据接收

 // 首先获取到意图对象
Intent intent = getIntent(); // 获取到传递过来的姓名
String name = intent.getStringExtra("name"); // 获取到传递过来的图片
Bitmap bitmap = intent.getParcelableExtra("pic");

6. startActivityForResult

如果用正向传递的方式是可以实现数据的回归的,但是这样做的坏处是开启了很多个Activity累积到栈中,当点击返回的时候就会逐一打开之前的Activity,这样的用户
体验是非常不好的,所以通过数据的反向传递的方式保证Activity只有当前的一个,当用户点击返回时可以直接退出。

下面以一种需求为例,讲解startActivityForResult,发送短信小助手:

用户点击"选择模板"跳到短信模板的界面,然后点击某一条短信,直接将选择的短信返回到页面中

主界面:

选择模板短信的界面:

选择联系人界面:

这里的列表是用listview来做的,点击对应的listview可以将结果返回到主界面中.

以下是两个按钮点击事件的代码:


 /**
* 选择短信模板
* @param view
*/
public void selectSms(View view){
//点击后跳转到短信模板界面
Intent intent = new Intent(this, SmsActivity.class); //两个参数:Intent intent 意图对象
//int requestCode 请求码
startActivityForResult(intent, 2);
}
/**
* 选择收信人
*/
public void addContacts(View view) {
// 点击后跳到联系人列表界面
Intent intent = new Intent(this, ContactsActivity.class); //为了一个结果 去启动另外的一个 activity 界面
startActivityForResult(intent, 1);
}

注意: 还需要重写onActivityResult()方法,来接收返回的数据

示例代码如下:

 @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data); // resultCode : 结果码, 用来鉴别 到底是 哪个 结果 ...
if (data != null) {
if (resultCode == 1) {// 说明是联系人的返回结果
contact = data.getStringExtra("contact");
et_contact.setText(contact);
}else if(resultCode == 2){//说明是短信模板的返回结果
sms = data.getStringExtra("sms");
et_content.setText(sms);
}
}
}

以下是短信模板的示例代码:

 public class SmsActivity extends Activity {

     String [] sms = {"短信1","短信2","短信3","短信4"};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sms); ListView lv_sms = (ListView) findViewById(R.id.lv_sms); lv_sms.setAdapter(new ArrayAdapter<String>(this, R.layout.item_sms, sms)); lv_sms.setOnItemClickListener(new OnItemClickListener() { @Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) { String template = sms[position]; Intent data = new Intent(); data.putExtra("sms", template); //int resultCode, 结果码,用于区分到底是哪个的返回数据
//Intent data
setResult(2, data); finish();
}
});
} }

好了,关于页面跳转就先介绍到这里.

Android中实现activity的页面跳转并传值的更多相关文章

  1. Android开发之Activity的创建跳转及传值

    在Android系统的江湖中有四大组件:活动(Activity), 服务(Service), 广播接收器(Broadcast Reciver)和内容提供者(Content Provider).今天所介 ...

  2. Android中半透明Activity效果另法

    Android中的Activity有没有类似于像Windows程序样的窗口式显示呢? 答案当然是有. 下图就是一个窗口式Activity的效果图: 下面就说说实现过程: 首先看看AndroidMani ...

  3. iOS——使用StroryBoard页面跳转及传值

    之前在网上搜iOS的页面跳转大多都是按回以前的那种xib的形式,但鄙人是使用storyboard的.这篇就只介绍利用storyboard进行页面跳转与传值. 新建页面 iOS的程序也是使用了MVC的思 ...

  4. iOS使用StroryBoard页面跳转及传值

    之前在网上iOS的页面跳转大多都是按回以前的那种xib的形式,但鄙人是使用storyboard的.这篇就只介绍利用storyboard进行页面跳转与传值. 新建页面 iOS的程序也是使用了MVC的思想 ...

  5. H5页面跳转与传值

    页面之间的跳转经常使用a标签,使用mvc框架的都是通过访问controller的请求方法,返回请求页面.但本次开发,前端与后台完全分离,前端APP使用HBuider来开发,后台数据就无法使用mvc框架 ...

  6. kotlin使用anko在Android中实现Activity跳转,超优雅!

    //正常跳转 startActivity<RegisterActivity>() //携带参数 startActivity<ResetPwdActivity>("ke ...

  7. Android中的Activity

    Android四大组件 活动(Activity) 广播接收者(BroadCastReceiver) 服务(Service) 内容提供者(Contentprovider) Activity 先来看And ...

  8. Android Jetpack - 使用 Navigation 管理页面跳转

    在今年的 IO 大会上,发布了一套叫 Android Jetpack 的程序库.Android Jetpack 里的组件大部分我们都接触过了,其中也有一些全新的组件,其中一个就是 Navigation ...

  9. Android中自定义Activity和Dialog的位置大小背景和透明度等

    1.自定义Activity显示样式 先在res/values下建colors.xml文件,写入: view plainprint? 1. <?xml version="1.0" ...

随机推荐

  1. Spring通过注解配置Bean

    @Component: 基本注解, 标识了一个受 Spring 管理的组件@Repository: 标识持久层组件@Service: 标识服务层(业务层)组件@Controller: 标识表现层组件 ...

  2. Android多点触控手势基础

    处理多点触控手势 多点触控就是同时把一根以上的手指放在屏幕上. 再继续往下以前需要补充一些名词: 触控手势:就是把一根或者几根手指放在屏幕上做各种动作,其中包括保留一根手指的前提下,拿起或者放下其余的 ...

  3. (打表+优化)简单的求和 -- zzuli -- 1783

    http://acm.zzuli.edu.cn/problem.php?id=1783 1783: 简单的求和 Time Limit: 1 Sec  Memory Limit: 128 MBSubmi ...

  4. web-day10

    第10章WEB10-requet&response篇 今日任务 登录系统后完成文件下载 商城系统注册功能. 教学导航 教学目标 掌握response设置响应头 掌握response重定向和转发 ...

  5. java基础-day28

    第05天 MySQL 今日内容介绍 u 数据库的概述 u MySQL和SQLyog的安装和使用 u SQL语句 第1章   数据库的概述 1.1  数据库的概述 1.1.1 概述 l  什么是数据库 ...

  6. 第32讲:List的基本操作实战与基于模式匹配的List排序算法实现

    今天来学习一下list的基本操作及基于模式匹配的排序操作 让我们从代码出发 val bigData = List("hadoop","spark") val d ...

  7. Codeforces Beta Round #27 E. Number With The Given Amount Of Divisors 含n个约数最小数

    http://codeforces.com/problemset/problem/27/E RT,求含n个约数的最小的数 我们设答案p = 2^t1 * 3^t2 * -- * p^tk(其中p是第k ...

  8. Linux查看History记录加时间戳小技巧

    Linux查看History记录加时间戳小技巧 熟悉bash的都一定知道使用history可以输出你曾经输入过的历史命令,例如[root@servyou_web ~]# history | more ...

  9. 有人在用fastReport作报表时处理过字体自动缩小的问题吗,怎么做

    有人在用fastReport作报表时处理过字体自动缩小的问题吗,怎么做  我来答   浏览 49 次 1个回答 #吃瓜大会# Angelababy演技被吐槽, 你觉得她的演技怎么样? 最佳答案 热心 ...

  10. IDHTTP的基本用法

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 3 ...