Activity的启动模式
Activity的启动模式分为四种:standard、singleTop、singleTask、singleInstance。
1、standard是Activity默认的启动模式,在不指定启动模式时,所有Activity使用默认standard模式。在standard模式下每当启动 一个新的Activity模式,它就会进入任务栈并处于栈顶的位置,对于使用standard的Activity模式每次启动都会创建一个新的实例。
代码:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_firstactivity" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="bzu.edu.cn.activity.Firstactivity"> <Button android:id="@+id/btnClick" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="toFirst"/> </RelativeLayout>(创建一个按钮用于跳转页面 activity_firstactivity )
package bzu.edu.cn.activity; import android.content.Intent; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Button; public class Firstactivity extends AppCompatActivity { private Button btnClick; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_firstactivity); Log.d("Firstactivity",this.toString());//日止的打印 打印First的地址 btnClick=(Button) findViewById(R.id.btnClick);//调用btnClick按钮 btnClick.setOnClickListener(new View.OnClickListener() {//创建监听事件 @Override public void onClick(View v) { Intent intent=new Intent(Firstactivity.this,Firstactivity.class);//创建意图让页面从第一个页面跳转到第二个页面 startActivity(intent);//启动意图 } }); } }(Firstactivity页面)
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="bzu.edu.cn.activity"> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".Firstactivity" android:launchMode="standard">(standard启动模式) <intent-filter> <action android:name="android.intent.action.MAIN"></action> <category android:name="android.intent.category.LAUNCHER"></category> </intent-filter> </activity> </application> </manifest>
2、singleTop模式与standard类似,不同的是,当启动的activity 已经位于栈顶时,则直接使用它,不在创建新的实例。
解决一个用户体验的问题,避免页面被重复打开多次。
<activity android:name=".Firstactivity" android:launchMode="singleTop">(singleTop启动模式)
运行后多次点击按钮后,点击返回一次就能返回,这是因为多次打开了同一个Activity,所以只打开第一个,不会从新创建新的。
Intent intent=new Intent(Firstactivity.this,Secondactivity.class);(Firstactivity)Intent intent=new Intent(Secondactivity.this,Firstactivity.class);(Secondactivity)这时点击按钮是从第一个Activity跳转到第二个,这时第二个位于栈顶,再次点击则从第二个跳转到第一个这时从新穿好建一个新的Activity。如果返回则需要返回三次。
3、当Activity的启动模式为singleTask时,每次启该Activity时,系统首先会检查栈中是否存在Activity实例,如果发现已经存
在则直接使用该实例,并将当前Activity之上的所有Actiivty出栈,如果没有发现则创建一个新的实例。当资源使用量大时使用这
个启动方式。
在FirstActivity.java中添加一个方法4、singleInstance模式加载Activity时,只会创建一个Activity实例,并且会使用一个全新的任务栈来装载该Activity的实例。特点是在整个手机系统里protected void onRestart() { super.onRestart(); Log.d("FirstActivit","onRestart()"); }在SecondActivity.java中添加一个方法protected void onDestroy() { super.onDestroy(); Log.d("SecondActivit","onDestroy()"); }运行模拟器后启动应用,当点击按钮时,本应该是跳转到第二个Activity,但是已经存在第一个Activity,singleTask模式此时会销毁第二个,直接使用第一个。
只存在一个实例。手机通话界面就是使用了singleInstance。