1、Activity之间的跳转 并且 传递数据

  A Activity进行的操作

        Intent intent = new Intent(context, B.class);
intent.putExtra("tn",tn);
intent.putExtra("payMode",payMode);
context.startActivity(intent);

  B activity接收数据

    protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Bundle extras = getIntent().getExtras();
tnNumber = extras.getString("tn");
payMode = extras.getString("payMode");

2、 startActivityForResult() 用法

  B activity等待C activity 的结果

  protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_b);
Intent intent = new Intent(B.this,C.class);
startActivityForResult(intent,10); } @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
String A = data.getStringExtra("a");
String B = data.getStringExtra("b");
if(resultCode == 9){
Log.d(TAG, "onActivityResult: "+A+" "+B);
}
}

  C activity 传递数据给 B

 protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_c);
Intent mIntent = new Intent();
mIntent.putExtra("a","nameA");
mIntent.putExtra("b","nameB");
this.setResult(9,mIntent);
}

3、利用ParcelAble接口或者 Serilizeable接口在Activity之间传递信息

Book_ParcelAble接口定义如下:

 public class Book_Parcelable implements Parcelable
{
private String bookName;
private String author;
private int publishDate; public Book_Parcelable()
{ } public String getBookName()
{
return bookName;
} public void setBookName(String bookName)
{
this.bookName = bookName;
} public String getAuthor()
{
return author;
} public void setAuthor(String author)
{
this.author = author;
} public int getPublishDate()
{
return publishDate;
} public void setPublishDate(int publishDate)
{
this.publishDate = publishDate;
} @Override
public int describeContents()
{
return 0;
} @Override
public void writeToParcel(Parcel out, int flags)
{
out.writeString(bookName);
out.writeString(author);
out.writeInt(publishDate);
} public static final Parcelable.Creator<Book_Parcelable> CREATOR = new Creator<Book_Parcelable>()
{
@Override
public Book_Parcelable[] newArray(int size)
{
return new Book_Parcelable[size];
} @Override
public Book_Parcelable createFromParcel(Parcel in)
{
return new Book_Parcelable(in);
}
}; public Book_Parcelable(Parcel in)
{
bookName = in.readString();
author = in.readString();
publishDate = in.readInt();
}
}  

实现ParcelAble接口必须重载几个方法,可见代码。

MainActivity中传递Book_ParcelAble对象到A,在A中的textView中显示携带的信息。

MainActivity的实现如下:

 public class MainActivity extends AppCompatActivity {

     @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); Book_Parcelable book_parcelable = new Book_Parcelable();
book_parcelable.setAuthor("zlj");
book_parcelable.setBookName("bigdata");
book_parcelable.setPublishDate(1234); Intent intent = new Intent(getBaseContext(),A.class);
Bundle bundle = new Bundle();
bundle.putParcelable("zlj",book_parcelable);
intent.putExtras(bundle);
startActivity(intent);
}
}

A中接收信息的代码如下:

 public class A extends AppCompatActivity {

     private TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_a);
textView = (TextView) findViewById(R.id.textView); Book_Parcelable book_parcelable = getIntent().getParcelableExtra("zlj");
textView.setText(book_parcelable.getAuthor()+book_parcelable.getBookName());
System.out.println(textView.toString()); }
}

实现seriable接口传递信息与ParcelAble接口相似,而且它的实现更为简单,但是会创建大量的中间变量,引起频繁的GC。性能没有ParcelAble接口优。

具体实现可以参考:

  ParcelAble、Serilizeable接口对比:http://www.cnblogs.com/renqingping/archive/2012/10/25/Parcelable.html

4、 上述的应用:

场景:

  接入银联支付时:  发起支付的页面必须 写一个 onActivityResult() 函数,接收支付的结果。 现在不想在 发起支付的页面 重写这个函数,而是要把它集成到SDK中,

我们需要做的是 设置一个中间 Activity去 发起支付。   A ------  C

  现在问题来了:  1、设置一个中间Activity 会有跳转的效果,用户会莫名的跳进一个 空白的 activity 再跳到支付页面。

          2、返回时会,需要按两次返回才能 返回原界面。

解决办法:

  发起 页面A , 中间页面 B , 支付页面 C

  1、B 设置注册时 设置  Activity为透明,这样跳转时就不会有闪屏的感觉。

    Android:theme="@android:style/Theme.Translucent"

  2、 在onActivityResult() 中完成相应操作时,调用 finish();

    就不需要再按一次 返回,才能退出中间Activity

问题完美解决。

另一思路,证明是错误的。

  在 B 中 发起完成 支付后 ,直接调用 finish();  这样跳转页面时不用跳到空白页,而且从支付页面返回时也不需要调用两次。

但是 B中的onActivityResult() 方法就不会被调用。

5、Activity 中finish() 和 onDestroy()方法的区别:

  Activity.finish() 

    Call this when your activity is done and should be closed.

      在你的activity动作完成的时候,或者Activity需要关闭的时候,调用此方法。当你调用此方法的时候,系统只是将最上面的Activity移出了栈,

并没有及时的调用onDestory()方法,其占用的资源也没有被及时释放。因为移出了栈,所以当你点击手机上面的“back”按键的时候,也不会再找到这个ActivityActivity.

  onDestory()

  the system is temporarily destroying this instance of the activity to save space.

  系统销毁了这个Activity的实例在内存中占据的空间。在Activity的生命周期中,onDestory()方法是他生命的最后一步,资源空间等就被回收了。

当重新进入此Activity的时候,必须重新创建,执行onCreate()方法。‍

6、通过定义一个ActivityCollecter 类来管理 开启的活动

package com.example.activitytest;

import android.app.Activity;

import java.util.ArrayList;
import java.util.List; public class ActivityCollector { public static List<Activity> activities = new ArrayList<>(); public static void addActivity(Activity activity) {
activities.add(activity);
} public static void removeActivity(Activity activity) {
activities.remove(activity);
} public static void finishAll() {
for (Activity activity : activities) {
if (!activity.isFinishing()) {
activity.finish();
}
}
} }

在每个Activity 创建的时候增加:

ActivityCollector.addActivity(this);

当在最后一个Activity中调用如下,activity会被清空

 ActivityCollector.finishAll();
android.os.Process.killProcess(android.os.Process.myPid());

活动生命周期:

  http://www.cnblogs.com/NeilZhang/p/6898140.html

github 地址:

  git@github.com:lsfzlj/AndroidTestProject.git

Android activity之间的跳转和数据传递的更多相关文章

  1. 实现android activity之间的跳转

    android程序一般不会只有一个activity,会碰到activity之间的跳转.以下是使用Intent做应用程序内部的activity做跳转.比如,应用程序第一个activity是: 点击“下一 ...

  2. iOS开发拓展篇—应用之间的跳转和数据传递

    iOS开发拓展篇—应用之间的跳转和数据传 说明:本文介绍app如何打开另一个app,并且传递数据. 一.简单说明 新建两个应用,分别为应用A和应用B. 实现要求:在appA的页面中点击对应的按钮,能够 ...

  3. iOS应用之间的跳转与数据传递

    在开发的时候遇到需要从其他APP调用自己的APP的需求,比如从Safari中打开APP,并且传递一些信息的需要 1.首先设置自己的URL types 打开项目中的工程文件,打开info选项,在下面的U ...

  4. 杂记之activity之间的跳转

    代码结构图 manifest.xml <?xml version="1.0" encoding="utf-8"?> <manifest xml ...

  5. Android笔记(二十) Activity中的跳转和值传递

    我们知道,一个APP是由若干个Activity组成的,那么各个Acitivity中肯定需要进行跳转以及传递数值以保证App的运行,现总结一下多个Activity之间的跳转和值传递. 显式Intent跳 ...

  6. Android first --- 页面跳转及数据传递

    页面跳转即数据传递 创建第二个界面Acivity *需要在清单文件中添加配置一个Actuvity标签 标签中如果带有这个子节点,则会在Android中添加一个快捷图标 <intent-filte ...

  7. ViewController之间的转场和数据传递

    ViewController之间的转场和数据传递 可以正向传递值, 反向传递值. 注意反向传值的时候,方法的位置: https://github.com/urmyfaith/GRDBUsage/blo ...

  8. Android笔记(三) 使得Activity之间可以跳转---Intent

    什么是Intent 一个APP肯定不单单由一个Activity构成,我们在使用过程中,经常需要在多个Activity中跳转,Android中Intent可以帮我们来完成在各个Activity中跳转的功 ...

  9. android Activity之间数据传递 Parcelable和Serializable接口的使用

    Activity之间传数据时,为了避免麻烦,往往会将一些值封装成对象,然后将整个对象传递过去.传对象的时候有两种情况,一种是实现Parcelable接口,一种是实现Serializable接口.0.解 ...

随机推荐

  1. 一次性选中word中全部Table

    Sub 批量修改表格() Dim tempTable As Table Application.ScreenUpdating = False If ActiveDocument.ProtectionT ...

  2. 日历时间选择控件---3(支持ie、火狐)

    效果展示:  源代码: <script language=javascript ><!--/* 调用方法:不能用onfocus,要用onclick  <input onclic ...

  3. JavaScript面向对象编程[转]

    JavaScript面向对象编程 命名空间 命名空间是一个容器,它允许开发人员在一个独特的,特定于应用程序的名称下捆绑所有的功能. 在JavaScript中,命名空间只是另一个包含方法,属性,对象的对 ...

  4. C#-VS字符串、日期、时间和时间段

    小知识 哈希表,内存中的对象,用速度很快的哈希表当字典表,记录主键和内容. @,遇到转义字符,不转义,直接输出,即就是.转义字符是反斜杠/ 全部的内置类型都用类和结构描述.值类型用结构,引用类型用类. ...

  5. 在TFS中使用Git Tags(标签或标记),实现代码的版本管理

    一.概述: 与TFVC中标记(Label)一样,Git的标签(Tag)也是TFS系统的代码管理中非常重要的一个版本管理工具.使用标签,我们可以每个时间点的代码注上一个通俗.并且容易记忆的名称(例如标签 ...

  6. Django:上传文件或者图片时request.FILES的值为空

    在form表单中加上属性 enctype="multipart/form-data"

  7. 前端项目打包工具weexpack的安装

    最下面是本人安装时候的系统环境,本篇文章只限于参考,不一定非得是这样,原因你懂得. 打包的过程中出现的问题 1.执行到weexpack run android的时候,到了resolving class ...

  8. (zxing.net)一维码MSI的简介、实现与解码

    一.简介 MSI/Plessey 条码(也被称为 MSI 或 Modified Plessey)是一款数字条码,多用于超市.存储用的仓库和其他贮藏室的货架.货架上的条码可以告知货架上的产品.应放数量和 ...

  9. .Net中XML,JSON的几种处理方式

    一.XML: 1.基本了解: xml,Extensible markup language可扩展标记语言,用于数据的传输或保存,特点,格式非常整齐数据清晰明了,并且任何语言都内置了xml分析引擎, 不 ...

  10. Redis入门教程(C#)

    Redis是什么? Redis是一个开源的.使用C语言编写的.支持网络交互的.可基于内存也可持久化的Key-Value数据库. 补充概念: 持久化:是将程序数据在持久状态和瞬时状态间转换的机制.通俗的 ...