android 启动Activity的四种模式
16lz
2022-01-10
android 启动Activity的四种模式 1:standard,2:singleTop,3:singleTask,4:singleInstance
第一种是默认的启动模式,并没有什么特别:写个例子说明一切(talk is cheep )
<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.lanchmodetest" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="19" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.example.lanchmodetest.MainActivity" android:launchMode="standard" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name="com.example.lanchmodetest.SecondActivity" /> </application></manifest>这里是第一种启动模式。代码部分:
package com.example.lanchmodetest;import android.support.v7.app.ActionBarActivity;import android.support.v7.app.ActionBar;import android.support.v4.app.Fragment;import android.content.Intent;import android.os.Bundle;import android.util.Log;import android.view.LayoutInflater;import android.view.Menu;import android.view.MenuItem;import android.view.View;import android.view.ViewGroup;import android.os.Build;public class MainActivity extends ActionBarActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Log.e("FirstActivity", this.toString()); } public void start(View view) { startActivity(new Intent(MainActivity.this,MainActivity.class)); } }布局文件就不贴了,就是写一个触发事件onClick,这里我们启动自己,日志如下:
04-14 13:33:30.560: E/FirstActivity(1745): com.example.lanchmodetest.MainActivity@1a7acc8b04-14 13:33:31.730: E/FirstActivity(1745): com.example.lanchmodetest.MainActivity@390567504-14 13:33:32.080: E/FirstActivity(1745): com.example.lanchmodetest.MainActivity@243d7a4f04-14 13:33:32.420: E/FirstActivity(1745): com.example.lanchmodetest.MainActivity@2620c69904-14 13:33:32.900: E/FirstActivity(1745): com.example.lanchmodetest.MainActivity@233925d304-14 13:33:33.280: E/FirstActivity(1745): com.example.lanchmodetest.MainActivity@d367e7d04-14 13:33:33.620: E/FirstActivity(1745): com.example.lanchmodetest.MainActivity@be39304
我点击多次,发现创建多个MainActivity实例,依次点返回才会被销毁。
2:singleTop 我们修改
android:launchMode="singleTop",然后看日志:
04-14 13:37:41.190: E/FirstActivity(10153): com.example.lanchmodetest.MainActivity@2da94096
点击多次,只生成一个实例,点击返回,立马销毁。我们不启动自己,启动第二个activity 试试,startActivity(new Intent(MainActivity.this,SecondActivity.class));
SecondActivity 代码如下:
package com.example.lanchmodetest;import android.content.Intent;import android.os.Bundle;import android.support.v7.app.ActionBarActivity;import android.util.Log;import android.view.View;public class SecondActivity extends ActionBarActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.fragment_main); Log.e("SecondActivity", this.toString()); } public void test(View view) { startActivity(new Intent(SecondActivity.this,MainActivity.class)); } @Overrideprotected void onDestroy() {// TODO Auto-generated method stubsuper.onDestroy();Log.e("SecondActivity", this.toString()+"onDestroy");}}
点击进入第二个Activity ,在点击回到第一个页面,我们发现MainActivity 还是创建了。
04-14 13:39:22.780: E/SecondActivity(10897): com.example.lanchmodetest.SecondActivity@257b385d04-14 13:39:25.890: E/FirstActivity(10897): com.example.lanchmodetest.MainActivity@3b13b9f704-14 13:39:29.250: E/SecondActivity(10897): com.example.lanchmodetest.SecondActivity@2d27ae01也就是说:singleTop模式下,如果启动的activity已经在栈顶,他不会再启动新的Activity了,否则还是会创建新的Activity。
3:singleTask ,第三种就是能满足有些界面不要创建多次的需求了,修改 android:launchMode="singleTask"
</pre><pre name="code" class="html">04-14 13:47:53.590: E/SecondActivity(17552): com.example.lanchmodetest.SecondActivity@df040e104-14 13:47:54.190: E/SecondActivity(17552): com.example.lanchmodetest.SecondActivity@198986db04-14 13:47:54.260: E/SecondActivity(17552): com.example.lanchmodetest.SecondActivity@df040e1onDestroy04-14 13:47:55.130: E/SecondActivity(17552): com.example.lanchmodetest.SecondActivity@198986dbonDestroy
从日志来看,这种模式下不会新的实例,并且会把此实例之上的Activity统统出栈!
4:singleInstance ,修改android:launchMode="singleInstance"
04-14 13:58:13.390: E/FirstActivity(23182): com.example.lanchmodetest.MainActivity@7be159104-14 13:58:14.920: E/SecondActivity(23182): com.example.lanchmodetest.SecondActivity@1ec5ec0b04-14 13:58:28.130: E/SecondActivity(23182): com.example.lanchmodetest.SecondActivity@1ec5ec0bonDestroy经过前面三个,这个倒好理解了,这个也不会创建新的实例,但是
启动一个新的返回栈来管理这个Activity,也就是说,当我们在SecondActivity里启动MainActivity时候,从新启动新的返回栈来管理此Activity,而且SecondActivity不会被销毁,除非你点击了返回。
更多相关文章
- [Android实例] Android网络收音机项目(内含源码)
- Android(安卓)清单文件属性大全
- android 动态调试笔记
- YAHFA hook的简单实例 ,hook自己的android应用
- Android教程之android数据库编程
- Android中不常见的监听: 鼠标划过/双击/右键
- Android(安卓)开机自启动应用
- Android(安卓)UI结构源码研究
- 用Android(安卓)Studio进行NDK开发(简化流程)