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接口优。
具体实现可以参考:
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中的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());
github 地址:
git@github.com:lsfzlj/AndroidTestProject.git