Android activity之间的跳转和数据传递

Posted NeilZhang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android activity之间的跳转和数据传递相关的知识,希望对你有一定的参考价值。

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接口定义如下:

 1 public class Book_Parcelable implements Parcelable
 2 {
 3     private String bookName;
 4     private String author;
 5     private int publishDate;
 6 
 7     public Book_Parcelable()
 8     {
 9 
10     }
11 
12     public String getBookName()
13     {
14         return bookName;
15     }
16 
17     public void setBookName(String bookName)
18     {
19         this.bookName = bookName;
20     }
21 
22     public String getAuthor()
23     {
24         return author;
25     }
26 
27     public void setAuthor(String author)
28     {
29         this.author = author;
30     }
31 
32     public int getPublishDate()
33     {
34         return publishDate;
35     }
36 
37     public void setPublishDate(int publishDate)
38     {
39         this.publishDate = publishDate;
40     }
41 
42     @Override
43     public int describeContents()
44     {
45         return 0;
46     }
47 
48     @Override
49     public void writeToParcel(Parcel out, int flags)
50     {
51         out.writeString(bookName);
52         out.writeString(author);
53         out.writeInt(publishDate);
54     }
55 
56     public static final Parcelable.Creator<Book_Parcelable> CREATOR = new Creator<Book_Parcelable>()
57     {
58         @Override
59         public Book_Parcelable[] newArray(int size)
60         {
61             return new Book_Parcelable[size];
62         }
63 
64         @Override
65         public Book_Parcelable createFromParcel(Parcel in)
66         {
67             return new Book_Parcelable(in);
68         }
69     };
70 
71     public Book_Parcelable(Parcel in)
72     {
73         bookName = in.readString();
74         author = in.readString();
75         publishDate = in.readInt();
76     }
77 }  
View Code

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

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

 MainActivity的实现如下:

 1 public class MainActivity extends AppCompatActivity {
 2 
 3     @Override
 4     protected void onCreate(Bundle savedInstanceState) {
 5         super.onCreate(savedInstanceState);
 6         setContentView(R.layout.activity_main);
 7 
 8         Book_Parcelable book_parcelable = new Book_Parcelable();
 9         book_parcelable.setAuthor("zlj");
10         book_parcelable.setBookName("bigdata");
11         book_parcelable.setPublishDate(1234);
12 
13 
14         Intent intent = new Intent(getBaseContext(),A.class);
15         Bundle bundle = new Bundle();
16         bundle.putParcelable("zlj",book_parcelable);
17         intent.putExtras(bundle);
18         startActivity(intent);
19     }
20 }
View Code

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

 1 public class A extends AppCompatActivity {
 2 
 3     private TextView textView;
 4     @Override
 5     protected void onCreate(Bundle savedInstanceState) {
 6         super.onCreate(savedInstanceState);
 7         setContentView(R.layout.activity_a);
 8         textView = (TextView) findViewById(R.id.textView);
 9 
10         Book_Parcelable book_parcelable = getIntent().getParcelableExtra("zlj");
11         textView.setText(book_parcelable.getAuthor()+book_parcelable.getBookName());
12         System.out.println(textView.toString());
13 
14     }
15 }
View Code

实现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之间的跳转和数据传递的主要内容,如果未能解决你的问题,请参考以下文章

Android activity之间的跳转和数据传递

android学习——实现两个activity之间的跳转

android activity之间怎么跳转?

本地应用之间的跳转图形界面设置和数据传递

android-----实现不两个不同的activity的跳转和数据传递

kotin 实现android activity之间的跳转