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

青春须早为,岂能长少年。这篇文章主要讲述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接口定义如下:
Android activity之间的跳转和数据传递

文章图片
Android activity之间的跳转和数据传递

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

View Code【Android activity之间的跳转和数据传递】实现ParcelAble接口必须重载几个方法,可见代码。
  MainActivity中传递Book_ParcelAble对象到A,在A中的textView中显示携带的信息。
  MainActivity的实现如下:
Android activity之间的跳转和数据传递

文章图片
Android activity之间的跳转和数据传递

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

View CodeA中接收信息的代码如下:
Android activity之间的跳转和数据传递

文章图片
Android activity之间的跳转和数据传递

文章图片
1 public class A extends AppCompatActivity { 2 3private TextView textView; 4@Override 5protected void onCreate(Bundle savedInstanceState) { 6super.onCreate(savedInstanceState); 7setContentView(R.layout.activity_a); 8textView = (TextView) findViewById(R.id.textView); 9 10Book_Parcelable book_parcelable = getIntent().getParcelableExtra("zlj"); 11textView.setText(book_parcelable.getAuthor()+book_parcelable.getBookName()); 12System.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
 

    推荐阅读