android launchmodel的使用

来源:互联网 发布:为什么要过年呢 知乎 编辑:程序博客网 时间:2024/05/16 17:02

我们知道android中activity的启动模式有四种,分别为standard,singleTop,singleTask,singleTop。关于这四种启动模式的详细介绍请看<a target=_blank href="http://blog.csdn.net/congqingbin/article/details/7441789">http://blog.csdn.net/congqingbin/article/details/7441789</a>该博文介绍的非常详细,我就不在这里多说了。下面我们列举singleTop和singleTask的一个应用。就是我们应用程序的退出。

一、singleTop应用

我们在启动应用程序的时候,可以先用一个空的Activity来作为入口,并且在manifest文件中加入android:launchMode="singleTop" 
<activity            android:name=".FlashActivity"            android:label="@string/app_name"            android:launchMode="singleTop" >            <intent-filter>                <action android:name="android.intent.action.MAIN" />                <category android:name="android.intent.category.LAUNCHER" />            </intent-filter>        </activity>


源代码如下:

HomeActivity:

public class FlashActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {Log.d("mm", "FlashActivity onCreate"+getTaskId());Intent intent = new Intent(this,Main.class);startActivity(intent);super.onCreate(savedInstanceState);}@Overrideprotected void onNewIntent(Intent intent) {Log.d("mm", "FlashActivity onNewIntent");//当flag为<span style="font-family: 宋体, SimSun;">FLAG_ACTIVITY_CLEAR_TOP的时候,本Activity也要finish掉</span>
<span style="white-space:pre"></span>if(intent.getFlags() == Intent.FLAG_ACTIVITY_CLEAR_TOP){finish();}super.onNewIntent(intent);}@Overrideprotected void onDestroy() {Log.d("mm", "FlashActivity ondes");super.onDestroy();}}
MainActivity代码

public class Main extends Activity {//微信申请时的IDboolean isRun = true;    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.view_stub);        final ArrayList<MyObject> list = new ArrayList<MyObject>();        final ArrayList<MyObject.InnerClassObj> list2 = new ArrayList<MyObject.InnerClassObj>();        if ((((int) (Math.random() * 100)) & 0x01) == 0) {              // to show text              // all you have to do is inflate the ViewStub for textview              ViewStub stub = (ViewStub) findViewById(R.id.viewstub_demo_text);              stub.inflate();              TextView text = (TextView) findViewById(R.id.viewstub_demo_textview);              text.setText("The tree of liberty must be refreshed from time to time" +                      " with the blood of patroits and tyrants! Freedom is nothing but " +                      "a chance to be better!");                      text.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {           startActivity();}});        } else {                // to show image              // all you have to do is inflate the ViewStub for imageview              ViewStub stub = (ViewStub) findViewById(R.id.viewstub_demo_image);              stub.inflate();              final ImageView image = (ImageView) findViewById(R.id.viewstub_demo_imageview);              image.setImageResource(R.drawable.icon);              image.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {startActivity();}});        }                         public void startActivity(){    Intent intent = new Intent();    intent.setClass(this, MyActivity.class);    startActivity(intent);    }        @Overrideprotected void onDestroy() {Log.d("mm", "MainActivity ondes");super.onDestroy();}}
MyActivity的代码

public class MyActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);ImageView image = new ImageView(this);image.setBackgroundResource(android.R.color.darker_gray);setContentView(image);Intent intent = new Intent(this, MMService.class);startService(intent);Log.d("mm", "MyActivity onCreate"+getTaskId());}@Overridepublic void onBackPressed() {Log.d("mm", "MyActivity onBackPressed");//监听返回键,这时候我们要退出程序的话,要返回到FlashActivityIntent intent = new Intent(this,FlashActivity.class);//如果想通过把Task栈中的Activity全部给finish掉的话,就必须设置这个flag,//不然的话FlashActivity就会又创建一个新的FlashActivityintent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);startActivity(intent);super.onBackPressed();}@Overrideprotected void onDestroy() {Log.d("mm", "MyActivity ondes");super.onDestroy();}}

这样就可以把Task中所有的Activity都能够finish掉了

二、singleTask

singleTask就是设置为singleTask的Activity,在栈中只有一个实例,无论该Activity是在栈顶还是栈底,只要有被召唤就从栈中提到栈顶,当然它以上的Activity都会被finish掉,所以我们可以把FlashActivity的launchmode改为singleTask的话也是可以的。



但是MyActivity中flag就不用在设置了

public class MyActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);ImageView image = new ImageView(this);image.setBackgroundResource(android.R.color.darker_gray);setContentView(image);Intent intent = new Intent(this, MMService.class);startService(intent);Log.d("mm", "MyActivity onCreate"+getTaskId());}@Overridepublic void onBackPressed() {Log.d("mm", "MyActivity onBackPressed");//监听返回键,这时候我们要退出程序的话,要返回到FlashActivityIntent intent = new Intent(this,FlashActivity.class);//如果想通过把Task栈中的Activity全部给finish掉的话,就必须设置这个flag,//不然的话FlashActivity就会又创建一个新的FlashActivity//intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);startActivity(intent);super.onBackPressed();}@Overrideprotected void onDestroy() {Log.d("mm", "MyActivity ondes");super.onDestroy();}}

关于Activity的启动模式的应用还有很多,根据自己的业务的需要,来设置。

0 0