探究安卓活动——活动的启动模式

    xiaoxiao2023-11-21  40

    安卓活动启动共有4种模式,分别是standard,singleTask,singleTop和singleInstance.下面分别介绍一下这四种启动模式。

    standard

    standard是活动的默认模式,在不进行显示指定的情况下,所有创建的活动回自动使用该模式。这个模式就是,当你启动一个活动的时候,该活动就会在返回栈中入栈,并且处于栈顶。当用户使用返回时,系统会自动显示栈顶的活动。

    @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Log.d("this is first activity",this.toString()); Button button1=(Button)findViewById(R.id.first); button1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent=new Intent(MainActivity.this,MainActivity.class); startActivity(intent); } }); }

    运行截图: 由运行截图可以看出,点击一次按钮就会创建新的MainActivity。图中建立了两个MainActivity,所以当你想要返回,必须点三次返回键才能退出。这听上去非常麻烦,这个就是standard模式的一个特点。 运行过程: standard模式每次启动都会创建该活动的一个新的实例

    singleTop

    有时候我们希望返回的时候已经处于栈顶活动不需要创建新的实例。这个时候就可以考虑singeleTop。在启动活动的时候如果发现返回栈顶已经是该活动,则直接使用。我们代码试验一下。 在AndroidMainfest.xml中先修改活动的启动该模式:

    <activity> android:name=".MainActivity" android:launchMode="singleTop"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>

    SecondAcitivity代码:

    @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.d("This is SecondActivity.",this.toString()); setContentView(R.layout.activity_second); Button button=(Button)findViewById(R.id.secondActivity); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent=new Intent(SecondActivity.this,MainActivity.class); startActivity(intent); } }); } }

    MainActivity代码:

    @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Log.d("this is first activity",this.toString()); Button button1=(Button)findViewById(R.id.first); button1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent=new Intent(MainActivity.this,SecondActivity.class); startActivity(intent); } }); } @Override protected void onRestart() { super.onRestart(); Log.d("first activity restart",this.toString()); }

    运行截图: 运行过程: 可以看出,当跳转到secondActivity后再点击按钮又是MainActivity,但是此时的MainActivity还是新的实例。 但是如果是已经在栈顶就不会是新实例。singleTop可以解决重复创建栈顶活动,但是没办法解决创建多个活动实例。

    singleTask

    当活动的启动模式指定为singleTask,每次启动该活动,系统首先会在栈中检查是否存在该活动的实例,如果发现已经存在则直接使用该实例,并把在这个活动之上的所有活动统统出栈,如果没有发现就会创建一个新的实例。 修改启动模式:

    <activity> android:name=".MainActivity" android:launchMode="singleTask"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>

    MainActivity

    @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Log.d("this is first activity",this.toString()); Button button1=(Button)findViewById(R.id.first); button1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent=new Intent(MainActivity.this,SecondActivity.class); startActivity(intent); } }); } @Override protected void onRestart() { super.onRestart(); Log.d("first activity restart",this.toString()); }

    SecondActivity

    @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.d("This is SecondActivity.",this.toString()); setContentView(R.layout.activity_second); Button button=(Button)findViewById(R.id.secondActivity); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent=new Intent(SecondActivity.this,MainActivity.class); startActivity(intent); } }); } @Override protected void onDestroy() { super.onDestroy(); Log.d("SecondActivity.destroy",this.toString()); }

    运行截图: 由运行截图可以看出,当secondActivity跳转到MainActivity时,这个时候栈顶是SecondActivity,但是执行了destroy方法。 运行过程: 这个时候如果按返回键的话,MainActivity出栈,直接退出程序。

    singleTask

    singleTask模式是启用新的返回栈来管理活动。如果我们程序中有一个活动能够被其他程序调用,实现多个程序共用一个活动,那么这种场景其他三种模式就没有办法实现。这个时候就要使用singleTask。以下实例说明。

    <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity" android:launchMode="singleTask"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".SecondActivity" android:launchMode="singleInstance" /> <activity android:name=".ThirdActivity"></activity> </application>

    MainActivity和上面相同 SeconActivity代码:

    @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.d("This is SecondActivity.",this.toString()); setContentView(R.layout.activity_second); Button button=(Button)findViewById(R.id.secondActivity); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent=new Intent(SecondActivity.this,ThirdActivity.class); startActivity(intent); } }); } @Override protected void onDestroy() { super.onDestroy(); Log.d("SecondActivity.destroy",this.toString()); }

    ThirdActivity代码:

    @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_third); Log.d("This is ThirdActivity.",this.toString()); }

    运行截图: 由上图可以看出,第三个活动返回后直接restart活动一,而不是SecondActivity,为什么呢。看以下的运行原理图。 运行过程: 当第三个活动返回的时候,第二个活动直接进入到新的返回栈,原先的返回栈只有第一个和第三个活动,所以返回直接是第一个活动。当MainActivity返回的时候,就会到新的返回栈,此时SecondAcitivity在栈顶。就显示活动二。 以上是自我学习活动的启动模式的一点归纳总结。

    最新回复(0)