zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Window上编译最新版libCef(Branch 2704)(转载)
    在hue 使用oozie sqoop 从mysql 导入hive 失败
    hive 支持更新
    基于Hadoop生态圈的数据仓库实践 —— 环境搭建(三)笔记
    修改CENTOS7的网卡名(将网卡ens33修改为我们在centos6中常见的eth0)
    config network name
    Java服务部署规范(内部使用)
    MongoDB干货系列1-定期巡检之Mtools
    mongodb validation--像关系型数据库表去使用mongodb
    ntp 服务导致kudu集群不可用
  • 原文地址:https://www.cnblogs.com/NeilZhang/p/7098075.html
Copyright © 2011-2022 走看看