第一行代码 第二章 Activity

一、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);
    }
});

@Override
protected 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代码片段:

@Override
protected 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()方法

@Override
public 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());

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值