第一行代码 第二章 Activity

来源:互联网 发布:淘宝店铺申请全球购 编辑:程序博客网 时间:2024/05/29 07:12

一、Activity基本概念
Activity 主要用于和用户进行交互。

所有的Activity都需要在Androidmanifest.xml文件中注册才能生效。通过activity标签对活动进行注册

Androidmanifest.xml文件内容:<activity android:name=".MainActivity"><!--  android:name 用来指定具体注册的是哪个活动     .MainActivity 是隐藏包名的缩写--><!--     intent-filter 这样配置表示这个活动是**主活动**-->    <intent-filter>        <action android:name="android.intent.action.MAIN" />        <category android:name="android.intent.category.LAUNCHER" />    </intent-filter></activity>

二、Activity的启动方式
显示Intent启动和隐式Intent启动

Intent:是Android程序中各个组件之间交互的一种方式;通过它可以实现各组件之间的数据传递,还可以指明当前组件想要执行的动作。

Intent(Context packageContext, Class<?> cls);
第一个参数,要求提供一个启动活动的上下文;
第二个参数,指定想要启动的目标活动

startActivity(),是专门用于启动活动的方法,它接收一个intent参数。
将构建好的Intent传人startActivity()方法就可以启动目标活动了。

1、显示启动

button1.setOnClickListener(new View.OnClickListener(){    @Override    public void onClick(View view) {    Toast.makeText(MainActivity.this, "click", Toast.LENGTH_SHORT).show();/*    显式Intent 启动目标活动    表示在MainActivity这个活动中去启动SecodeActivity这个活动*/    Intent mIntent = new Intent(MainActivity.this,SecodeActivity.class);    startActivity(mIntent);    }});

扩展小知识
Activity继承于Context。

this:表示当前对象。哪个类调用就是指向该对象。

类名.this(MainActivity.this):表示这个类对象(MainActivity对象)。当在内部类的方法中需要引用外部类时,就要用到这种写法;如果在内部类中直接使用this,则表示内部类本身。

MainActivity是一个外部类,View.OnClickListener是一个内部类,在内部类中使用外部类方法需要使用外部类名.this引用外部类的实例。

类名.class:返回的是这个类的Class对象

获取Class对象的方式通常有三种:
1、通过类名.class获取 ;
2、通过已经实例化的对象获取,getClass()方法获取;
3、通过Class.forName(“类的全名称”)获取,这种方法比较少见。

2、隐式启动
此方式并不明确的指出我们想要启动的活动,而是通过指定action和category等信息,交由系统分析这个Intent,从中选出最合适的活动去启动。

由于这种方式是交由系统来决定的,所以只要在系统中匹配到就可以启动该活动,故此方式可以启动第三方应用,也可以启动系统内置应用。
当系统匹配到多个应用时,会弹出选择提示框,用于用户选择启动哪个应用。

在Androidmanifest.xml文件中,通过activity标签下配置intent-filter标签的内容,就可以指定当前活动的action和category。

<activity android:name=".SecodeActivity">    <intent-filter>        <action android:name="com.sky.activitytest.SECODE_ACTIVITY_ACTION"></action>        <category android:name="android.intent.category.DEFAULT"></category>        <category android:name="com.sky.activitytest.SECODE_ACTIVITY_CATRGORY"></category>    </intent-filter></activity>/*    这里定义了可以响应SecodeActivity的action(com.sky.activitytest.SECODE_ACTIVITY_ACTION)和category(com.sky.activitytest.SECODE_ACTIVITY_CATRGORY)配置信息。*/
/*    只有当Intent中指定的action和category同时能够匹配Androidmanifest.xml中的action和category,这个活动才能响应。    android.intent.category.DEFAULT是一只默认的category,在调用startActivity()方法时会自动将这个category添加到Intent中。*/**每个Intent只能指定一个action,可以指定多个category**// 隐式Intent 启动活动Intent mIntent = new Intent("com.sky.activitytest.SECODE_ACTIVITY_ACTION");mIntent.addCategory("com.sky.activitytest.SECODE_ACTIVITY_CATRGORY");startActivity(mIntent);

三、activity之间传递数据 – Intent

http://blog.csdn.net/good__man/article/details/63812419
此链接有详细说明 《关于Activity之间传递数据的6种方式》
1、使用Inten的putExtra传递
2、使用Activity销毁时传递数据
3、使用SharedPreferences传递数据
4、使用静态变量传递数据
5、使用序列化对象Seriazable

1、向下一个活动传递数据:

使用intent.putExtra()方法来传递数据;该方法有两个接收参数:
第一个参数是键,用于启动的活动从这个键中取得值;
第二个参数是传递的数据。

intent传递的数据除了可以是整型、布尔型、字符串;还可以是bundle、自定义的对象(该对象需要通过serializable或者parcelable方式进行序列化)。

firstActivity代码片段:button1.setOnClickListener(new View.OnClickListener(){    @Override    public void onClick(View view) {        Intent mIntent = new Intent(firstActivity.this, SecodeActivity.class);        // 从firstActivity将数据(1111111)传递给SecodeActivity        mIntent.putExtra("data", "1111111");        startActivity(mIntent);    }});
SecodeActivity代码片段:    Intent intent = getIntent();    // getData 就是从firstActivity传来的数据(1111111)    String getData = intent.getStringExtra("data");

除了getStringExtra,还可以使用getIntExtra()、getBooleanExtra()、getSerializableExtra()、getBundleExtra()、getSharedPreferences()来获取数据;这主要是看从firstActivity中传递什么类型的数据来选择的。

2、返回数据给上一个活动:
要想实现这样的效果,需要在firstActivity中使用startActivityForResult()方法来启动SecodeActivity,而不再通过startActivity()方法。
startActivityForResult()方法有两个参数;
第一个参数是Intent,
第二个参数是请求码,用于在回调中判断数据的来源。

在SecodeActivity中返回时,先构建intent,用于传递数据,然后调用setResult()方法,最后调用finish()去销毁当前活动SecodeActivity。
setResult()方法有两个参数;
第一个参数一般只使用RESULT_OK或者RESULT_CANCELED,用于向上一个活动返回处理的结果;
第二个参数是Intent。

SecodeActivity在销毁后,才会回调上一个活动(firstActivity)的onActivityResult()方法。所以在onActivityResult()方法里面接收处理数据即可。

onActivityResult()方法有三个参数;
第一个参数是我们启动活动时出入的请求码,
第二个参数是返回数据时传入的处理结果,
第三个参数是返回的数据。

firstActivity代码片段:button1.setOnClickListener(new View.OnClickListener(){    @Override    public void onClick(View view) {        // 传递数据,并接收上一个活动返回的数据        Intent mIntent = new Intent(firstActivity.this, SecodeActivity.class);        mIntent.putExtra("data", "This data is from firstActivity");        startActivityForResult(mIntent,1);    }});@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {    switch (requestCode) {        // case 1 -> 这里的1就是startActivityForResult(mIntent,1)里面的1。        case 1:            if (resultCode == RESULT_OK) {                // getData 就是从SecodeActivity传回给firstActivity的数据。                // 即getData的内容为:This data is from SecodeActivity                String getData = data.getStringExtra("data");            }            break;    }}
SecodeActivity代码片段:@Overrideprotected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.secode_layout);    Intent intent = getIntent();    // getData 就是从firstActivity获取到的数据。    // 即getData的内容为:This data is from firstActivity    String getData = intent.getStringExtra("data");}// 当按返回键时,让SecodeActivity销毁。只有当SecodeActivity销毁才会回调firstActivity中的onActivityResult()方法@Overridepublic void onBackPressed() {    Intent intent = new Intent();    // 将要返回给firstActivity的数据    intent.putExtra("data","This data is from SecodeActivity");    setResult(RESULT_OK, intent);    finish();}

finish()和System.exit(0)
finish():仅仅把当前Activity退出了,但是并没有释放资源。
System.exit(0):是退出整个应用程序的,是针对整个Application的。将整个进程直接kill,活动所占的资源会被释放。等同于使用android.os.Process.killProcess(android.os.Process.myPid());

原创粉丝点击