安卓的启动模式都有哪些

都有哪些详细些。设置后的生命周期是怎么样的,他们之间的区别是什么样的

1、standard(标准模式):一个定义Activity在mainfest中不设置android:launchMode=“standard”,也会默认为standard,standard就是新建一个Activity就在栈中新建一个Activity实例。
2、singleTop(栈顶复用模式):在mainfest中设置singleTop模式时,当前栈顶如果有一个相同的Activity,就不创建而复用栈顶的那个,只要创建新的和栈顶相同的Activity才会复用,复用的Activity就回调onNewIntent方法。
3、singleTask(栈内单例模式):当前栈内只有一个Activity实例,栈内已存activity实例,在其他Activity中开启这个Activity,Android直接把这个实例栈上面的其他Activity实例踢出栈GC掉。
4、singleInstace(堆内单例):设置该模式的Activity实例存在一个单独的任务栈中,整个系统独立的。

设置了singleTop、singleTask、singleInstance这三种模式的Activity,如果开启一个新的Activity页面,栈顶存在相同的实例就复用,都不会重新创建一个新实例,Activity复用后都会调用onNewIntent(Intent intent)方法。

  • 你可以看下这个问题的回答https://ask.csdn.net/questions/7688973
  • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:静态内部类的生命周期
  • 除此之外, 这篇博客: 悔恨!离面试不到24小时才开始刷题,面试被虐的怀疑人生,幸好这些路数及时挽救中的 每次面试都是机会 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 不知道你是否有这样的体会:每次准备面试时会让自己的水平有一点提升,而和一些比较好的面试官交流(被面试)后,自己更能看清楚自己的缺点。

    每次“被虐”的面试下来,对你都是一次改变的机会。不过你需要有自己的判断,面试官让你发现你的问题所在,但是否要改掉,就不一定了。

    谁还没个缺点!

    温伯格的《咨询的奥秘》教我们一个伯登法则:“要是你不能改掉缺点,就把他变成特点”。

    一个人同一时间不能做太多的事情。我们自己要有自己的关注点,你可以仔细思考面试官发现的问题,但如果和你的现阶段焦点不相关的话,你还是应该把力气放在你关注的事情上。

    简单点的做法就是,你只要把一次面试发现的问题都列出来,改掉其中一项最急迫需要改善的。只要你多“被虐”几次后,面试官也不需要再“虐”你了,因为他可以很容易给你下结论了。

    小结:

    写到这里,并没有费笔墨“安慰”你面试后受伤的心灵,只是让你看清,“被虐”并不可怕,并没有你想的那么糟糕,而且充满了机会。

    最糟糕的是,你认为“被虐”了将自己置于“受害者”的位置获得心理上的同情,却重不改变。

  • 您还可以看一下 杨帅老师的自然语言处理基于深度学习的中文命名实体识别实战课程中的 课程案例演示小节, 巩固相关知识点
  • 以下回答由chatgpt基于相关博客总结生成:

    答案:

    安卓系统中一共有四种启动模式,分别是standard、singleTop、singleTask和singleInstance。

    • standard:默认启动模式,每次启动 Activity 都会创建一个新实例,并且该 Activity 的实例可以多次创建。
    • singleTop:如果需要启动的 Activity 已经位于栈顶,那么不会创建新的实例,而是重用栈顶的 Activity 实例,如果不在栈顶,则重建 Activity。
    • singleTask:在系统中只存在一个该 Activity 的实例,如果重复启动该 Activity,会将位于该 Activity 的上面的其他 Activity 全部弹出栈,并重新调用该 Activity 的 onNewIntent 方法。
    • singleInstance:同一应用中,该 Activity 只能有一个实例,并且该 Activity 只和该应用在一个任务栈中。

    每个启动模式的生命周期会在以下两个时间发生变化:

    • Activity 对象的 onDestroy() 方法被调用后,如果该 Activity 没有设置 launchMode 属性或者设置为 standard,那么该 Activity 对象的生命周期便结束了;而对于其他三种启动模式,有可能只是脱离了当前 Activity 栈,但并没有销毁该 Activity 对象。
    • 当被启动的 Activity 对象已经存在于栈中时,这里就需要了解各个启动模式之间的区别。如果是 standard 启动模式,不管该 Activity 是否已经存在于栈中,都会重新创建一个新的 Activity 对象;如果是 singleTop 启动模式,则不会再次创建 Activity 对象,而是直接将栈中该 Activity 对象上面的 Activity 移除并调用其 onNewIntent 方法;如果是 singleTask 启动模式,则会考虑 Affinity 和栈中是否已经存在该 Activity,如果栈中不存在该 Activity,那么会先创建该 Activity 再创建一个新的任务栈并添加;如果栈中已经存在该 Activity,则将会把该 Activity 上面的所有 Activity 移除并调用其 onNewIntent 方法;如果是 singleInstance 启动模式,则和 singleTask 类似,不同的是,该 Activity 必须在新的任务栈中,并且再该任务栈中只能有该 Activity。

    不同启动模式之间的明显区别如下:

    • standard 是默认启动模式,每次进入 Activity 都会创建新实例,无论是否存在实例;
    • singleTop 在栈顶直接复用 Activity 实例,不会重新创建,并在重用时调用 onNewIntent 方法;不在栈顶则创建新的 Activity 实例;
    • singleTask 则会在整个栈中只创建一个 Activity 实例,即栈底,并在重用时调用 onNewIntent 方法。如果存在栈中,则清除它上方的 Activity,如果不存在栈中,则创建新的实例。singleTask 只存在于新的任务栈中,即不同于它的所属 Activity 的任务栈,打开同一个 singleTask 的 Activity,只显示一次它的实例;
    • singleInstance 单例启动模式就是说整个系统中该 Activity 只有一个实例,其他应用的 intent 请求仍然会开启新的 Activity 实例,其实 singleInstance 就是 singleTask + taskAffinity(任务栈分配的名称)。singleInstance 只存在于新的任务栈中。

    举例说明它们的具体应用场景:

    • standard:一般用于多个 Activity 之间的相互跳转;
    • singleTop:用于消息推送等通知栏跳转功能,避免打开同样的 Activity 实例多次;
    • singleTask:一般用于 APP 主页面。例如微信主页面打开其他功能页面,在返回时直接回到主页面;
    • singleInstance:用于创建共享的 Activity,例如系统的设置应用。

    参考代码:

    以下是一个使用不同启动模式的示例代码:

    AndroidManifest.xml

    <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="standard"
            android:label="@string/app_name"
            android:theme="@style/AppTheme.NoActionBar">
        </activity>
    
        <activity
            android:name=".SingleTopActivity"
            android:label="@string/title_activity_single_top"
            android:launchMode="singleTop"
            android:parentActivityName=".MainActivity">
            <meta-data
                android:name="android.support.PARENT_ACTIVITY"
                android:value=".MainActivity"/>
        </activity>
    
        <activity
            android:name=".SingleTaskActivity"
            android:label="@string/title_activity_single_task"
            android:launchMode="singleTask"
            android:parentActivityName=".MainActivity">
            <meta-data
                android:name="android.support.PARENT_ACTIVITY"
                android:value=".MainActivity"/>
        </activity>
    
        <activity
            android:name=".SingleInstanceActivity"
            android:label="@string/title_activity_single_instance"
            android:launchMode="singleInstance"
            android:parentActivityName=".MainActivity">
            <meta-data
                android:name="android.support.PARENT_ACTIVITY"
                android:value=".MainActivity"/>
        </activity>
    </application>
    

    MainActivity.java

    public class MainActivity extends AppCompatActivity {

    private Button mBtnSingleTop;
    private Button mBtnSingleTask;
    private Button mBtnSingleInstance;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
        mBtnSingleTop = findViewById(R.id.btn_single_top);
        mBtnSingleTask = findViewById(R.id.btn_single_task);
        mBtnSingleInstance = findViewById(R.id.btn_single_instance);
    
        mBtnSingleTop.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MainActivity.this, SingleTopActivity.class);
                startActivity(intent);
            }
        });
    
        mBtnSingleTask.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MainActivity.this, SingleTaskActivity.class);
                startActivity(intent);
            }
        });
    
        mBtnSingleInstance.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MainActivity.this, SingleInstanceActivity.class);
                startActivity(intent);
            }
        });
    }
    

    }

    SingleTopActivity.java

    public class SingleTopActivity extends AppCompatActivity {

    private Button mBtnSingleTop;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_single_top);
    
        mBtnSingleTop = findViewById(R.id.btn_single_top);
    
        mBtnSingleTop.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(SingleTopActivity.this, SingleTopActivity.class);
                startActivity(intent);
            }
        });
    }
    
    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        Log.d("SingleTopActivity", "onNewIntent");
    }
    

    }

    SingleTaskActivity.java

    public class SingleTaskActivity extends AppCompatActivity {

    private Button mBtnSingleTask;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_single_task);
    
        mBtnSingleTask = findViewById(R.id.btn_single_task);
    
        mBtnSingleTask.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(SingleTaskActivity.this, SingleTaskActivity.class);
                startActivity(intent);
            }
        });
    }
    
    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        Log.d("SingleTaskActivity", "onNewIntent");
    }
    

    }

    SingleInstanceActivity.java

    public class Single