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);
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();
}
});
}
}
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");
返回栈
Android是使用任务(Task)来管理活动的,一个任务就是一组存放在栈里的集合,这个栈被称作是返回栈(Back Stack)。栈是后进先出的数据结构,当我们启动一个新的活动,它会在返回栈中入栈,并处于栈顶位置,当我们按下back键以及调用finish()方法去销毁一个活动时,该活动出栈,前一个活动处于栈顶。
栈操作如下图:
活动的生存期
上图是官网的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);
}
}