Android核心基础-8.Android四大组件之Activity-2.关闭、传递数据

8.2.1 关闭Activity

系统提供了finish()来关闭Activity,我们按back键就调用了该方法关闭Activity。但是一般应用的主界面不会一按back键就关闭,所以我们要重写finish();

  • 方法一:弹出确认对话框
  • 方法二:弹出一个吐司
@Override
public void finish() { // 重写finish(), 在退出的时候弹出对话框

    //方法一、
//      new AlertDialog.Builder(this).setTitle("确定要退出吗?").setPositiveButton("确定", new OnClickListener() {
//
//          @Override
//          public void onClick(DialogInterface dialog, int which) {
//              MainActivity.super.finish(); // 如果点击确定按钮, 执行父类的finish(), 真正退出
//          }
//      }).setNegativeButton("取消", null).show();

    //方法二、
    if (System.currentTimeMillis() - previous < 1000) {
        super.finish();
    } else {
        previous = System.currentTimeMillis();
        Toast.makeText(getApplicationContext(), "再按一次退出", Toast.LENGTH_SHORT).show();
    }
}

注意:Builder是AlertDialog的内部类,所以不能直接super.finish();而要MainActivity.super.finish();才能将当前MainActivity关闭。

8.2.2 传递数据

8.2.2.1 启动时传递数据

  • Intent可以使用putExtra()方法装入数据(键值对)
  • 新Activity中getIntent()之后, 可以调用getStringExtra(), getIntExt()获取数据
  • 可传递数据类型: 基本数据类型, String, Bundle, Serializable, Parcelable
//1.基本数组类型
public void sendData(View v) {
    Intent intent = new Intent(this, OtherActivity.class);
    intent.putExtra("name", "张三"); // 向Intent中装入数据, String
    intent.putExtra("age", 21); // 基本数据类型及数组
    startActivity(intent); // 启动Activity, Intent会把数据携带过去
}
//1.接收
Intent intent = getIntent();
String name = intent.getStringExtra("name");
int age = intent.getIntExtra("age",20);//指定一个默认值

//2.传递自定义对象
// 可以序列化(把Object转为byte[])
Person person = new Person("李四",22);
intent.putExtra("p",person);//如果需要传输自定义对象,该类必须实现Serializable接口Public class Person implements Serializable{...}也可以传递集合,集合默认都实现了该接口,但其传递的对象都必须实现该接口:如ArrayList<Person>
//2.接收
Person p = (Person)intent.getSerializableExtra("p");

//3.传递一个Bundle
Bundle bundle = new Bundle();
bundle.putString("name","王五");//传递一个Bundle(其就是一个Map集合)
bundle.putInt("age",22);
intent.putExtra("bundle",bundle);
//3.接收
Bundle bundle = intent.getBundleExtra("bundle");
String name = bundle.getString("name");
int age = bundle.getInt("age");

//4.传递自定义对象
Person person = new Person("李四",22);
intent.putExtra("p",person);//person要实现Parcelable接口,其要实现的方法
->
@Override
public int describeContents() {
    return 0;
}

@Override
public void writeToParcel(Parcel parcel, int flags) {   // 定义怎么把Person对象写入Parcel
    parcel.writeString(name);
    parcel.writeInt(age);
}

public static final Parcelable.Creator<Person> CREATOR = new Parcelable.Creator<Person>() {     // 用来从Parcel中获取Person
    public Person createFromParcel(Parcel parcel) {     // 定义怎么从Parcel中获取数据, 创建Person
        return new Person(parcel.readString(), parcel.readInt());
    }
    public Person[] newArray(int size) {
        return new Person[size];
    }
};
//具体写法,可以参考Android系统的android.graphics.Point(之所以推荐看这个,因为这个类就x,y两个字段)
// Parcelable在绑定服务的时候有用
//4.接收
Person p = intent.getParcelableExtra("p");

//实现Serializable接口时一般会给类定义一个版本号,当类要被反序列化时,返回到对应的版本号的类版本
private static final long serialVersionUID = 1L;

进程之间可传递数据的:1.序列化;2.邮包
Activity有可能跨进程传递数据,可用:1.序列化Serializable;2.邮包Parcelable
绑定服务必须用邮包;Service只能用1.邮包Parcelable

8.2.2.2 关闭时返回数据

  • 如果希望新的Activity可以返回数据, 那么就需要使用startActivityForResult()方法来启动Activity
  • 在新的Activity中调用setReuslt()方法设置要返回的数据
  • finish()之后, 原Activity会自动调用onActivityResult(), 该方法的形参就是setReuslt()设置的数据

发送数据到OtherActivity

public void getResult100(View v) {
    Intent intent = new Intent(this, OtherActivity.class);
    Person p = new Person("李四", 22);
    intent.putExtra("p", p);
    startActivityForResult(intent, 100); // 1.启动新的Activity, 并等待结果
}

public void getResult101(View v) {
    Intent intent = new Intent(this, OtherActivity.class);
    Person p = new Person("李四", 22);
    intent.putExtra("p", p);
    startActivityForResult(intent, 101); // 1.启动新的Activity, 并等待结果
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent intent) { // 3.这个方法会在新Activity关闭后执行
    String name = intent.getStringExtra("name");
    int age = intent.getIntExtra("age", -1);
    TextView mainTV = (TextView) findViewById(R.id.mainTV);
    mainTV.setText(name + ": " + age);

    /*
     * requestCode: 代表从哪里启动的Activity 
     * resultCode: 代表哪个Activity关闭之后返回的数据
     */
    Toast.makeText(getApplicationContext(), requestCode + ", " + resultCode, Toast.LENGTH_SHORT).show();
}

OtherActivity调用finish关闭时返回数据给MainActivity

public class OtherActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_other);

        Intent intent = getIntent();                    // 获取Intent

        Person p = intent.getParcelableExtra("p");

        intent.putExtra("name", "赵六");
        intent.putExtra("age", 24);
        setResult(200, intent);     // 2.设置结果数据, 在finish()之后, 结果数据就会传递到onActivityResult()方法
    }

    public void close(View v) {
        finish();   
    }
}

示例源码->百度网盘

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值