【Android】Activicy 简介

一.  Activity 生命周期

参考指导文档: https://developer.android.com/guide/components/activities/activity-lifecycleicon-default.png?t=LA92https://developer.android.com/guide/components/activities/activity-lifecycle

为了在 Activity 生命周期的各个阶段之间导航转换,Activity 类提供六个核心回调:onCreate()、onStart()、onResume()、onPause()、onStop() 和 onDestroy()。当 Activity 进入新状态时,系统会调用其中每个回调。

 

二. 启动一个 Activity 并返回结果 

参数指导文档:

https://developer.android.com/training/basics/intents/result#javaicon-default.png?t=LA92https://developer.android.com/training/basics/intents/result#java在 Activity1 中调用 startActivityForResult(Intent, requestCode) 来启动 Activity2,并 重载 onActivityResult(int requestCode, int resultCode, Intent data) 来获得 Activity2 返回的结果 。requestCode 是本次请求的标志,当有多个 startActivityForResult 请求时,传入不同的 requestCode 可以用来区分其各自的回调。

在 Activity2 中,通过 setResult(requestCode, Intent) 将结果返回到 Activity1。

// Activity1
public class MainActivity extends AppCompatActivity {
    // requestCode 
    private final static int REQUEST_CODE = 0;

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

    public void start(View view) {
        Intent intent = new Intent(this, SecondActivity.class);
        // 启动 Activity2
        startActivityForResult(intent, REQUEST_CODE);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        // 对比 requestCode,以确认回调
        if (requestCode == REQUEST_CODE) {
            // 获取结果
            String name = data.getStringExtra("name");
            Log.i("test", name);
        }
    }
}

// Activity2
public class SecondActivity extends AppCompatActivity {
    // requestCode 
    private final static int REQUEST_CODE = 0;

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

    // 这是某个 button 的响应函数
    public void finish2(View view) {
        Intent intent = getIntent();
        intent.putExtra("name", "tom");
        // 将值通过 intent 传递到 Activity1
        setResult(REQUEST_CODE, intent);
        finish();
    }
}

三. 保存 Activity 状态

参考指导文档:

https://developer.android.com/guide/components/activities/activity-lifecycle?hl=zh-cnicon-default.png?t=LA92https://developer.android.com/guide/components/activities/activity-lifecycle?hl=zh-cn

1. 使用 onSaveInstanceState() 保存简单轻量的界面状态

当您的 Activity 开始停止时,系统会调用 onSaveInstanceState() 方法,以便您的 Activity 可以将状态信息保存到实例状态 Bundle 中。此方法的默认实现保存有关 Activity 视图层次结构状态的瞬时信息,例如 EditText 微件中的文本或 ListView 微件的滚动位置。

如需保存 Activity 的其他实例状态信息,您必须替换 onSaveInstanceState(),并将键值对添加到您的 Activity 意外销毁时事件中所保存的 Bundle 对象中。替换 onSaveInstanceState() 时,如果您希望默认实现保存视图层次结构的状态,必须调用父类实现。

2. 使用保存的实例状态恢复 Activity 界面状态

重建先前被销毁的 Activity 后,您可以从系统传递给 Activity 的 Bundle 中恢复保存的实例状态。onCreate() 和 onRestoreInstanceState() 回调方法均会收到包含实例状态信息的相同 Bundle。

因为无论系统是新建 Activity 实例还是重新创建之前的实例,都会调用 onCreate() 方法,所以在尝试读取之前,您必须检查状态 Bundle 是否为 null。如果为 null,系统将新建 Activity 实例,而不会恢复之前销毁的实例。

如下代码实例,演示 Activity1 跳转到 Activity2 之前保存状态到 Bundle 对象中,然后从 Activity2 返回后,从 Bundle 对象读回状态:

// Activity1 
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // 方法1: onCreate 中判断 Bundle 对象是否为空,不为空取出其内容
        if (savedInstanceState != null) {
            String score = savedInstanceState.getString("SCORE");
            Log.i("test", score);
        }
    }

    // 这是一个 Button 的 onlick 事件回调
    public void start(View view) {
        Intent intent = new Intent(this, SecondActivity.class);
        startActivity(intent);
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        Log.i("test", "onSaveInstanceState");
        outState.putString("SCORE","10000");
    }

    // 方法2: 重载 onRestoreInstanceState 方法取出 Bundle 对象中的状态
    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        Log.i("test", "onRestoreInstanceState");
        if (savedInstanceState != null) {
            String score = savedInstanceState.getString("SCORE");
            Log.i("test", score);
        }
    }
}

// Activity2 不用任何操作,只是用于辅助切换 Activity1
public class SecondActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
    }
}

 四.  Activity 之间传值

// Activity1 将值传到 Activity2
public class MainActivity extends AppCompatActivity {
    /*
    1.使用intent在两个Activity之间传值
    2.Intent的putXXX和getXXX方法
    3.Bundle对象
    4.如何传递基本数据
    5.如何传递字符串集合
    6.如何传递对象
    7.如何传递对象集合
    */

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

    public void start(View view){
        Intent intent = new Intent(this, SecondActivity.class);

        // 1. 基本数据类型
        intent.putExtra("int", 100);
        intent.putExtra("string", "hello");

        // 2. 字符串集合
        ArrayList<String> list1 = new ArrayList<String>();
        list1.add("one");
        list1.add("two");
        intent.putStringArrayListExtra("stringlist",list1);

        // 3. 传递对象
        intent.putExtra("person", new Person(1, "tom", 20));

        // 4. 传递一个集合
        Pet pet1 = new Pet(1, "hua hua");
        Pet pet2 = new Pet(2, "ha ha");
        ArrayList<Pet> list2 = new ArrayList<Pet>();
        list2.add(pet1);
        list2.add(pet2);
        intent.putParcelableArrayListExtra("list2",list2);
		
		// 启动另一个 Activity,触妆传值
        startActivity(intent);
    }
}

// Activity2 onCreate() 中取出值 
public class SecondActivity extends AppCompatActivity {

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

        Intent intent = getIntent();

        int i = intent.getIntExtra("int", 0);
        String str = intent.getStringExtra("string");
        ArrayList<String> list1 = intent.getStringArrayListExtra("stringlist");
        Person per = (Person)intent.getSerializableExtra("person");
        ArrayList<Pet> list2 = intent.getParcelableArrayListExtra("list2");

        Log.i("test", "int:"+i);
        Log.i("test", "string:"+str);
        Log.i("test", "stringlist:"+list1);
        Log.i("test", "person:"+per);
        Log.i("test", "list2:"+list2);
    }
}

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值