Activity的四種啟動(dòng)模式是相當(dāng)重要的知識(shí)點(diǎn),給activity設(shè)置合適的啟動(dòng)模式有利于程序的運(yùn)行。
四種啟動(dòng)模式中,singleTask,singleInstance最為重要。
Activity A設(shè)置為singleTask,能夠保證Activity A在棧中只有一個(gè)實(shí)例,這個(gè)棧也允許存在其他的實(shí)例,無(wú)論是Activity A是在棧頂還是棧底,當(dāng)有新的intent請(qǐng)求Activity A時(shí),都不會(huì)創(chuàng)建新的實(shí)例,而是直接交給Activity A的實(shí)例來(lái)處理。
和這個(gè)模式相關(guān)的方法有onNewIntent,用來(lái)處理新的intent請(qǐng)求,特別需要注意的是使用startActivityForResult方法的時(shí)候,根據(jù)startActivityForResult的api說(shuō)明
- if the activity you are launching uses the singleTask launch mode, it will not run in your task and ts you will immediately receive a cancel result.
對(duì)于這句話不是很理解,不知道“if the activity you are launching”指的是被啟動(dòng)的Activity還是啟動(dòng)的activity,寫個(gè)例子驗(yàn)證一下:
- public class HomeActivity extends Activity {
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- Button btn = new Button(this);
- btn.setText("start camera");
- LayoutParams params = new LayoutParams(200, 60);
- params.gravity = Gravity.CENTER;
- btn.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- Intent intent = new Intent();
- intent.setClassName(HomeActivity.this, SecondActivity.class
- .getName());
- startActivityForResult(intent, Activity.DEFAULT_KEYS_DIALER);
- }
- });
- setContentView(btn, params);
- }
- @Override
- protected void onActivityResult(int requestCode, int resultCode, Intent data) {
- Log.i("test", "onActivityResult is working " + resultCode);
- if (resultCode == Activity.RESULT_OK) {
- switch (requestCode) {
- case Activity.DEFAULT_KEYS_DIALER:
- Intent intent = new Intent(this, ThirdActivity.class);
- startActivityForResult(intent, Activity.DEFAULT_KEYS_DIALER + 1);
- break;
- case Activity.DEFAULT_KEYS_DIALER + 1:
- break;
- default:
- break;
- }
- }
- }
- @Override
- protected void onNewIntent(Intent intent) {
- super.onNewIntent(intent);
- Log.i("test", "onNewIntent is working");
- }
- }
- public class SecondActivity extends Activity {
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- EditText edt = new EditText(this);
- edt.setText("please input key words");
- LayoutParams params = new LayoutParams(200, 60);
- params.gravity = Gravity.CENTER;
- Button btn = new Button(this);
- btn.setText("end Second");
- params.gravity = Gravity.CENTER;
- btn.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- setResult(Activity.RESULT_OK);
- finish();
- }
- });
- LinearLayout ll = new LinearLayout(this);
- ll.setLayoutParams(new FrameLayout.LayoutParams(FrameLayout.LayoutParams.FILL_PARENT, FrameLayout.LayoutParams.FILL_PARENT));
- ll.setOrientation(LinearLayout.VERTICAL);
- ll.addView(edt);
- ll.addView(btn);
- setContentView(ll);
-
- }
- }
- <manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.mx.activity" android:versionCode="1" android:versionName="1.0">
- <uses-sdk android:minSdkVersion="4" />
- <application android:icon="@drawable/icon" android:label="@string/app_name"
- android:debuggable="true">
- <activity android:name=".HomeActivity" android:label="@string/app_name">
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <category android:name="android.intent.category.LAUNCHER" />
- </intent-filter>
- </activity>
- <activity android:name=".SecondActivity" android:launchMode="singleTask" />
- <activity android:name=".ThirdActivity" />
- <activity android:name="com.mx.activity.camera.CropImage" />
- </application>
- <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
- </manifest>
經(jīng)驗(yàn)證:打印結(jié)果是I/test (17207): onActivityResult is working 0
0既是RESULT_CANCELED,也就是說(shuō)直接取消了,onActivityResult收到RESULT_CANCELED在SecondActiviy,
啟動(dòng)之前,這也就說(shuō)明了“if the activity you are launching”指的是被啟動(dòng)的activity。
再來(lái)介紹singleInstance,他和singleTask類似,不同點(diǎn)是singleInstance要求activity的實(shí)例不僅只有一個(gè), 并且整個(gè)task中只有一個(gè)activity實(shí)例,而singleTask所在的棧中允許存在其他activity的實(shí)例。
由此我們可以知道設(shè)置了singleInstance的activity也具有上面的特性,此外,啟動(dòng)的activity設(shè)置了 singleInstance,那么無(wú)論被啟動(dòng)的activity有沒(méi)有設(shè)置singleInstance,都無(wú)法獲取返回值,可以驗(yàn)證一下,將 HomeActivity的android:launchMode="singleInstance"
到此,今天遇到的兩個(gè)問(wèn)題都明白了
第一個(gè)問(wèn)題:為什么調(diào)用系統(tǒng)的相機(jī)程序拍照,相機(jī)程序還沒(méi)有啟動(dòng),onActivityResult收到RESULT_CANCELED,這是因?yàn)锳ccountActivity設(shè)置了singleInstance。
第二個(gè)問(wèn)題:取消了AccountActivity設(shè)置了singleInstance的屬性,“拍照”---》“確定”,但是卻無(wú)法返回 AccountActivity,這是因?yàn)閷D片存儲(chǔ)在“/data/data/com.mx.browser/files/account.png”, 而files目錄對(duì)于文件的大小有限制
posted on 2012-03-17 23:58
小果子 閱讀(2846)
評(píng)論(0) 編輯 收藏 引用 所屬分類:
Android & Ios