四种启动模式

来源:互联网 发布:snh48家境 知乎 编辑:程序博客网 时间:2024/06/03 20:49

1.怎么设置activity的启动模式.

 在Manifast.xml文件中添加android:launchMode="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>
2.Activity四种启动模式
<1.standard
标准启动模式,也就是默认的模式,标准模式,每次都会创建一个实例,A启动A,还是会创建实例.
<2.singleTop  (适合接受通知启动的内容显示页面)
单一栈顶模式,在栈的顶部只能存在唯一的一个实例,及A启动A的话,就不会去创建实例.
<3.singleTask (可作为程序的入口,其他应用启动浏览器,只会启动主界面有一次,会清空主界面上面的其他页面)
单一实例模式,在栈里面只存在一个实例,如果已经存在,则将task中在他之上的activity destroy掉,并调用它的onnewintent.
程序一(TASK1):启动程序二
public class MainActivity extends AppCompatActivity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        Log.e("TAG", "onCreate: ------------------TASK1_on:"+getTaskId());        Button button = (Button) findViewById(R.id.bt);        button.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                Intent intent =new Intent("com.viking.task2");                startActivity(intent);            }        });    }    @Override    protected void onNewIntent(Intent intent) {        Log.e("TAG", "onNewIntent: ---------------TASK1_new:"+getTaskId());        super.onNewIntent(intent);    }}
程序二(TASK2):程序2.1(MainActivity ),启动程序2.2(Second(为singletask启动模式))
public class MainActivity extends AppCompatActivity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        Button button = (Button) findViewById(R.id.bt);        Log.e("TAG", "onCreate:------------------- TASK2.1_on:"+getTaskId());        button.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                Intent intent = new Intent(MainActivity.this,Second.class);                startActivity(intent);            }        });    }    @Override    protected void onNewIntent(Intent intent) {        Log.e("TAG", "onNewCreate:-------------------TASK2.1_new:"+getTaskId());        super.onNewIntent(intent);    }}
public class Second extends AppCompatActivity {    @Override    public void onCreate(@Nullable Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_second);        Log.e("TAG", "onCreate: ---------------- TASK2.2_on:"+getTaskId());    }    @Override    protected void onResume() {        super.onResume();    }    @Override    protected void onNewIntent(Intent intent) {        Log.e("TAG", "onNewIntent: ---------------TASK2.2_new:"+getTaskId());        super.onNewIntent(intent);    }}

演示分为两种情况:
1.如果先启动TASK1,通过TASK1启动TASK2.1,再通过TASK2.1启动TASK2.2.
首先会先启动一个TASK1的任务栈,将TASK1存放进去,启动TASK2.1的时候,由于TASK2.1是Standard模式,所以将TASK2.1存进TASK1任务栈里面,
再通过TASK2.1启动TASK2.2,由于TASK2.2是SingleTask模式,所以是创建一个TASK2的任务栈,将TASK2.2存入,如果你此时打开TASK2程序,则
会显示TASK2.2页面,按返回键会直接退出TASK2程序(因为TASK2任务栈里面只有TASK2.2这个activity).
2.如果先启动TASK2程序,通过TASK2.1启动TASK2.2.按home键,再启动TASK1程序,再通过TASK1启动TASK2.1,再通过TASK2.1启动TASK2.2.
首先会先创建一个TASK2的任务栈,先将TASK2.1存入TASK2任务栈中,再启动TASK2.2的时候,由于是在同一程序中启动,所以不会去
创建新的任务栈,而是会直接将TASK2.2存入TASK2中.当启动TASK1程序的时候,会创建一个TASK1的任务栈,将TASK1存入栈中,再通过
TASK1启动TASK2.1的时候,这时会将TASK2.1存入TASK1中,再通过TASK2.1启动TASK2.2的时候,系统会查看是否有启动TASK2中的TASK2.2,由于
之前就启动了TASK2.2,所以就会跳到TASK2栈的TASK2.2,此时回退的话先是TASK2栈的TASK2.2>>TASK2栈的TASK2.1>>TASK1栈的TASK2.1
>>TASK1栈的TASK1
<4.singleInstance(适合与程序分离的页面如:来电页面,闹铃页面)
单一任务栈模式,创建一个独立的任务栈来存放该activity.

原创粉丝点击