Android的四大组件之-Activity的启动模式

来源:互联网 发布:如何测试网络 编辑:程序博客网 时间:2024/06/05 07:55

1.活动的启动模式:

活动的启动模式可以在:AndroidManifest.xml中通过给<activity>标签指定android:launchMode属性来指定如下4中模式。


[1] standard

是活动默认的启动模式,我们可以通过一个例子来辅助理解:

<span style="font-size:14px;"></span>

public class FirstActivity extends AppCompatActivity implements View.OnClickListener{    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        requestWindowFeature(Window.FEATURE_NO_TITLE);        setContentView(R.layout.activity_main);        Log.d("FirstActivity",this.toString());        Button button = (Button)findViewById(R.id.button);        button.setOnClickListener(this);    }    @Override    public void onClick(View v) {        Intent intent = new Intent(FirstActivity.this,FirstActivity.class);        startActivity(intent);    }}

在MainActivity中我们点击按钮会执行这句:

Intent intent = new Intent(FirstActivity.this,FirstActivity.class);


代码没有写错,只是自己调用自己而已,当我连续点击3次,此时会创建3个MainActivity实例,这样我们按Back键三次才会退出应用程序

如下图所示:


[2] singleTop

这个模式是对第一个模式的不足进行改进,如果返回栈顶的活动是该活动,则直接使用不会再创建新活动。

我们对第一个例子修改AndroidManifest.xml 中的<activity> 的启动模式为:android:launchMode="singleTop"

则不管点击多少次,只会创建一个活动,按Back键直接退出程序。

如果我们这样来操作:FirstActivity点击按钮调用SecondActivity,SecondActivity点击按钮调用FirstActivity。

代码如下:

public class FirstActivity extends AppCompatActivity implements View.OnClickListener{    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        requestWindowFeature(Window.FEATURE_NO_TITLE);        setContentView(R.layout.activity_first);        Log.d("FirstActivity",this.toString());        Button button = (Button)findViewById(R.id.button);        button.setOnClickListener(this);    }    @Override    public void onClick(View v) {        Intent intent = new Intent(FirstActivity.this,SecondActivity.class);        startActivity(intent);    }}
 

public class SecondActivity extends AppCompatActivity implements View.OnClickListener{    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        requestWindowFeature(Window.FEATURE_NO_TITLE);        setContentView(R.layout.activity_second);        Log.d("SecondActivity",this.toString());        Button button = (Button)findViewById(R.id.button);        button.setOnClickListener(this);    }    @Override    public void onClick(View v) {        Intent intent = new Intent(SecondActivity.this,FirstActivity.class);        startActivity(intent);    }}
经过测试可以知道程序会创建两个不同的FirstActivity实例,因为SecondActivity中启用FirstActivity时,此时栈顶活动是SecondActivity,因此会创建一个新的FirstActivity实例,按下Back键先返回到SecondActivity,再按Back键返回到FirstActivity,再按Back才会退出

如图所示:


[3] singleTask

使用singleTask模式是解决了创建栈顶活动时重复问题,但是该活动不是处于栈顶位置时,还是会创建多个实例,那么是否有办法整个应用程序只有一个实例呢?

第三种模式就能解决这个问题。

第二个例子修改AndroidManifest.xml 中的<activity> 的启动模式为:android:launchMode="singleTask"

在FirstActivity中实现onRestart方法:

@Overrideprotected void onRestart() {    super.onRestart();    Log.d("Fristctivity","onRestart");}
在SecondActivity中实现onDestory方法:

@Overrideprotected void onDestroy() {    super.onDestroy();    Log.d("SecondActivity","onDestory");}
按照第二中模式进行点击,然后按Back键,你会发现没有重新创建FirstActivity。

如图所示:


这个模式就解决了非栈顶的活动不会被重复创建。

[4] singleInstance

这个模式比较复杂,假设我们的程序中有一个活动是允许被其他程序调用的,如果我们想实现一个其他程序和我们的程序共享这个活动的实例,singleInstance模式可以解决这个问题。

将SecondActivity修改AndroidManifest.xml 中的<activity> 的启动模式为:android:launchMode="singleInstance"

public class FirstActivity extends AppCompatActivity implements View.OnClickListener{    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        requestWindowFeature(Window.FEATURE_NO_TITLE);        setContentView(R.layout.activity_first);        Log.d("FirstActivity","Task Id is :"+getTaskId());        Button button = (Button)findViewById(R.id.button);        button.setOnClickListener(this);    }    @Override    public void onClick(View v) {        Intent intent = new Intent(FirstActivity.this,SecondActivity.class);        startActivity(intent);    }}
 

public class SecondActivity extends AppCompatActivity implements View.OnClickListener{    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        requestWindowFeature(Window.FEATURE_NO_TITLE);        setContentView(R.layout.activity_second);        Log.d("SecondActivity","Task Id is:"+getTaskId());        Button button = (Button)findViewById(R.id.button);        button.setOnClickListener(this);    }    @Override    public void onClick(View v) {        Intent intent = new Intent(SecondActivity.this,ThirdActivity.class);        startActivity(intent);    }}

public class ThirdActivity extends AppCompatActivity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        requestWindowFeature(Window.FEATURE_NO_TITLE);        setContentView(R.layout.activity_third);        Log.d("ThirdActivity","Task Id is:"+getTaskId());    }
我们发现Task Id SecondActivity·确实不同于FirstActivity和ThirdActivity
我们按Back键发现ThirdActivity直接返回到FirstActivity,再按Back键返回到SecondActivity,再按Back才会退出程序
这说明SecondActivity的返回栈是独立的,如图所示:

先即返回栈A  然后在去返回栈B里面找。

0 0