第二行代码学习笔记——第二章(1)

Activity的启动和数据传递

1、Activity是什么

Activity是一种可以包含用户界面的组件,主要用于和用户进行交互。

2、活动创建过程中应注意的问题

2.1 Android程序的设计讲究逻辑和视图分离。

2.2 创建的活动应该在 AndroidManifest 中注册,放在<application>标签内 。

2.3 主活动标签,设置该Activity为主活动,应用启动时首先打开这个Activity

<intent-filter>
<action android:name = "android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>

如果一个应用程序没有声明主活动,这个程序依然可以安装,只是无法在启动器中看到或者打开这个程序。
这种程序一般都是作为第三方服务提供给其他应用在内部进行调用。如:支付宝的快捷支付服务

2.4 活动中Menu的使用

(1) 在res目录下新建一个menu文件夹。

右击res目录——>New——>Directory,输入文件名menu,点击OK;

(2)在该文件夹下新建一个名为main的菜单文件。

右击menu文件夹——> New ——>Menu resource file,输入文件名main,然后向menu添加以下代码
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/menu_main_one"
        android:title="第一个"
        android:icon="@mipmap/ic_launcher"
        />

    <item android:id="@+id/menu_main_two"
        android:title="第二个"/>
</menu>

(3)在Activity中重写onCreateOptionsMenu()方法(快捷键ctrl + o),写入如下代码:

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main, menu);
        //true表示显示
        return true;
    }

其中inflate接受两个参数,第一个参数指定使用哪一个资源文件,第二个参数指定将菜单项添加到哪一个Menu对象中。方法返回true,表示允许创建的菜单显示出来

(4)重写onOpitionsItemSelected()方法,定义菜单点击事件。

 @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.menu_main_one:
                Toast.makeText(this, "点击第一个", Toast.LENGTH_SHORT).show();
                break;
            case R.id.menu_main_two:
                Toast.makeText(this, "点击第二个", Toast.LENGTH_SHORT).show();
                break;
        }
        return true;
    }

2.5销毁一个活动

调用finish()方法。

3、Intent的使用

Intent是Android程序中各组件之间进行交互的一种重要方式。它不仅可以指明当前组件想要执行的动作,还可以在不同组件之间传递数据。

3.1 显示Intent

在构造Intent时指明目标Activity,例如
Intent intent= new Intent(FirstActivity.this, SecondActivity.class);
可以看出intent的”意图”非常明显,所以叫显示意图

3.2 隐式Intent

不明确指出想要启动哪一个Activity,而是指定一系列更为抽象的action和category,交由系统分析并找到指定的Activity。
在< activity >标签下的< intent-filter >中指定当前活动响应的action和category,只有同时满足这两个值才能响应Intent

3.2.1 在< activity >标签中写配置action 和 category

action和category中的name:可以随便写。系统也默认提供一些值。
android.intent.category.DEFAULT 是一种默认的category

<activity android:name=".FirstActivity">
            <intent-filter>
                <action android:name="com.answer.demo2.ACTION_START"/>
                <category android:name="android.intent.category.DEFAULT"/>
            </intent-filter>
        </activity>

3.2.2 如何使用隐式Intent

使用构造方法
Intent intent = new Intent(“com.answer.demo2.ACTION_START”);
添加action
使用 addCategory(“com.answer.semo2.ACTION_START”);
添加category

3.2.3 每个Intent只能指定一个action,但是能指定多个category

3.3 更多隐式Intent用法

使用隐式Intent还可以启动其他程序的Activity
例:
3.3.1 调用系统浏览器

Intent webIntent = new Intent(Intent.ACTION_VIEW);
webIntent.setData(Uri.parse("http://www.baidu.com"));
startActivity(webIntent);

使用了setData() 方法,该方法接受一个Uri对象,用于指定当前Intent正在操作的数据。与之对应的在< intent-fileter >标签中配置一个< data >标签,用于更精确的指定当前活动能够响应什么类型的数据。

3.3.2 调用拨号

Intent phoneIntent = new Intent(Intent.ACTION_DIAL);
                phoneIntent.setData(Uri.parse("tel:10086"));
                startActivity(phoneIntent);

3.4 向下传递一个数据

用putExtra() 方法携带数据,用getStringExtra() 获取数据(不同的数据类型用不同的getXXXExtra()方法)。

        //传递数据
        Intent toFirstIntent = new Intent(MainActivity.this, FirstActivity.class);
        toFirstIntent.putExtra("name", "Answer");
        startActivity(toFirstIntent);

        //接收传来的数据
        Intent intent = getIntent();
        String name = intent.getStringExtra("name");

PS : 需要补充一篇传递不同类型数据的博客

3.5 返回数据给上一个Activity

(1)用startActivityForResult()方法,该方法期望在活动销毁的时候返回一个结果给上一个活动,接受两个参数,一个是Intent,另一个是请求码。所以在MainActivity中:

 Intent toFirstIntent = new Intent(MainActivity.this, FirstActivity.class);
 startActivityForResult(toFirstIntent, 1);

(2)在目标Activity中用setResult方法添加需要返回的数据
在FirstActivity中,首先构建一个Intent 用于传递数据,然后将需要传递的数据通过putExtra() 存入Intent,最后用setResult()方法,用于向上一个Activity返回数据。该方法接收两个参数 第一个用于向上一个Activity返回处理结果,第二个参数把带有数据的Intent传递回去。

Intent intent = new Intent();
intent.putExtra("back_data", "Answer");
setResult(RESULT_OK, intent);
finish();

(3)由于用startActivityForResult()方法启动目标Activity,所以目标Activity销毁后会回调原Activity中的onActivityForResult()
onActivityForResut()有三个参数,第一个参数requestCode,即在启动活动时传入的请求码,第二个参数resultCode,即返回数据时传入的处理结果。第三个参数data,即携带着返回数据的Intent。在startActivityForResult()方法中我们首先应该通过检查检查requestCode判断数据来源,通过resultCode判断处理结果是否成功,最后从data中提取数据。

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        switch (requestCode) {
            //判断数据来源
            case 1:
                //判断数据处理结果
                if(resultCode == RESULT_OK) {
                    //获取数据
                    String backData = data.getStringExtra("back_data");
                    Toast.makeText(this, backData, Toast.LENGTH_SHORT).show();
                }
                break;
        }
    }

猜你喜欢

转载自blog.csdn.net/Android_03/article/details/56297518