xiaoguozi's Blog
Pay it forword - 我并不觉的自豪,我所尝试的事情都失败了······习惯原本生活的人不容易改变,就算现状很糟,他们也很难改变,在过程中,他们还是放弃了······他们一放弃,大家就都是输家······让爱传出去,很困难,也无法预料,人们需要更细心的观察别人,要随时注意才能保护别人,因为他们未必知道自己要什么·····

Activity的四种启动模式是相当重要的知识点,给activity设置合适的启动模式有利于程序的运行。

四种启动模式中,singleTask,singleInstance最为重要。

Activity A设置为singleTask,能够保证Activity A在栈中只有一个实例,这个栈也允许存在其他的实例,无论是Activity A是在栈顶还是栈底,当有新的intent请求Activity A时,都不会创建新的实例,而是直接交给Activity A的实例来处理。

和这个模式相关的方法有onNewIntent,用来处理新的intent请求,特别需要注意的是使用startActivityForResult方法的时候,根据startActivityForResult的api说明

 

  1. if the activity you are launching uses the singleTask launch mode, it will not run in your task and ts you will immediately receive cancel result.   

对于这句话不是很理解,不知道“if the activity you are launching”指的是被启动的Activity还是启动的activity,写个例子验证一下:

  1. public class HomeActivity extends Activity  
  2.     @Override  
  3.     public void onCreate(Bundle savedInstanceState)  
  4.         super.onCreate(savedInstanceState);  
  5.         Button btn new Button(this);  
  6.         btn.setText("start camera");  
  7.         LayoutParams params new LayoutParams(20060);  
  8.         params.gravity Gravity.CENTER;  
  9.         btn.setOnClickListener(new View.OnClickListener()  
  10.             @Override  
  11.             public void onClick(View v)  
  12.                 Intent intent new Intent();  
  13.                 intent.setClassName(HomeActivity.thisSecondActivity.class  
  14.                         .getName());  
  15.                 startActivityForResult(intent, Activity.DEFAULT_KEYS_DIALER);  
  16.              
  17.         });  
  18.         setContentView(btn, params);  
  19.      
  20.     @Override  
  21.     protected void onActivityResult(int requestCode, int resultCode, Intent data)  
  22.         Log.i("test""onActivityResult is working " resultCode);  
  23.         if (resultCode == Activity.RESULT_OK)  
  24.             switch (requestCode)  
  25.             case Activity.DEFAULT_KEYS_DIALER:  
  26.                 Intent intent new Intent(thisThirdActivity.class);  
  27.                 startActivityForResult(intent, Activity.DEFAULT_KEYS_DIALER 1);  
  28.                 break 
  29.             case Activity.DEFAULT_KEYS_DIALER 1 
  30.                 break 
  31.             default 
  32.                 break 
  33.              
  34.          
  35.      
  36.     @Override  
  37.     protected void onNewIntent(Intent intent)  
  38.         super.onNewIntent(intent);  
  39.         Log.i("test""onNewIntent is working");  
  40.      
  41.  
 
  1. public class SecondActivity extends Activity  
  2.     @Override  
  3.     protected void onCreate(Bundle savedInstanceState)  
  4.         super.onCreate(savedInstanceState);  
  5.         EditText edt new EditText(this);  
  6.         edt.setText("please input key words");  
  7.         LayoutParams params new LayoutParams(200, 60);  
  8.         params.gravity Gravity.CENTER;  
  9.         Button btn new Button(this);  
  10.         btn.setText("end Second");  
  11.         params.gravity Gravity.CENTER;  
  12.         btn.setOnClickListener(new View.OnClickListener()  
  13.             @Override  
  14.             public void onClick(View v)  
  15.                 setResult(Activity.RESULT_OK);  
  16.                 finish();  
  17.              
  18.         });  
  19.         LinearLayout ll new LinearLayout(this);  
  20.         ll.setLayoutParams(new FrameLayout.LayoutParams(FrameLayout.LayoutParams.FILL_PARENT, FrameLayout.LayoutParams.FILL_PARENT));  
  21.         ll.setOrientation(LinearLayout.VERTICAL);  
  22.         ll.addView(edt);  
  23.         ll.addView(btn);  
  24.         setContentView(ll);  
  25.               
  26.      
  27.  
 

 

  1. <manifest xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     package="com.mx.activity" android:versionCode="1" android:versionName="1.0" 
  3.     <uses-sdk android:minSdkVersion="4" />  
  4.     <application android:icon="@drawable/icon" android:label="@string/app_name"  
  5.         android:debuggable="true" 
  6.         <activity android:name=".HomeActivity" android:label="@string/app_name" 
  7.             <intent-filter>  
  8.                 <action android:name="android.intent.action.MAIN" />  
  9.                 <category android:name="android.intent.category.LAUNCHER" />  
  10.             </intent-filter>  
  11.         </activity>  
  12.         <activity android:name=".SecondActivity" android:launchMode="singleTask" />  
  13.         <activity android:name=".ThirdActivity" />  
  14.         <activity android:name="com.mx.activity.camera.CropImage" />  
  15.     </application>  
  16.     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>  
  17. </manifest>  
 

 

经验证:打印结果是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"

 

 

到此,今天遇到的两个问题都明白了

第一个问题:为什么调用系统的相机程序拍照,相机程序还没有启动,onActivityResult收到RESULT_CANCELED,这是因为AccountActivity设置了singleInstance。

第二个问题:取消了AccountActivity设置了singleInstance的属性,“拍照”---》“确定”,但是却无法返回 AccountActivity,这是因为将图片存储在“/data/data/com.mx.browser/files/account.png”, 而files目录对于文件的大小有限制

posted on 2012-03-17 23:58 小果子 阅读(2842) 评论(0)  编辑 收藏 引用 所属分类: Android & Ios

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理