Intent启动活动以及Intent传递数据&activity的生命周期

Intent启动活动以及Intent传递数据&activity的生命周期

1.Intent启动活动

  • 显示启动
Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
startActivity(intent);
  • 使用隐式Intent

    在配置文件中指定字符串action和category等信息。

//可以启动到匹配该字符串的activity
Intent intent = new Intent("com.example.activitytest.MY_CATEGORY");
startActivity(intent);
  • startActivityForResult用法详解
    在实现登录功能时,我们在“我的订单的页面”点击登录,跳转到“登录”页面。等到“登录”页面finish()后,跳回订单页面调用onActivityResult(),在方法内处理上一个activity返回的信息。
      如果想在Activity中得到新打开Activity 关闭后返回的数据,需要使用系统提供的startActivityForResult(Intent intent, int requestCode)方法打开新的Activity,新的Activity 关闭后会向前面的Activity传回数据,为了得到传回的数据,必须在前面的Activity中重写onActivityResult(int requestCode, int resultCode, Intent data)方法。
      
package com.ljq.activitys;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;

public class MainActivity extends Activity {
    private final static String TAG="MainActivity";

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        Button btnOpen=(Button)this.findViewById(R.id.btnOpen);
        btnOpen.setOnClickListener(new View.OnClickListener(){
            public void onClick(View v) {
                //得到新打开Activity关闭后返回的数据
                //第二个参数为请求码,可以根据业务需求自己编号
                startActivityForResult(new Intent(MainActivity.this, OtherActivity.class), 1);
            }
        });
    }

    /** * 为了得到传回的数据,必须在前面的Activity中(指MainActivity类)重写onActivityResult方法 * * requestCode 请求码,即调用startActivityForResult()传递过去的值 * resultCode 结果码,结果码用于标识返回数据来自哪个新Activity */
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        String result = data.getExtras().getString("result");//得到新Activity 关闭后返回的数据
        Log.i(TAG, result);
    }
}

  当新Activity关闭后,新Activity返回的数据通过Intent进行传递,android平台会调用前面Activity 的onActivityResult()方法,把存放了返回数据的Intent作为第三个输入参数传入,在onActivityResult()方法中使用第三个输入参数可以取出新Activity返回的数据。

使用startActivityForResult(Intent intent, int requestCode)方法打开新的Activity,新Activity关闭前需要向前面的Activity返回数据需要使用系统提供的setResult(int resultCode, Intent data)方法实现:

package com.ljq.activitys;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class OtherActivity extends Activity {

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

        Button btnClose=(Button)findViewById(R.id.btnClose);
        btnClose.setOnClickListener(new View.OnClickListener(){
            public void onClick(View v) {
                //数据是使用Intent返回
                Intent intent = new Intent();
                //把返回数据存入Intent
                intent.putExtra("result", "My name is linjiqin");
                //设置返回数据,RESULT_OK是系统定义个一个常量,值为-1
                OtherActivity.this.setResult(RESULT_OK, intent);
                //关闭Activity
                OtherActivity.this.finish();
            }
        });

    }

}

2.用Intent传递数据

Intent提供了一系列putExtra()方法的重载,可以把我们想要传递的数据存在在Intent中:
Intent可以传基本数据类型,还可以传自己封装好的数据类型(类)。

//通过适配器调用getItem得到Item的信息
 Wares wares = mAdatper.getItem(position);
//通过Intent跳转到另一个界面
 Intent intent = new Intent(getContext(), WareDetailActivity.class);
//将点击事件的(Serializable)对象传入intent
intent.putExtra(Constants.WARE_ID,wares);

//传基本数据类型
String data = "Hello";
intent.putExtra("extra_data",data);
 startActivity(intent);

从Intent中得到数据


        Serializable serializable = getIntent().getSerializableExtra(Constants.WARE_ID);
        //如果serializable为空,则直接杀死此activity
        if (serializable ==null)
            this.finish();
        wares = (Wares) serializable;

        String data = getIntent().getStringExtra("extra_data");

3.activity的生命周期

  1. 返回栈
    Android是使用任务(Task)来管理活动的,一个任务就是一组存放在栈里的集合,这个栈被称作是返回栈(Back Stack)。栈是后进先出的数据结构,当我们启动一个新的活动,它会在返回栈中入栈,并处于栈顶位置,当我们按下back键以及调用finish()方法去销毁一个活动时,该活动出栈,前一个活动处于栈顶。
    栈操作如下图:
    Intent启动活动以及Intent传递数据&activity的生命周期_第1张图片

  2. 活动的生存期
    Intent启动活动以及Intent传递数据&activity的生命周期_第2张图片
    上图是官网的activity_lifecycle图
    每个活动在生命周期中最多可能有四种状态:
    1).运行状态,处于栈顶。刚刚创建时onCreate()->onStart()->onResume();
    我们在onCreate()方法中加载布局、绑定事件。

    2).暂停状态,不处于栈顶,但是栈顶活动为对话框形式。onResume()->onPause()。

    3).停止状态,不处于栈顶,且完全不可见。onPause()->onStop().系统仍然会保存相应地状态和成员变量

    4).销毁状态,调用onDestroy().把activity从返回栈中移除。

    1.首先打开一个新的activity时,系统调用:

onCreate() -> onStart() -> onResume() 然后开始running

   2.当调用一个对话框activity时,系统调用:

onResume() -> onPause()

  3.当产生新的activity时,原activity处于不可见状态:

onResume() -> onPause() -> onStop()

  4.如果用户按下navigation按钮或是back,回到处于栈顶的activity被finish().我们研究的activity处于下面的生命周期:

onRestart() -> onStart() -> onResume() 然后重新running

在activity结束(调用finish ())或是被系统杀死之前会调用onDestroy()方法释放所有占用的资源。以下是activity生命周期中三个嵌套的循环:

1.activity的完整生存期会在 onCreate() 调用和 onDestroy() 调用之间发生。 

2.activity的可见生存期会在 onStart() 调用和 onStop() 调用之间发生。系统会在activity的整个生存期内多次调用 onStart() 和onStop(), 因为activity可能会在显示和隐藏之间不断地来回切换。 

3.activity的前后台切换会在 onResume() 调用和 onPause() 之间发生。 因为这个状态可能会经常发生转换,为了避免切换迟缓引起的用户等待,这两个方法中的代码应该相当地轻量化。

3. activity被回收时状态和信息的保存与恢复
这个知识点暂时用的不多,等用多了再来编辑。

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        if(savedInstanceState!=null){ //判断是否有以前的保存状态信息
             savedInstanceState.get("Key"); 
             }
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
   @Override
protected void onSaveInstanceState(Bundle outState) {
    // TODO Auto-generated method stub
     //可能被回收内存前保存状态和信息,
       Bundle data = new Bundle(); 
       data.putString("key", "last words before be kill");
       outState.putAll(data);
    super.onSaveInstanceState(outState);
}
   @Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
       if(savedInstanceState!=null){ //判断是否有以前的保存状态信息
             savedInstanceState.get("Key"); 
             }
    super.onRestoreInstanceState(savedInstanceState);
}
}

你可能感兴趣的:(android,Activity,intent)