目的:
1.Activity的启动模式有哪几种,分别用于什么场景?
2.清晰地描述下onNewIntent和onConfigurationChanged这两个生命周期方法的场景
从事Android的朋友都知道activity是什么,activity的启动方式。
activity的启动方式有四种:
1.standard
2.singleTop
3.singleTask
4.singlestance
下面一一介绍这四种启动模式的特点和应用场景:
那怎么配置其启动模式呢?
就是直接在AndroidManifest.xml配置的activity节点里配置:android:launchMode="xxxxx"即可,如下图所示:
1.standard
首先在布局界面的添加一个按钮和一个textview,按钮用来做点击跳转事件,textview用来显示当前activity实例的序号
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.nova.startupdemo.MainActivity">
<TextView
android:id="@+id/tv_taskid"
android:layout_width="match_parent"
android:layout_height="40dp"
android:layout_centerInParent="true"
android:gravity="center"
/>
<Button
android:id="@+id/btn_gomain"
android:layout_width="200dp"
android:layout_height="wrap_content"
android:text="跳转MainActivity"
android:layout_below="@id/tv_taskid"
android:layout_centerHorizontal="true"
android:layout_marginTop="10dp"
android:background="@drawable/bg_button"
android:textColor="#FFFFFF"
/>
</RelativeLayout>
MainActivity类的代码:
public class MainActivity extends Activity implements View.OnClickListener {
private Button btn_gomain;
private TextView tv_taskid;
private String TAG = "MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d(TAG,"-----进入onCreate");
setContentView(R.layout.activity_main);
btn_gomain = (Button)findViewById(R.id.btn_gomain);
tv_taskid = (TextView)findViewById(R.id.tv_taskid);
tv_taskid.setText(this.toString());
Log.d(TAG,this.toString());
btn_gomain.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.btn_gomain:
startActivity(new Intent(MainActivity.this,MainActivity.class));
break;
}
}
@Override
protected void onResume(){
super.onResume();
Log.d(TAG,"-----进入onResume");
}
@Override
protected void onStart(){
super.onStart();
Log.d(TAG,"-----进入onStart");
}
}
并在AndroidManifest.xml配置启动模式。下面点击按钮,并看打印结果:
发现虽然是跳转同一个Activity,但是他们的序列号不一样,也发现新跳转的Mainactivity的onCreate,onStart,onResume生命周期方法都会被调用,我们知道,android是通过栈来管理activity,通过上面例子可以初步确定,当启动模式设为standard,不管这个实例是否存在,都会重新去创建这个实例。当按back键返回时,会跳到原来之前的界面,也就是创建新的实例会放到栈顶。
2.singleTop
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.nova.startupdemo.MainActivity">
<TextView
android:id="@+id/tv_taskid"
android:layout_width="match_parent"
android:layout_height="40dp"
android:layout_centerInParent="true"
android:gravity="center"
/>
<Button
android:id="@+id/btn_gomain"
android:layout_width="200dp"
android:layout_height="wrap_content"
android:text="跳转MainActivity"
android:layout_below="@id/tv_taskid"
android:layout_centerHorizontal="true"
android:layout_marginTop="10dp"
android:background="@drawable/bg_button"
android:textColor="#FFFFFF"
/>
<Button
android:id="@+id/btn_second"
android:layout_below="@id/btn_gomain"
android:layout_centerHorizontal="true"
android:layout_width="200dp"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:text="跳转到SecondActivity"
android:textColor="#FFFFFF"
android:background="@drawable/bg_button"/>
</RelativeLayout>
public class MainActivity extends Activity implements View.OnClickListener {
private Button btn_gomain;//跳自己
private Button btn_second;//跳其他界面
private TextView tv_taskid;
private String TAG = "MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d(TAG,"-----进入onCreate");
setContentView(R.layout.activity_main);
btn_gomain = (Button)findViewById(R.id.btn_gomain);
btn_second = (Button)findViewById(R.id.btn_second);
tv_taskid = (TextView)findViewById(R.id.tv_taskid);
tv_taskid.setText(this.toString());
Log.d(TAG,this.toString());
btn_gomain.setOnClickListener(this);
btn_second.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.btn_gomain:
startActivity(new Intent(MainActivity.this,MainActivity.class));
break;
case R.id.btn_second:
startActivity(new Intent(MainActivity.this,SecondActivity.class));
}
}
@Override
protected void onResume(){
super.onResume();
Log.d(TAG,"-----进入onResume");
}
@Override
protected void onStart(){
super.onStart();
Log.d(TAG,"-----进入onStart");
}
}
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/tv_second"
android:layout_width="match_parent"
android:layout_height="40dp"
android:layout_centerVertical="true"/>
<Button
android:id="@+id/btn_second"
android:layout_width="200dp"
android:layout_height="40dp"
android:background="@drawable/bg_button"
android:layout_centerHorizontal="true"
android:text="跳转到MainActivity"
android:textColor="#FFFFFF"
android:layout_marginTop="10dp"
android:layout_below="@id/tv_second"/>
</RelativeLayout>
SecondActivity:
public class SecondActivity extends Activity implements View.OnClickListener{
private TextView tv_second;
private Button btn_second;
private String TAG ="SecondActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d(TAG,"-----进入onCreate");
setContentView(R.layout.activity_second);
btn_second = (Button)findViewById(R.id.btn_second);
tv_second = (TextView)findViewById(R.id.tv_second);
tv_second.setText(this.toString());
Log.d(TAG,this.toString());
btn_second.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.btn_second:
startActivity(new Intent(SecondActivity.this,MainActivity.class));
break;
}
}
@Override
protected void onResume(){
super.onResume();
Log.d(TAG,"-----进入onResume");
}
@Override
protected void onStart(){
super.onStart();
Log.d(TAG,"-----进入onStart");
}
}
最后在AndroidManifest.xml配置启动模式:MainActivity和SecondActivity节点下:android:launchMode="singleTop"
可发现,当如果新的Activity已经位于任务栈的栈顶,那么Activity不会重建,onCreate和onStart方法不会被调用,但是onResume会被调用
发现,如果所要跳转的activity不在栈顶,系统会重新创建实例并于栈顶。按back键,先返回SecondActivity,再返回MainActivity
3.singleTask
2.当如果启动模式singleTask,当所要跳转的activity不在栈顶,系统会将栈内所有在这activity上面的activity全部出栈