http://blog.sina.com.cn/s/blog_62dea93001015847.html

一个应用程序会有多个Activity,但是只有一个Activity作为程序的入口,应用中的其他的Activity只能通过入口Activity来启动,或者由入口Activity启动的Activity启动。(在这里不要晕,可以理解成是一个树结构,入口Activity是根节点)

要用到的两个方法:

  • startActivty(Intent intent)
  • startActivtyForResult(Intent intent,int requestCode):启动其他Activity,从新启动的Activity中取回结果返回到启动新Activity的Activity。

启动其他Activity需要用到Intent类,在Activity之间传递数据还需要用到Bundle类。下面按Activity的两种启动方法来学习他们的用法。

(1)使用startActivity()
例子:

public class StartActivity extends Activity
{
 @Override
 public void onCreate(Bundle savedInstanceState)
 {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);
  //获取应用程序中的bn按钮
  Button bn = (Button)findViewById(R.id.bn);
  //为bn按钮绑定事件监听器
  bn.setOnClickListener(new OnClickListener()
  {
   @Override
   public void onClick(View source)
   {
    //创建需要启动的Activity对应的Intent
    Intent intent = new Intent(StartActivity.this
     , SecondActivity.class);
    //启动intent对应的Activity
    startActivity(intent);    
   }  
  });
 }
}

===================================================================

public class SecondActivity extends Activity
{
 @Override
 public void onCreate(Bundle savedInstanceState)
 {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.second);
  //获取应用程序中的previous按钮
  Button previous = (Button)findViewById(R.id.previous);
  //获取应用程序中的close按钮
  Button close = (Button)findViewById(R.id.close);
  //为previous按钮绑定事件监听器
  previous.setOnClickListener(new OnClickListener()
  {
   @Override
   public void onClick(View source)
   {
    //获取启动当前Activity的上一个Intent
    Intent intent = new Intent(SecondActivity.this
     , StartActivity.class);
    //启动intent对应的Activity
    startActivity(intent);    
   }
  });
  //为close按钮绑定事件监听器 
  close.setOnClickListener(new OnClickListener()
  {
   @Override
   public void onClick(View source)
   {
    //获取启动当前Activity的上一个Intent
    Intent intent = new Intent(SecondActivity.this
     , StartActivity.class);
    //启动intent对应的Activity
    startActivity(intent);
    //结束当前Activity
    finish();
   }
  }); 
 }
}

(2)使用Bundle在Activity之间传递数据

例子如下:

public class BundleTest extends Activity
{
 @Override
 public void onCreate(Bundle savedInstanceState)
 {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);
  Button bn = (Button)findViewById(R.id.bn);
  bn.setOnClickListener(new OnClickListener()
  {
   @Override
   public void onClick(View v)
   {
    EditText name = (EditText)findViewById(R.id.name);
    EditText passwd = (EditText)findViewById(R.id.passwd);
    RadioButton male = (RadioButton)findViewById(R.id.male);
    String gender = male.isChecked() ? "男 " : "女";
    Person p = new Person(name.getText().toString()
     , passwd.getText().toString() , gender);
    //创建一个Bundle对象
    Bundle data = new Bundle();
    data.putSerializable("person", p);
    //创建一个Intent
    Intent intent = new Intent(BundleTest.this
     , ResultActivity.class);
    intent.putExtras(data);
    //启动intent对应的Activity
    startActivity(intent);
    
   }
  });  
 }
}

=====================================================================

public class ResultActivity extends Activity
{
 @Override
 public void onCreate(Bundle savedInstanceState)
 {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.result);
  TextView name = (TextView)findViewById(R.id.name);
  TextView passwd = (TextView)findViewById(R.id.passwd);
  TextView gender = (TextView)findViewById(R.id.gender);
  //获取启动该Result的Intent
  Intent intent = getIntent();
  //获取该intent所携带的数据
  Bundle data = intent.getExtras();
  //从Bundle数据包中取出数据
  Person p = (Person)data.getSerializable("person");
  name.setText("您的用户名为:" + p.getName());
  passwd.setText("您的密码为:" + p.getPass());
  gender.setText("您的性别为:" + p.getGender());
 }
}
======================================================================

public class Person implements Serializable
{
 
 private static final long serialVersionUID = 1L;
 
 private Integer id;
 private String name;
 private String pass;
 private String gender;

public Person()
 {
 } 
 
 
 public Person(String name, String pass, String gender)
 {
  this.name = name;
  this.pass = pass;
  this.gender = gender;
 }
 public Integer getId()
 {
  return id;
 }
 public void setId(Integer id)
 {
  this.id = id;
 }
 public String getName()
 {
  return name;
 }
 public void setName(String name)
 {
  this.name = name;
 }
 public String getPass()
 {
  return pass;
 }
 public void setPass(String pass)
 {
  this.pass = pass;
 }
 public String getGender()
 {
  return gender;
 }
 public void setGender(String gender)
 {
  this.gender = gender;
 }

}

(3)通过startActivityForResult(Intent intent,int requestCode)启动Activity并返回结果

例子如下:
public class ActivityForResult extends Activity
{
 Button bn;
 EditText city; 
 @Override
 public void onCreate(Bundle savedInstanceState)
 {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);
  //获取界面上的组件
  bn = (Button)findViewById(R.id.bn);
  city = (EditText)findViewById(R.id.city);
  //为按钮绑定事件监听器
  bn.setOnClickListener(new OnClickListener()
  {
   @Override
   public void onClick(View source)
   {
    //创建需要对应于目标Activity的Intent
    Intent intent = new Intent(ActivityForResult.this
     , SelectCityActivity.class);
    //启动指定Activity并等待返回的结果,其中0是请求码,用于标识该请求
    startActivityForResult(intent , 0);
   }
  });
 }
 //重写该方法,该方法以回调的方式来获取指定Activity返回的结果
 @Override
 public void onActivityResult(int requestCode , int resultCode
  , Intent intent)
 {
  //当requestCode、resultCode同时为0,也就是处理特定的结果
  if (requestCode == 0
   && resultCode == 0)
  {
   //取出Intent里的Extras数据
   Bundle data = intent.getExtras();
   //取出Bundle中的数据
   String resultCity = data.getString("city");
   //修改city文本框的内容
   city.setText(resultCity);
  }
 }
}
——————————————————————————————————

public class SelectCityActivity extends ExpandableListActivity
{
 //定义省份数组
 private String[] provinces = new String[]
 { "广东", "广西", "湖南"};
 private String[][] cities = new String[][]
 {
  { "广州", "深圳", "珠海", "中山" },
  { "桂林", "柳州", "南宁", "北海" },
  { "长沙", "岳阳" , "衡阳" , "株洲" }
 }; 
 public void onCreate(Bundle savedInstanceState)
 {
  super.onCreate(savedInstanceState);
  ExpandableListAdapter adapter = new BaseExpandableListAdapter()
  {
   //获取指定组位置、指定子列表项处的子列表项数据
   @Override
   public Object getChild(int groupPosition, int childPosition)
   {
    return cities[groupPosition][childPosition];
   }
   @Override
   public long getChildId(int groupPosition, int childPosition)
   {
    return childPosition;
   }
   @Override
   public int getChildrenCount(int groupPosition)
   {
    return cities[groupPosition].length;
   }
   private TextView getTextView()
   {
    AbsListView.LayoutParams lp = new AbsListView.LayoutParams(
      ViewGroup.LayoutParams.FILL_PARENT, 64);
    TextView textView = new TextView(SelectCityActivity.this);
    textView.setLayoutParams(lp);
    textView.setGravity(Gravity.CENTER_VERTICAL | Gravity.LEFT);
    textView.setPadding(36, 0, 0, 0);
    textView.setTextSize(20);
    return textView;
   }
   //该方法决定每个子选项的外观
   @Override
   public View getChildView(int groupPosition, int childPosition,
     boolean isLastChild, View convertView, ViewGroup parent)
   {
    TextView textView = getTextView();   
    textView.setText(getChild(groupPosition, childPosition).toString());
    return textView;
   }
   //获取指定组位置处的组数据
   @Override
   public Object getGroup(int groupPosition)
   {
    return provinces[groupPosition];
   }
   @Override
   public int getGroupCount()
   {
    return provinces.length;
   }
   @Override
   public long getGroupId(int groupPosition)
   {
    return groupPosition;
   }
   //该方法决定每个组选项的外观
   @Override
   public View getGroupView(int groupPosition, boolean isExpanded,
     View convertView, ViewGroup parent)
   {
    LinearLayout ll = new LinearLayout(SelectCityActivity.this);
    ll.setOrientation(0);
    ImageView logo = new ImageView(SelectCityActivity.this);
    ll.addView(logo);
    TextView textView = getTextView();
    textView.setText(getGroup(groupPosition).toString());    
    ll.addView(textView);   
    return ll;
   }
   @Override
   public boolean isChildSelectable(int groupPosition, int childPosition)
   {
    return true;
   }
   @Override
   public boolean hasStableIds()
   {
    return true;
   }
  };
  // 设置该窗口显示列表
  setListAdapter(adapter);
  getExpandableListView().setOnChildClickListener(
   new OnChildClickListener()
  {
   @Override
   public boolean onChildClick(ExpandableListView parent, View source,
    int groupPosition, int childPosition, long id)
   {
    //获取启动该Activity之前的Activity对应的Intent
    Intent intent = getIntent();
    Bundle data = new Bundle();
    data.putString("city" ,cities[groupPosition][childPosition]);
    intent.putExtras(data);
    // 设置该SelectActivity的结果码,并设置结束之后退回的Activity
    SelectCityActivity.this.setResult(0 , intent);
    //结束SelectCityActivity。
    SelectCityActivity.this.finish();
    return false;
   }
  });
 }
}

Intent、Bundle——实现Activity之间的通信的更多相关文章

  1. Activity之间的通信

    通常Activity之间的通信有三种方式:单向不传参数通信.单项传参数通信和双向通信. 这几种传递方式都需要通信使者Intent.以下将用代码来辅助理解. 1.单向不传递参数通信 public cla ...

  2. Android中BroadCast与Activity之间的通信

    在看本文之前,假设你对于Android的广播机制不是非常了解.建议先行阅读我转载的一篇博文:图解 Android 广播机制. 因为本案例比較简单,故直接在此贴出代码,不做过多的阐述. 先上效果截图: ...

  3. 【Android 应用开发】Activity生命周期 与 Activity 之间的通信

    一. Activity生命周期 上图 1. Activity状态 激活状态 : Activity出于前台 , 栈顶位置; 暂停状态 : 失去了焦点 , 但是用户仍然可以看到 , 比如弹出一个对话框 , ...

  4. Android中两个Activity之间简单通信

    在Android中,一个界面被称为一个activity,在两个界面之间通信,采用的是使用一个中间传话者(即Intent类)的模式,而不是直接通信. 下面演示如何实现两个activity之间的通信. 信 ...

  5. Activity生命周期 与 Activity 之间的通信

    一. Activity生命周期 上图 1. Activity状态 激活状态 : Activity出于前台 , 栈顶位置; 暂停状态 : 失去了焦点 , 但是用户仍然可以看到 , 比如弹出一个对话框 , ...

  6. Android系列之Fragment(三)----Fragment和Activity之间的通信(含接口回调)

    ​[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...

  7. Fragment的生命周期和Activity之间的通信以及使用

    Fragment通俗来讲就是碎片,不能单独存在,意思就是说必须依附于Activity,一般来说有两种方式把Fragment加到Activity,分为静态,动态. 静态即为右键单击,建立一个Fragme ...

  8. Android菜鸟的成长笔记(10)——使用Bundle在Activity之间传值

    原文:[置顶] Android菜鸟的成长笔记(10)——使用Bundle在Activity之间传值 前面我们了解了如何启动一个Activity,一个Activity在启动另外一个Activity的时候 ...

  9. Fragmen和Activity之间的通信--接口和实现的分离(转)

    Fragmen和Activity之间的通信--接口和实现的分离(转) 分类: Android平台     在平板的开发过程中通常都会采用多个Fragment的实现方式,通常有一个为list的Fragm ...

随机推荐

  1. Ubuntu14.0.4 64位安装Chrome浏览器

    下载链接:translate.google.com.hk/translate?hl=zh-CN&sl=en&u=http://95.31.35.30/chrome/pool/main/ ...

  2. 关于DLL模块导出函数

    当然以前我知道有一个.def文件的,里面写的都是需要导出的函数,以为与__declspec(dllexport)作用是一样的.但是今天看公司项目源码的时候才知道,它们两个导出方法是有一定的区别的,编译 ...

  3. zabbix 通过gateway 获取远程主机的JMX信息

    DBHost=192.168.32.55 DBName= zabbix DBUser=zabbixuser DBPassword=zabbixpass StartTrappers=20 MaxHous ...

  4. Linux下程序崩溃,ulimit,coredump,gdbserver

    操作系统:Ubuntu10.04 前言:    在程序崩溃后,如何快速定位问题.    以下方法适用于开发调试阶段,不太适用成品.    本文着眼于嵌入式,PC方面更简单.    核心:gdbserv ...

  5. UESTC_邱老师玩游戏 2015 UESTC Training for Dynamic Programming<Problem G>

    G - 邱老师玩游戏 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submi ...

  6. poj 2299 Ultra-QuickSort(归并排序或是bit 树+离散化皆可)

    题意:给一个数组,计算需要的冒泡排序的次数,元素个数很大,不能用n^2的冒泡排序计算. 解析:这题实际上就是求逆序对的个数,可以用归并排序的方法,我这里用另一种方法写,bit树+离散化.由于元素的值可 ...

  7. Unity 生命周期

    原文翻译:            Execution Order of Event Functions            事件函数的执行顺序                        Edit ...

  8. C# StreamReader/StreamWriter与FileStream用法详解

    http://www.360doc.com/content/13/0610/08/12579422_291878973.shtml

  9. Sybase配置数据库参数

    Sybase配置数据库参数参数配置的两种方法:sp_configure ‘参数名称’,参数值修改参数文件(如:Sybase主机上的 %SYBASE%\servername.cfg) 配置Sybase数 ...

  10. onvif规范的实现:成功实现ONVIF协议RTSP-Video-Stream与OnvifDeviceManager的视频对接

    有了前几篇的基础,现在可以正式开始onvif的实现工作,其中一项非常重要的部分就是视频流的对接,即能够在符合onvif标准的监控客户端软件里接收到设备端NVT发来的RTSP视频流.这里,我所用的客户端 ...