1. Activity 主要关注与视图窗体的创建(目前理解为网站的网页)。它具有生命周期的概念,onCreate,OnStart,OnRestart, OnResume,OnPause,OnStop,OnDestroy。随着 Activity 对用户的可见和不可见状态转变,onStart()和onStop()能被调用多次。
- "显示生命周期" onStart <---> onStop之间,用户可以在屏幕上看到Activity,尽管可能不在前面(隐藏被透明的Activity覆盖等)与用户交互。在这个两个方法之间可以维护所需要的显示给用户的资源。
- "前台生命周期" onResume <--->onPause之间,Activity显示在屏幕上,并且用户能与之交互。Activity会经常在恢复和暂停之间转换。例如,多米音乐播放时,在机器休眠->音乐暂停,唤醒则音乐继续。
- 加载模式(launch mode):首先,Task是一组与用户交互并执行特定工作的 Activity (已被实例化)的集合。这些 Activity的"实例"都根据被启动的顺序排列在栈中。
- standard模式:默认,Task 中可创建新的Activity实例,且这个Activity可以被实例化多次,task(多)-Activity实例(多);
- singleTop模式:如果一个Activity实例已经存在与当前 task 顶部,则系统通过调用它的 onNewIntent 发送intent请求调用这个实例,而不是创建新的实例。task(多)-Activity实例(多)[note:与standard区别是虽然 task 可以有多个实例,但是在创建实例时,只有当栈的顶部不是这个Activity已经存在的实例,才可以,否则仅仅是调用];
- singleTask模式:简言之,即使不是 top,只要有task拥有这个实例,就不给任何task建立新的该Activity的实例。哪怕Activity启动了新的task,回退还是会回到前一个Activity。在同一时间,Activity的实例只有一个。
- singeInstance模式:与singleTask模式效果一样,但是Activity实例只有一个并且它是Task的唯一成员。之后被该Activity启动的其它Activity都会在不同的Task中启动。
- 注意:通过Intent中的flag,也可以打断默认的行为效果。设置intent 值为FLAG_ACTIVITY_NEW_TASK, FLAG_ACTIVITYY_SINGLE_TOP, FLAG_ACTIVITY_CLEAR_TOP。
2. 配置改变:除非指定,否则如果设备的配置改变(定义在Resource.Configuration类中),任何在界面上的显示都需要更新以适应新的配置(屏幕方向、语言、输入设备)。默认销毁 Activity,并调用相应的 Activity 生命周期函数 onPause,onStop,onDestroy。如果希望绕过 Activity的重启来应对配置改变,则可在manifest文件中配置 android:configChanges 属性。任何在manifest中定义的配置类型,都会回调当前Activity的onConfigurationChanged(Configuration)方法,而不是重启Activity。
3. 启动Activity并得到结果:在Activity中,可以调用 startActivity(Intent)/startActivityForResult(Intent,int)[结果通过onActivityResult(int,int,Intent)拿到【在被调用方使用 setResult(Activity.RESULT_OK,data) ;//data.putExtra("huan", val); 传递给调用方】拿到Intent数据data后使用]方法来启用一个新的 Activity。
android.content.Intent.Intent(Context packageContext, Class<?> cls)
Create an intent for a specific component. All other fields (action, data, type, class) are null, though they can be modified later with explicit calls. This provides a convenient way to create an intent that is intended to execute a hard-coded class name, rather than relying on the system to find an appropriate class for you; see setComponent
for more information on the repercussions of this.
- Parameters:
- packageContext A Context of the application package implementing this class.
- cls The component class that is to be used for the intent.
例如:
1 mButton2.setOnClickListener(new OnClickListener(){ 2 @Override 3 public void onClick(View v) 4 { 5 Intent _intent = new Intent(MainActivity.this, ActivityC.class); 6 startActivityForResult(_intent,100); 7 //第一个是intent对象,第二个是请求码,用来区分不同的请求 8 } 9 });
1 public class ActivityC extends Activity { 2 protected void onCreate(Bundle savedInstanceState) { 3 super.onCreate(savedInstanceState); 4 setContentView(R.layout.activityc); 5 6 Button button1 = (Button) findViewById(R.id.buttionc); 7 8 button1.setOnClickListener(new OnClickListener(){ 9 @Override 10 public void onClick(View v){ 11 Intent data = new Intent(); //可见,Intent有多种构造方式,既可以.putExtra 传递<key,value>值,也可以作为启动新的 Activity 的桥梁。 12 EditText et = (EditText) findViewById(R.id.textActivityc); 13 String val = et.getText().toString(); 14 data.putExtra("huan", val); 15 setResult(Activity.RESULT_OK,data); 16 finish(); 17 } 18 }); 19 } 20 }
4. 需要注意的是,启动不同Activity时候,需要对 requestCode进行各自的设定,这样在onActivityResult()才能拿到不同 Intent的内容,从而选取本页View做不同的处理。
void android.app.Activity.startActivityForResult(Intent intent, int requestCode) Same as calling startActivityForResult(Intent, int, Bundle)
with no options.
- Parameters:
- intent The intent to start.
- requestCode If >= 0, this code will be returned in onActivityResult() when the activity exits.
1 mButton1.setOnClickListener(new OnClickListener(){ 2 @Override 3 public void onClick(View v) 4 { 5 Intent _intent = new Intent(MainActivity.this,ActivityB.class); 6 startActivityForResult(_intent,200); 7 } 8 });
1 @Override 2 protected void onActivityResult(int requestCode, int resultCode,Intent data){ 3 super.onActivityResult(requestCode, resultCode, data); 4 if(requestCode == 100 && resultCode == Activity.RESULT_OK){ 5 String val = data.getExtras().getString("huan"); 6 TextView tv = (TextView) findViewById(R.id.tvDisplay); 7 tv.setText("来自 ActitivityC 的值 :" + val); 8 } 9 if(requestCode == 200 && resultCode == Activity.RESULT_OK){ 10 String val = data.getExtras().getString("xin"); 11 TextView tv = (TextView) findViewById(R.id.tvDisplay); 12 tv.setText("来自 ActitivityB 的值 :" + val); 13 } 14 /* 15 * 本页面上拿到的 ActivityResult,不管是自哪个button跳转的,都需要根据各自新 Activity的requestCode来进行判断。 16 * 并没有区分不同Activity的同样的requestCode。 17 */ 18 19 }
5. 所有的 Activity 都必须在 Androidmanifest.xml 文件中进行注册:<activity android:name=".ActivityC" />