首页 > 代码库 > Activity启动模式
Activity启动模式
一、任务栈:
当一个Activity启动了另外一个Activity的时候,新的Activity就会被放置到返回栈的栈顶并将获得焦点。前一个Activity仍然保留在返回栈当中,但会处于停止状态。当用户按下 Back键的时候,栈中最顶端的Activity会被移除掉,然后前一个Activity则会得重新回到最顶端的位置。返回栈中的Activity的顺序永远都不会发生改变,我们只能向栈顶添加 Activity,或者将栈顶的Activity移除掉。因此,返回栈是一个典型的后进先出(last in, first out)的数据结构。
二、 Activit启动模式:
standard 模式
这是默认模式,每次激活Activity时都会创建Activity实例,并放入任务栈中。
singleTop 模式
如果在任务的栈顶正好存在该Activity的实例,就重用该实例( 会调用实例的 onNewIntent() ),否则就会创建新的实例并放入栈顶,即使栈中已经存在该Activity的实 例,只要不在栈顶,都会创建新的实例。
singleTask 模式
如果在栈中已经有该Activity的实例,就重用该实例(会调用实例的 onNewIntent() )。重用时,会让该实例回到栈顶,因此在它上面的实例将会被移出栈。如果栈中不存 在该实例,将会创建新的实例放入栈中。
singleInstance 模式
在一个新栈中创建该Activity的实例,并让多个应用共享该栈中的该Activity实例。一旦该模式的Activity实例已经存在于某个栈中,任何应用再激活该Activity时都会重用 该栈中的实例( 会调用实例的 onNewIntent() )。其效果相当于多个应用共享一个应用,不管谁激活该 Activity 都会进入同一个应用中。
三、新建项目
四、两个布局文件
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <TextView android:id="@+id/tv_msg" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <Button android:id="@+id/btn_start_main" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="启动MainActivity" android:textAllCaps="false" /> <Button android:id="@+id/btn_start_b" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="启动BActivity" android:textAllCaps="false" /> </LinearLayout>
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <TextView android:id="@+id/tv_b_msg" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <Button android:id="@+id/btn_b_start_main" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="启动MainActivity" android:textAllCaps="false" /> <Button android:id="@+id/btn_b_start_b" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="启动BActivity" android:textAllCaps="false" /> </LinearLayout>
五、两个Class文件
package com.example.launchmode; import android.content.Intent; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.TextView; public class MainActivity extends AppCompatActivity { private TextView tvMsg; private Button btnStartSelf, btnStartB; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tvMsg = (TextView) findViewById(R.id.tv_msg); btnStartSelf = (Button) findViewById(R.id.btn_start_main); btnStartB = (Button) findViewById(R.id.btn_start_b); tvMsg.setText(String.format("TaskID:%d\nCurrent Activity id%s", getTaskId(), toString())); btnStartSelf.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { startActivity(new Intent(MainActivity.this, MainActivity.class)); } }); btnStartB.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { startActivity(new Intent(MainActivity.this, BMainActiity.class)); } }); } }
package com.example.launchmode; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.TextView; /** * Created by 袁磊 on 2017/2/13. */ public class BMainActiity extends Activity { private TextView tvMsg; private Button btnStartMain, btnStartSelf; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_b_main); tvMsg = (TextView) findViewById(R.id.tv_b_msg); btnStartMain = (Button) findViewById(R.id.btn_b_start_main); btnStartSelf = (Button) findViewById(R.id.btn_b_start_b); tvMsg.setText(String.format("TaskID:%d\nCurrent Activity id%s", getTaskId(), toString())); btnStartMain.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { startActivity(new Intent(BMainActiity.this, MainActivity.class)); } }); btnStartSelf.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { startActivity(new Intent(BMainActiity.this, BMainActiity.class)); } }); } }
六、注册清单文件
启动页面设置启动模式
注册BMainActivity
七、运行效果(安装Demo,点击Button观察结果)
Activity启动模式