Android 学习之《第一行代码》第二版 笔记(二)Activity探究活动(一)

一、在活动中使用Toast和Menu

1. 效果图

Toast_Menu效果图

2. 代码

A. 简介

Toast: 是Android系统提供的一种良好的提醒方式,可以将一些短小的信息通知给用户,该信息在一段时间后自动消失,并且不占用任何屏幕空间。
Menu: 菜单显示,能让菜单得到展示的同时,还不占用任何屏幕空间。

B. 相关信息:

应用名称为:MenuTest
活动名称为:MenuActivity
活动对应布局名称:activity_menu
创建完项目和主活动后,仅修改main.xml和MenuActivity.java
menu资源的创建

C. 具体代码:

main.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:id="@+id/add_item"
        android:title="Add"
        />
    <item
        android:id="@+id/remove_item"
        android:title="Remove"
        />
    <!--指定唯一标识符id和菜单项名称-->
</menu>
package com.example.thinkpad.menutest;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;

public class MenuActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_menu);
    }
    @Override
    //重写该函数,创建菜单
    public boolean onCreateOptionsMenu(Menu menu){
        getMenuInflater().inflate(R.menu.main,menu);
        //通过getMenuInflater()方法得到MenuInflater对象
        //调用该对象的inflate()方法创建菜单
        //该方法第一个参数指定通过哪一个资源文件来创建菜单
        //第二个参数指定我们的菜单项将要添加到哪一个Menu对象中
        return true;
        //返回true表示允许创建的菜单显示出来,返回false则创建的菜单将无法显示
    }

    @Override
    //重新该方法,定义菜单响应事件
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()){
            case R.id.add_item:
                Toast.makeText(this, "You clicked Add", Toast.LENGTH_SHORT).show();
                //静态方法makeText()创建一个Toast对象
                //第一个参数为Toast要求的上下文
                //第二个参数为Toast显示的文本内容
                //第三个参数为Toast显示的时长:两个内置常量
                    //Toast.LENGTH_SHORT && Toast.LENGTH_LONG
                //show()方法将Toast显示出来
                break;
            case R.id.remove_item:
                Toast.makeText(this,"You clicked Remove", Toast.LENGTH_SHORT).show();
                break;
            default:
        }
        return true;
    }
}

二、使用intent在活动中穿梭

1. Intent概念

是Android程序中各组件之间进行交互的一种重要方式,不仅可以指明当前组件想要执行的动作,还可以在不同组件之间传递数据。一般用于启动活动、启动服务以及发送广播等场景。

2. 显式Intent

//写在按钮的点击事件函数中
Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
//构建一个Intent,第一个参数为上下文,第二个参数为目标活动
startActivity(intent);
//Activity类中一个专门用于启动活动的函数
//单击按钮即可从FirstActivity跳转到SecondActivity

3. 隐式Intent

隐式Intent并不明确指出想要启动哪一个活动,而是指定一系列更为抽象的action和category等信息,然后交由系统去分析这个Intent,帮助我们找到合适的活动启动。

A. (AndroidManifest.xml)通过在 < activity > 标签下配置 < intent-filter > 的内容可以指定当前活动能够响应的action和category。

<activity android:name=".SecondActivity" >
    <intent-filter>
        <action android:name="com.example.activitytest.ACTION_START" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
    <!--只有活动中的<action>和<category>同时匹配上Intent中指定的action和category,该活动才能响应该Intent-->
</activity>

B. 每个Intent中只能指定一个action,但却能指定多个category

intent.addCategory("com.example.activitytest.MY_CATEGORY");
//给Intent增加一个category

C. 使用隐式Intent不仅可以启动自己程序内的活动,还可以启动其他程序的活动。

//写在按钮的点击事件函数中
Intent intent = new Intent(Intent.ACTION_VIEW);
//指定intent的action为Intent.ACTION_VIEW
//Intent.ACTION_VIEW是Android系统的一个内置动作
intent.setData(Uri.parse("http://www.baidu.com"));
//通过Uri.parse()方法将网址字符串解析成一个Uri对象
//通过setData()方法将这个Uri对象传递进去
startActivity(intent);
//单击按钮即可打开浏览器进入百度首页
//写在按钮的点击事件函数中
Intent intent = new Intent(Intent.ACTION_DIAL);
//指定intent的action为Intent.ACTION_DIAL
//Intent.ACTION_DIAL是Android系统的一个内置动作
intent.setData(Uri.parse("tel:10086"));
//指定了协议为tel号码为10086
startActivity(intent);
//单击按钮即可拨号10086

D. (AndroidManifest.xml)可在 < intent-filter > 标签中配置 < data > 标签,用于更加精确地指定当前活动能够响应什么类型的数据。

android:scheme 用于指定数据的协议部分
android:host 用于指定数据的主机名部分
android:port 用于指定数据的端口部分
android:path 用于指定主机名和端口之后的部分
android:mimeType 用于指定可以处理的数据类型,允许使用通配符的方式进行指定。

4. 向下一个活动传递数据

A. 在FirstActivity的按钮点击事件函数中编写如下代码:

String data = "Hello SecondActivity";
Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
intent.putExtra("extra_data",data);
//将要传递的数据以键值对暂存于Intent当中
startActivity(intent);

B. 在SecondActivity中的OnCreate函数中添加如下代码:

Intent intent = getIntent();
//通过getIntent()获取到用于启动SecondActivity的Intent
String data = intent.getStringExtra("extra_data");
//调用getXxxExtra()传入相应键值获得数据
Log.d("SecondActivity",data);

5. 返回数据给上一个活动

A. 返回上一个活动:Back键或者finish()函数

B. 使用startActivityForResult()来启动活动,在活动销毁时会回调上一个活动的onActivityResult()方法

C. 代码实例

FirstActivity.java

//写在按钮的点击事件函数中
Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
startActivityForResult(intent,1);
//第一个参数为Intent,第二个参数为请求码,用于在之后的回调中判断数据的来源
//请求码只要是唯一值就可以了

SecondActivity.java

//写在按钮的点击事件函数中
Intent intent = new Intent();
intent.putExtra("data_return","Hello FirstActivity");
setResult(RESULT_OK,intent);//专门用于向上一个活动返回数据
//第一个参数用于向上一个活动返回处理结果,一般为RESULT_OK或者RESULT_CANCELED
//第二个参数则把带有数据的Intent传递回去
finish();

//重写onActivityResult()方法
@override
protected void onActivityResult(int requestCode,int resultCode,Intent data){
//第一个参数为请求码,第二个参数为处理结果,第三个参数为携带返回数据的Intent
    switch(requestCode){
        case 1:
            if(resultCode == RESULT_OK){
                String returnedData = data.getStringExtra("data_return");
                Log.d("FirstActivity",returnedData);
            }
            break;
        default:
    }
    //由于在一个活动中可能会调用startActivityForResult()来启动很多活动
    //所以首先要检查requestCode判断数据来源
    //通过resultCode判断处理结果是否成功
}

//重写onBackPressed()方法,防止因按下Back键返回活动,导致数据没有传回
@override
public void onBackPressed(){
    Intent intent = new Intent();
    intent.putExtra("data_return","Hello FirstActivity");
    setResult(RESULT_OK,intent);
    finish();
}

整理学习自郭霖大佬的《第一行代码》
目前小白一名,持续学习Android中,如有错误请批评指正!

猜你喜欢

转载自blog.csdn.net/Nicholas1hzf/article/details/82659940
今日推荐