Activity的四種啟動模式是相當重要的知識點,給activity設置合適的啟動模式有利于程序的運行。
四種啟動模式中,singleTask,singleInstance最為重要。
Activity A設置為singleTask,能夠保證Activity A在棧中只有一個實例,這個棧也允許存在其他的實例,無論是Activity A是在棧頂還是棧底,當有新的intent請求Activity A時,都不會創(chuàng)建新的實例,而是直接交給Activity A的實例來處理。
和這個模式相關(guān)的方法有onNewIntent,用來處理新的intent請求,特別需要注意的是使用startActivityForResult方法的時候,根據(jù)startActivityForResult的api說明
- 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.
對于這句話不是很理解,不知道“if the activity you are launching”指的是被啟動的Activity還是啟動的activity,寫個例子驗證一下:
- 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)驗證:打印結(jié)果是I/test (17207): onActivityResult is working 0
0既是RESULT_CANCELED,也就是說直接取消了,onActivityResult收到RESULT_CANCELED在SecondActiviy,
啟動之前,這也就說明了“if the activity you are launching”指的是被啟動的activity。
再來介紹singleInstance,他和singleTask類似,不同點是singleInstance要求activity的實例不僅只有一個, 并且整個task中只有一個activity實例,而singleTask所在的棧中允許存在其他activity的實例。
由此我們可以知道設置了singleInstance的activity也具有上面的特性,此外,啟動的activity設置了 singleInstance,那么無論被啟動的activity有沒有設置singleInstance,都無法獲取返回值,可以驗證一下,將 HomeActivity的android:launchMode="singleInstance"
到此,今天遇到的兩個問題都明白了
第一個問題:為什么調(diào)用系統(tǒng)的相機程序拍照,相機程序還沒有啟動,onActivityResult收到RESULT_CANCELED,這是因為AccountActivity設置了singleInstance。
第二個問題:取消了AccountActivity設置了singleInstance的屬性,“拍照”---》“確定”,但是卻無法返回 AccountActivity,這是因為將圖片存儲在“/data/data/com.mx.browser/files/account.png”, 而files目錄對于文件的大小有限制
posted on 2012-03-17 23:58
小果子 閱讀(2846)
評論(0) 編輯 收藏 引用 所屬分類:
Android & Ios