Activity跳转传递信息

来源:互联网 发布:神经网络算法步骤 编辑:程序博客网 时间:2024/05/22 02:05

1、activity之间跳转时如何传递“消息”?

在进行Activity跳转时,通常都不是彻底单独的两者之间的跳转,他们两者是有所联系的,那么如何将这个联系的信息传递给进来的Activity呢?我现在知道三种方法:1、Intent 2、Broadcast 3、Bundle。

1) Intent

有些情况我们只需要提供几个参数用于进来的Activity02(下面02代表跳转后的,01代表当前的)的初

始化。这时只需要使用Intent就可以解决了。

示例:Intent intent = new Intent();

intent.setClass(Activity01.this,Activity02.class);

startActivity(intent);

Ac..01.this.finish();

ps:如何两个activity都是在主界面上的跳转,是有动画的,但如果将activity继承的是ActivityGroup而非Activity。则没有动画。(这个没有权威,只是自己用的时候感觉是这样的)。当然继承ActivityGroup的话启动Activity的方法也不一样。

示例:Intent intent = new Intent(Activity01.this,Activity02.class);

getLocalActivityManager().startActivity("grid",intent);

这里想显示切换activity动画的话,我是这样做的:

获取activity start时的View,并在主布局里定义一个负责容纳两个activity的布局,将当前的activity的View add到这个布局中,当要转到新的activity时,获取02的view并对两个view做动画处理,监听动画完毕时将01的view删除掉;

相关程序代码:(也提到了一点做动画,及动画监听的代码)

private void changeActivity (Intent intent){
     View goneView =null;
     if(bodyView.getChildCount()>0){           //bodyview就是提到的容纳activity的布局
      goneView= bodyView.getChildAt(0);        //先判断当前是否有activity
     }
     tempView=getLocalActivityManager().startActivity("grid",intent
       ).getDecorView();                       //此行是获取新activity启动时的View
     AbsoluteLayout.LayoutParams param = new AbsoluteLayout.LayoutParams(android.widget.AbsoluteLayout.LayoutParams.FILL_PARENT, 631, 0, 0);
     tempView.setLayoutParams(param);
     bodyView.addView(tempView);
     if(goneView!=null){
     Animation gones=new TranslateAnimation(0, -1024, 0, 0);
     gones.setDuration(1500);
     goneView.setAnimation(gones);
     }
     Animation comes=new TranslateAnimation(1024, 0, 0, 0);
     comes.setDuration(1500);
     tempView.setAnimation(comes);
     comes.setAnimationListener(new AnimationListener() {
   
   public void onAnimationStart(Animation animation) {
    // TODO Auto-generated method stub
   }
   
   public void onAnimationRepeat(Animation animation) {
    // TODO Auto-generated method stub
    
   }
   
   public void onAnimationEnd(Animation animation) {
    // TODO Auto-generated method stub
    if(bodyView.getChildCount()>1){
     bodyView.removeViewAt(0);
    }
   }
  });
       
    }

 

2)发送广播:sendBroadcast

有些时候并不是只初始化activity02,还要告诉02启动后执行什么操作。比如你点击一个目录后要求02按照目录的id进行初始化,并用listview显示了一组数据,这时候你获取想继续传递一个index来告诉02初始化好后将第几个元素设置为选中状态。这个时候就可以用广播进行处理。

01的代码里:

 

private void gotoActivity02(){
     Intent intent = new Intent(MainActivity.this, Activity02.class);
     changeActivity(intent);
     currectActivityType =1;
    }

 

private void upDateActivity02ViewBroadcast(int index,Boolean withAnimation){
     Intent intent = new Intent("toActivity02");
     intent.putExtra("index", index);
     intent.putExtra("withAnimation", withAnimation);
     sendBroadcast(intent);
    }

点击按钮后就调用上面两个函数。这个广播发出后,系统会循环遍历所有含有声明了注册接收广播的.java文件,在这个receiver里面就要对intent的参数进行匹配,匹配的才处理相关事件。比如上面的参数是“toActivity02”,那接收广播则应如下写:

 

class ChangeActivityReceiver extends BroadcastReceiver{

@Override
  public void onReceive(Context context, Intent intent) {
   // TODO Auto-generated method stub
   if(intent.getAction().equals("toActivity02")){
    int index=intent.getIntExtra("index", 0);
       gotoActivity02();
     upDateActivity02ViewBroadcast(index,false);
    }
  }
     
    }

 

而在这个内部类之前,要在这个activity的oncreat方法中声明:

IntentFilter filter = new IntentFilter("toActivity02");
   registerReceiver(new ChangeActivityReceiver(), filter);

只有如此才能正常的接收到广播,其实可以说系统才发现有广播发出时,就会遍历所有registerReceiver(注册接收)的.java文件,找到 filter参数为 intent参数的一个。

 

3)借助Bundle

有些时候我们要传递的对象不是基本类型,是一个封装多个属性的自定义类,这个时候可以借助Bundle来进行。我们把自定的多个属性封装到“束”中,交给intent 来传递:

Bundle data = new Bundle();

data.putString("name",name);

data.putString("address",address);

Intent  intent = new Intent();

intent.putExtras(data);

 

另一个activity中获取这些数据:

Intent intent = new Intent();

Bundle getdata= intent.getExtras();

String name = data.getString("name");

String address = data.getString("address");

0 0