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 }
實現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 }
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 }
實現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