一个程序可以有不只一个Activity,现在我们创建另一个Activity。首先新建一个class,它必须是android.app.Activity的子类:
- package tommy.myandroid;
- import android.app.Activity;
- import android.os.Bundle;
- public class BeautyActivity extends Activity {
- /** Called when the activity is first created. */
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.beauty);
- }
- }
setContentView里的参数是R.layout.beauty,对应的是一个layout资源beauty.xml:
- <?xml version="1.0" encoding="utf-8"?>
- <ListView
- xmlns:android=""
- android:id="@+id/my_list_view"
- android:orientation="vertical"
- android:layout_width="match_parent"
- android:layout_height="match_parent">
- </ListView>
Activity类建好了,layout资源也定制好了。接下来要做的是在manifest文件里注册这个Activity:
- <?xml version="1.0" encoding="utf-8"?>
- <manifest xmlns:android=""
- package="tommy.myandroid"
- android:versionCode="1"
- android:versionName="1.0">
- <uses-sdk android:minSdkVersion="10" />
- <application android:icon="@drawable/icon" android:label="@string/app_name">
- <activity android:name=".MyAndroid2_3_3Activity"
- android:label="@string/app_name">
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <category android:name="android.intent.category.LAUNCHER" />
- </intent-filter>
- </activity>
- <activity android:name=".BeautyActivity"
- android:label="Beaulty Activity">
- <intent-filter>
- <action android:name="anyone.anything.beauty" />
- <category android:name="android.intent.category.DEFAULT" />
- </intent-filter>
- </activity>
- </application>
- </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。
- // MyAndroid2_3_3Activity.onCreate
- TextView tv = (TextView)findViewById(R.id.my_text_view);
- tv.setOnClickListener(new OnClickListener(){
- @Override
- public void onClick(View arg0) {
- Intent i = new Intent();
- // i.setAction("anyone.anything.beauty"); // implicit intent
- i.setClassName("tommy.myandroid", "tommy.myandroid.BeautyActivity"); // explicit intent
- startActivity(i);
- }
- });
运行程序后可以发现beauty activity在两种方式下都被正确地调用了。
现在有个问题,怎么向beauty activity传递数据?Intent对象可以通过putExtra方法添加参数信息:
- tv.setOnClickListener(new OnClickListener(){
- @Override
- public void onClick(View arg0) {
- Intent i = new Intent();
- i.setAction("anyone.anything.beauty");
- //i.setClassName("tommy.myandroid", "tommy.myandroid.BeautyActivity");
- i.putExtra("myKey", "myValue");
- startActivity(i);
- }
- });
在beauty activity的onCreate方法里,可以得到这些附加的参数:
- // BeautyActivity.onCreate
- String extraValue = getIntent().getExtras().getString("myKey");
接下来就是从beauty activity得到返回值了。startActivity方法是以异步的方式启动一个activity,在启动后这个方法会马上返回。而startActivityForResult方法是同步的,它要一直等到被启动的activity退出后才会返回,类似于模态对话框。
首先在MyAndroid2_3_3Activity里用startActivityForResult代替startActivity:
- tv.setOnClickListener(new OnClickListener(){
- @Override
- public void onClick(View arg0) {
- Intent i = new Intent();
- i.setAction("anyone.anything.beauty");
- startActivity(i, myRequestId); // requestId is int
- }
- });
在beauty activity这边,在activity结束之前,通过setResult方法来设置返回值:
- // BeautyActivity
- setResult(RESULT_OK);
返回值可以是RESULT_OK、RESULT_CANCEL,也可以是自定义值如RESULT_FIRST_USER,或者RESULT_FIRST_USER+1等。
回到MyAndroid2_3_3Activity类里面,override父类的onActivityResult:
- public class MyAndroid2_3_3Activity extends Activity {
- private final int myRequestId = 1;
- // ... omit onCreate method
- @Override
- public void onActivityResult(int requestCode, int resultCode, Intent data) {
- if (requestCode == myRequestId && resultCode == RESULT_OK)
- Toast.makeText(this, "Returned!!", Toast.LENGTH_SHORT).show();
- }
- }
onActivityResult里有三个参数,第三个参数来自beauty activity的setResult方法。setResult方法第二个参数可以传递一个intent。如果不传递的话,onActivityResult会得到一个值为null的intent。
阅读(1697) | 评论(0) | 转发(0) |