码迷,mamicode.com
首页 > 移动开发 > 详细

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

时间:2017-06-30 14:01:02      阅读:182      评论:0      收藏:0      [点我收藏+]

标签:解决   href   data   lan   when   pac   public   title   传递   

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、 上述的应用:

场景:

  接入银联支付时:  发起支付的页面必须 写一个 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() 方法就不会被调用。

 

4、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()方法。?

 

5、通过定义一个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之间的跳转和数据传递

标签:解决   href   data   lan   when   pac   public   title   传递   

原文地址:http://www.cnblogs.com/NeilZhang/p/7098075.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!