启动Activity有两种方式:
1)startActivity
2)startActivityForResult
方式1,启动后不关心activity返回的结果
方式2,启动后可以接收activity返回的结果,接收结果需要在onActivityResult函数中处理。
下面我们来看下这个函数
protected void onActivityResult(int requestCode, int resultCode, Intent data)
第一个参数是请求码,自己传过去的,可以是任意的int类型的值;
第二个参数是结果码,返回结果时返回的状态码,可以是任意的int类型的值;
第三个参数是返回的数据,数据,默认数据是通过Intent传输的。有了Intent就可以拿到返回的数据。
在启动之后的Activity中获取传递的Intent,Intent intent = getIntent();
下面通过一个demo来演示下两种启动Activity的方式,其中第二种方式中启动时传递了参数,启动后的Activity在返回时返回了数据,demo中将传递的数据和返回的数据及请求码和返回码均以日志的方式进行了打印。
demo讲解:
1)主Activity使用了ListActivity,加了两行数据,分别显示:“启动Activity不传参数不返回数据” 和 "启动Activity传参数并返回数据"
代码如下:
import android.app.ListActivity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;
/**
* Created by wangwentao on 2017/2/20.
*/
public class StartActivitySelActivity extends ListActivity {
private static final String TAG = "StartActivitySelActivit";
public final static int REQUEST_CODE = 1;
public final static int RESULT_CODE = 2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//1.数据源
String[] data = {"启动Activity不传参数不返回数据","启动Activity传参数并返回数据"};
//2.适配器
@SuppressWarnings("unchecked")
ArrayAdapter arrayAdapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, data);
//3.绑定
setListAdapter(arrayAdapter);
}
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
super.onListItemClick(l, v, position, id);
if (0 == id){//启动Activity不传参数不返回数据
startActivity(new Intent(StartActivitySelActivity.this, NoParamsActivity.class));
}else if(1 == id){//启动Activity传参数并返回数据
Intent intent = new Intent();
intent.putExtra("name_data","小明");
intent.putExtra("age_data",25);
intent.setClass(StartActivitySelActivity.this, ForResultActivity.class);
startActivityForResult(intent,REQUEST_CODE);
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
Log.i(TAG, "onActivityResult: requestCode="+requestCode+";resultCode="+resultCode);
if(requestCode == REQUEST_CODE && resultCode == RESULT_CODE){
String strName = data.getStringExtra("return_name");
int nAge = data.getIntExtra("return_age",0);
Log.i(TAG, "返回数据: return_name="+strName+";return_age="+nAge);
Toast.makeText(StartActivitySelActivity.this,"返回数据:姓名:"+strName+"; 年龄:"+nAge,Toast.LENGTH_SHORT).show();
}
}
}
2)第一种方式启动后是一个Activity,界面中只有两个控件:文本控件和按钮,文本控件提示"启动Activity不传参数不返回数据",按钮用于返回上一个Activity
第一种方式跳转的界面的布局文件activity_no_params.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/activity_no_params"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/id_tv_tip"
android:layout_marginTop="20dp"
android:textAllCaps="false"
android:gravity="center"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="启动Activity不传参数不返回数据"/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="btnOnClick"
android:text="返回"/>
</LinearLayout>
第一种方式跳转后的Activity的代码:
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import com.mobile.cdtx.blog.R;
public class NoParamsActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_no_params);
}
//返回按钮点击事件
public void btnOnClick(View v){
this.finish();
}
}
3)第二种方式跳转的界面的布局activity_for_result.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/activity_for_result"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:id="@+id/id_btn_get"
android:layout_marginTop="10dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="获取传递的数据"/>
<Button
android:id="@+id/id_btn_finish"
android:layout_marginTop="10dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="回传数据并结束"/>
<TextView
android:id="@+id/id_tv_text"
android:layout_marginTop="10dp"
android:gravity="center"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="展示传递的参数"/>
</LinearLayout>
第二种方式跳转的Activity的代码
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import com.mobile.cdtx.blog.R;
public class ForResultActivity extends AppCompatActivity implements View.OnClickListener{
public final static int RESULT_CODE = 2;
Button btnGet,btnFinish;
TextView tvText;
private String strName;
int nAge;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_for_result);
//控件初始化
initView();
//解析传递的参数
Intent intent = getIntent();
strName = intent.getStringExtra("name_data");
nAge = intent.getIntExtra("age_data",0);
}
//控件的初始化
private void initView(){
btnGet = (Button)findViewById(R.id.id_btn_get);
btnFinish = (Button)findViewById(R.id.id_btn_finish);
tvText = (TextView)findViewById(R.id.id_tv_text);
btnGet.setOnClickListener(this);
btnFinish.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.id_btn_get:
showParam();
break;
case R.id.id_btn_finish:
finishActivity();
break;
default:
break;
}
}
//提示传递的参数
private void showParam(){
String strText = "收到的参数:name_data="+strName+";age_data="+nAge;
tvText.setText(strText);
}
//回传数据并结束
private void finishActivity(){
Intent intent = new Intent();
intent.putExtra("return_name","张三");
intent.putExtra("return_age",12);
this.setResult(RESULT_CODE,intent);
this.finish();
}
}
效果图
4)打印的日志如下:
02-20 10:01:36.697 10362-10362/com.mobile.cdtx.blog I/StartActivitySelActivit: onActivityResult: requestCode=1;resultCode=2
02-20 10:01:36.697 10362-10362/com.mobile.cdtx.blog I/StartActivitySelActivit: 返回数据: return_name=张三;return_age=12