Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1736517
  • 博文数量: 438
  • 博客积分: 9799
  • 博客等级: 中将
  • 技术积分: 6092
  • 用 户 组: 普通用户
  • 注册时间: 2012-03-25 17:25
文章分类

全部博文(438)

文章存档

2019年(1)

2013年(8)

2012年(429)

分类: 嵌入式

2012-03-25 21:11:05

一个程序可以有不只一个Activity,现在我们创建另一个Activity。首先新建一个class,它必须是android.app.Activity的子类:


  1. package tommy.myandroid;

  2. import android.app.Activity;
  3. import android.os.Bundle;

  4. public class BeautyActivity extends Activity {
  5.     /** Called when the activity is first created. */
  6.     @Override
  7.     public void onCreate(Bundle savedInstanceState) {
  8.         super.onCreate(savedInstanceState);
  9.         setContentView(R.layout.beauty);
  10.     }
  11. }

setContentView里的参数是R.layout.beauty,对应的是一个layout资源beauty.xml:
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <ListView
  3.   xmlns:android=""
  4.   android:id="@+id/my_list_view"
  5.   android:orientation="vertical"
  6.   android:layout_width="match_parent"
  7.   android:layout_height="match_parent">
  8. </ListView>

Activity类建好了,layout资源也定制好了。接下来要做的是在manifest文件里注册这个Activity:
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifest xmlns:android=""
  3.       package="tommy.myandroid"
  4.       android:versionCode="1"
  5.       android:versionName="1.0">
  6.     <uses-sdk android:minSdkVersion="10" />

  7.     <application android:icon="@drawable/icon" android:label="@string/app_name">
  8.         <activity android:name=".MyAndroid2_3_3Activity"
  9.                   android:label="@string/app_name">
  10.             <intent-filter>
  11.                 <action android:name="android.intent.action.MAIN" />
  12.                 <category android:name="android.intent.category.LAUNCHER" />
  13.             </intent-filter>
  14.         </activity>
  15.         <activity android:name=".BeautyActivity"
  16.                   android:label="Beaulty Activity">
  17.             <intent-filter>
  18.                 <action android:name="anyone.anything.beauty" />
  19.                 <category android:name="android.intent.category.DEFAULT" />
  20.             </intent-filter>
  21.         </activity>
  22.     </application>
  23. </manifest>

看到application结点下面添加了一个新的“Activity”结点,它的android:name属性是“.”加上activity的类名,android:label是程序运行时显示在屏幕上的title。intent-filter向系统注册了它所感兴趣的请求,intent-filter里的action和category都是必须的。action可以是任意字符串,只要保证其唯一性,category需要定义为DEFAULT,否则不能接受implicit intent(待会介绍)。回过头来再看MyAndroid2_3_3Activity的intent-filter。因为它是这个主程的入口点,所以它的action为MAIN同时它的category为LAUNCHER。Android类是没有main函数的,而是通过manifest来定义程序的入口。

目前为止这个BeautyActivity已经创建好了,现在就可以从MyAndroid2_3_3Activity里来启动这个activity了。启动的方式有两种,一种是显示的(指定activity的包名和类名),另一种是隐式的(只给定action的名称)。

在MyAndroid2_3_3Activity.onCreate方法里,给text view加上一个on click listener,当这个text view被点击时,调用startActivity来启动beauty activity。


  1. // MyAndroid2_3_3Activity.onCreate
  2. TextView tv = (TextView)findViewById(R.id.my_text_view);
  3. tv.setOnClickListener(new OnClickListener(){
  4.     @Override
  5.     public void onClick(View arg0) {
  6.         Intent i = new Intent();
  7.         // i.setAction("anyone.anything.beauty"); // implicit intent
  8.         i.setClassName("tommy.myandroid", "tommy.myandroid.BeautyActivity"); // explicit intent
  9.         startActivity(i);
  10.     }
  11. });

运行程序后可以发现beauty activity在两种方式下都被正确地调用了。

现在有个问题,怎么向beauty activity传递数据?Intent对象可以通过putExtra方法添加参数信息:


  1. tv.setOnClickListener(new OnClickListener(){
  2.     @Override
  3.     public void onClick(View arg0) {
  4.         Intent i = new Intent();
  5.         i.setAction("anyone.anything.beauty");
  6.         //i.setClassName("tommy.myandroid", "tommy.myandroid.BeautyActivity");
  7.         i.putExtra("myKey", "myValue");
  8.         startActivity(i);
  9.     }
  10. });

在beauty activity的onCreate方法里,可以得到这些附加的参数:
  1. // BeautyActivity.onCreate
  2. String extraValue = getIntent().getExtras().getString("myKey");


接下来就是从beauty activity得到返回值了。startActivity方法是以异步的方式启动一个activity,在启动后这个方法会马上返回。而startActivityForResult方法是同步的,它要一直等到被启动的activity退出后才会返回,类似于模态对话框。

首先在MyAndroid2_3_3Activity里用startActivityForResult代替startActivity:


  1. tv.setOnClickListener(new OnClickListener(){
  2.     @Override
  3.     public void onClick(View arg0) {
  4.         Intent i = new Intent();
  5.         i.setAction("anyone.anything.beauty");
  6.         startActivity(i, myRequestId); // requestId is int
  7.     }
  8. });

在beauty activity这边,在activity结束之前,通过setResult方法来设置返回值:
  1. // BeautyActivity
  2. setResult(RESULT_OK);

返回值可以是RESULT_OK、RESULT_CANCEL,也可以是自定义值如RESULT_FIRST_USER,或者RESULT_FIRST_USER+1等。

回到MyAndroid2_3_3Activity类里面,override父类的onActivityResult:


  1. public class MyAndroid2_3_3Activity extends Activity {
  2.     private final int myRequestId = 1;

  3.     // ... omit onCreate method

  4.     @Override
  5.     public void onActivityResult(int requestCode, int resultCode, Intent data) {
  6.         if (requestCode == myRequestId && resultCode == RESULT_OK)
  7.          Toast.makeText(this, "Returned!!", Toast.LENGTH_SHORT).show();
  8.     }
  9. }

onActivityResult里有三个参数,第三个参数来自beauty activity的setResult方法。setResult方法第二个参数可以传递一个intent。如果不传递的话,onActivityResult会得到一个值为null的intent。
阅读(1639) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~