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. springcloud-eureka简单实现

    请参考 spring+cloud为服务实战 第三章 一.创建Eureka服务 1.使用Idea创建一个项目 结构如下: 2.pom.xml配置: <?xml version="1.0& ...

  2. [GO]kafka的生产者和消费者

    生产者: package main import ( "github.com/Shopify/sarama" "fmt" "time" ) ...

  3. 【Unity】1.0 第1章 Unity—3D游戏开发和虚拟现实应用开发的首选

    分类:Unity.C#.VS2015 创建日期:2016-03-23 一.简介 Unity是跨平台2D.3D游戏和虚拟现实高级应用程序的专业开发引擎,是由Unity Technologies公司研制的 ...

  4. 怎么备份VMware虚拟磁盘文件或移植到其他虚拟机

    原文:http://jingyan.baidu.com/article/a681b0de17b3173b1843468f.html 方法/步骤     第一种方法:直接复制本地主机磁盘下的虚拟磁盘文件 ...

  5. aused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in class path resource [applicationContext.xml]: Invocation of init method fai

    org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'roleDaoImpl' ...

  6. LA 4670 Dominating Patterns (AC自动机)

    题意:给定n个字符串和一个文本串,查找哪个字符串出现的次数的最多. 析:一匹配多,很明显是AC自动机.只需要对原来的进行修改一下,就可以得到这个题的答案, 计算过程中,要更新次数,并且要映射字符串.如 ...

  7. verilog基础--altera培训

    参数化 Localparam :与prameter一样,但不能被重写. Verilog-2001 格式, module mult_acc #(parameter size = 8 ) (...); 数 ...

  8. MapGIS Mobile开发

    1. 先将Android开发环境配置好(包括Java + Eclipse + Android SDK) 2. 加载API类库(运行MapGIS 10 AndroidSDK.exe可以加载Mobile框 ...

  9. Java性能调优:利用JFR生成性能日志

    Java性能调优作为大型分布式系统提供高性能服务的必修课,其重要性不言而喻. 好的分析工具能起到事半功倍的效果,利用分析利器JMC.JFR,可以实现性能问题的准确定位. 本文主要阐述如何利用JFR生成 ...

  10. what is HTTP OPTIONS verb

    The options verb is sent by browser to see if server accept cross origin request or not, this proces ...