20200912 Android《第一行代码》(2)

活动是什么?

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

活动的基本用法
  1. layout
  2. 注册
Toast 屏幕提醒消息
@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.first);
        Button button1 = (Button) findViewById(R.id.button_1);
        button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(FirstActivity.this,"You clicked Button 1",Toast.LENGTH_LONG).show();
            }
        });
    }

Toast是Android系统提供的一种非常好的提醒方式,在程序中可以使用它将一些短小的信息通知给用户,这些信息会在一段事件后自动消失,并且不会占用任何屏幕空间。

Toast消息是一种凌驾在layout屏幕之上的提示消息,不需要注册插件,仅仅是一种调用方法。
调用: Toast.makeText(FirstActivity.this,“You clicked Button 1”,Toast.LENGTH_LONG).show();
静态方法makeText()创建一个Toast对象,然后调用.show()展示出来。
makeText需要三个参数

  1. 第一个是Content,也就是Toast要求的上下文;
  2. 第二个参数是Toast显示的文本内容;
  3. 第三个参数是Toast显示的时长,有两个内置常量可以选择。
    • Toast.LENGTH_LONG = 2s
    • Toast.LENGTH_SHORT = 1.5s
Menu 菜单

菜单:充分利用屏幕空间

  1. 首先要在res—menu—main下创建菜单项
<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" />
</menu>
  • item :创建一个具体的某一个菜单项
  • android:id 给这个菜单项一个唯一的标识
  • Android:title 给这个菜单项指定一个名称
public boolean onCreateOptionsMenu(Menu menu){
       getMenuInflater().inflate(R.menu.main,menu);
       return true;
   }
  1. 在activity中重写onCreateOptionsMenu方法

通过getMenuInflater()方法能够得到MenuInflater对象,再调用它的inflate方法就可以给当前互动创建菜单了。
inflate()方法接受两个参数

  • 第一个参数是用于指定我们通过哪一个资源文件来创建菜单
  • 第二个参数是用于指定我们的菜单项将添加到哪一个Menu对象中

return

  • true 显示菜单
  • false 不显示
  1. 编写菜单响应事件
@Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.add_item:
                Toast.makeText(this,"You clicked Add",Toast.LENGTH_SHORT).show();
                break;
            case R.id.remove_item:
                Toast.makeText(this,"You clicked Remove",Toast.LENGTH_SHORT).show();
                break;
            default:
        }
        return true;
    }

在onOptionsItemSelected方法中通过调用item.getItemId()方法来判断我们点击的是哪一个菜单项,然后对每一个菜单项加入自己的逻辑处理。

销毁一个活动
button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                finish()
            }
        });

finish()销毁一个活动。

使用Intent在活动之间穿梭

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

Intent一般可以分为两种:显式Intent 和 隐式Intent

显式Intent

构造方法

Intent(Context packageContext,Class<?>)

这个构造函数接收两个参数

  • 第一个参数Context要求提供一个启动活动的上下文
  • 第二个参数Class则指定想要启动的目标活动
    通过这个构造函数我们就能构建出Intent的意图

如何启动Intent呢?

startActivity()

这个方法专门用于启动活动,它接收一个Intent参数然后启动

示例:

   button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
                startActivity(intent);
            }
        });
隐式Intent
同应用之间不同活动Intent

首先我理解的显式是一个活动指向另一个活动,是从发起者的活动角度出发,我指向誰这样一个思路。不同的是隐式是一种策略匹配,是被调用者设计一种策略,只要调用者满足这种策略,我们就可以调用该活动。这里面有一个被动调用和主动匹配的关系,不知道理解的是不是有问题。??

首先为被调用的activity设计一个调用模式 / 匹配规则
在AndroidManifest.xml中注册活动

<activity android:name=".ThirdActivity">
            <intent-filter>
                <action android:name="com.example.test1.ACTION_START" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="com.example.test1.MY_CATEGORY" />
            </intent-filter>
        </activity>

设置两个参数

  • Action标签中指明了当前活动可以相应“ xxx ”里面的这个action
  • Category标签包含一些附件信息,更加精确地指明了当前的活动能够响应的Intent中还可能带有category
    只有action和category中的内容同时能够匹配上Intent中指定的action 和 category时,这个活动才能够响应Intent

构造方法

button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent("com.example.test1.ACTION_START");
                startActivity(intent);
            }
        });
  Intent intent = new Intent("com.example.test1.ACTION_START");

新建一个Intent包含两个参数(action,category)
start Intent ,同时匹配成功即可启动活动

button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent("com.example.test1.ACTION_START");
                intent.addCategory("com.example.test1.MY_CATEGORY");
                startActivity(intent);
            }
        });

添加category约束条件,精确匹配。

不同应用程序之间 Intent

可以通过隐式Intent调用不同的应用程序。

示例

button3.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(Intent.ACTION_VIEW);
                intent.setData(Uri.parse("http://wwww.baidu.com"));
                startActivity(intent);
            }
        });

这里面的语法解释一下

  • 首先指定了Intent的action是Intent.ACTION_VIEW,这是一个Android系统内置的动作,其常量是android.intent.action.view
  • 然后通过Uri.parse()将一个网址字符串解析成一个Uri对象
  • 再调用Intent的setData()方法将这个Uri对象传递进去

setData 方法接收一个Uri对象
Uri.parse用于解析一个字符串

配置 data 标签
用于精确地指定当前活动能够响应什么类型的数据

  • android:scheme 用于指定数据的协议部分。如http
  • android:host 用于指定数据的主机名部分。
  • android:port 用于指定数据的端口部分,一般紧随在主机名之后。
  • android:path 用于指定主机名和端口之后的部分,如一段网址中跟在域名之后的内容
  • android:mimeType 用于指定可以处理的数据类型,允许使用通配符的方式进行指定。

只有当data标签中指定的内容和Intent中携带的Data数据完全一致时,当前互动才能够响应该Intent。通常情况下只需要指定少数几个即可,如android:scheme

配置data标签

 <intent-filter>
                <action android:name="com.example.test1.ACTION_START" />

                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="com.example.test1.MY_CATEGORY" />

				<data android:scheme="http"  />
            </intent-filter>
  • action : android.intent.action.VIEW
  • category : android.intent.category.DEFAULT
  • data : http

该活动可以像浏览器一样,能够响应一个打开网页的Intent

data协议

  • http
  • geo
  • tel

示例

button4.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(Intent.ACTION_DIAL);
                intent.setData(Uri.parse("tel:10086"));
                startActivity(intent);
            }
        });
使用Intent传递数据
  1. 向下一个活动传递数据

传递数据部分

button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
                String data = "Hello n";
                intent.putExtra("extra_data",data);
                startActivity(intent);
            }
        });

通过putExtra()方法传递一个字符串

  • 参数一:键,用于后面从Intent中取值
  • 参数二:真正要传递的数据

接收数据并使用

        Intent intent1 = getIntent();
        String data = intent1.getStringExtra("extra_data");
  • 首先通过getIntent()方法获取到用于启动该活动的intent
  • 然后调用getStringExtra()方法,传入相应的键值
    • getStringExtra
    • getIntExtra
    • getBooleanExtra
  1. 返回数据给上一个活动

startActivityForResult()
用于启动活动,但这个方法期望在活动销毁的时候能够返回一个结果给上一个活动。
两个参数

  • 参数一:intent
  • 参数二:请求码,用于在之后的回调中判断数据来源

被调用activity

 button4.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent();
                intent.putExtra("data_return","Hello Return");
                setResult(RESULT_OK,intent);
                finish();
            }
        });
  1. 首先构建new了一个intent
  2. 把需要传递的数据放入intent中(“键值”,数据内容)
  3. 使用setResult()方法向上一个活动返回数据
    • setResult方法接收两个参数
      • 参数一:用于向上一个活动返回处理结果,一版只能使用RESULT_OK或RESULT_CANCELED这两个值
      • 参数二:把带有数据的intent对象传递回去
  4. 最后调用finish()方法销毁当前活动

调用activity

 Intent intent = new Intent(ThirdActivity.this,ForthActivity.class);
 startActivityForResult(intent,1);
  • 新建一个intent
  • 用 startActivityForResult()方法启动该intent ,设置回溯值1,请求码
 @Override
    protected void onActivityResult(int requestCode,int resultCode,Intent data){
        switch (requestCode){
            case 1:
                if (resultCode == RESULT_OK){
                    String returnedData = data.getStringExtra("data_return");
                    Log.d("ThirdActivity",returnedData);
                }
                break;
            default:
        }
    }

重写onActivityResult() 三个参数

  • requestCode:启动活动是传入的请求码
  • resultCode:我们返回数据时传入的处理结果——即RESULT_OK
  • 数据data:即下带返回数据的intent
    处理顺序:
  1. 确定请求码:回溯是哪一个activity回传的数据
  2. 确定处理结果:activity是否完成了工作工作执行RESULT_OK或RESULT_CANCELED
  3. 获取回传数据:intent
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值