安卓初学者笔记(五):用白话讲明白Intent是什么

自学安卓开发可不是一个好玩的事儿,主要是网上的资料大多写的太深奥,有的只写理论和术语,有的只有代码没有解释,所以看了很多也不知道Intent的作用和如何实现,想必是自己的基础差过人品的原因。

其实想说明一个问题很简单,只需要三个步骤:1、举一个生活化的例子。2、说明在安卓环境下的应用方法、基本理论。3、再写一段代码演示给初学者即可。

Intent,翻译成“意图”,很有意思,很贴切,其实完全可以再大白话一点,就是“想干嘛”。想干嘛就是意图,它分为两种,显性意图和隐性意图。

显性意图

想像一下,如果中午带饭吃,带着一个包子,饿时就会想:我要吃包子。因为知道自己带了包子,还很好表达,随时都能吃,这个就叫“显性意图”。

通常显式意图用Intent.setComponent()或Intent.setClass()等方法,明确指定了要做什么事。比如:

Intent intent = new Intent();
intent.setClass(MainActivity.this, SecondActivity.class);
startActivity(intent);

这三行大概是说:

1、定义一个新的意图;

2、意图:设置一个类(当前的活动页,目标活动页);

3、启动刚才定义的意图。

这样就调用了一个新的Activity活动页面出来(需要自己先建立好),当然这些基本都是固定的格式,显性意图相对容易理解,没什么可解释的。

隐性意图

还有一种情况,中午没带饭,这个时候饿了,就会想:我想吃点东西……这个时候,就相对麻烦了,因为要决定是出去吃,还是叫外卖,吃什么品牌的,吃具体的什么东西。找助理秘书来帮忙吧,就对助理秘书,“我想……”她就晕了,所以必须再表达的清楚一点“我想吃……”,她大概猜出你要吃午饭,而不是其它什么东西,然后给你一个清单,你从清单上选择好,她就去买了。在这个过程中,你的想法就叫“隐性意图”,因为说的不是很明确,也有好几份外卖店可选。

从刚才的举例来看,吃自己带的包子效率最高,同样使用自己编写的Activity效率也是最高,问题是不能天天吃包子,偶尔还要有点别的需求,这个时候就可借助外卖了,也就是调用其它APP。

在程序开发的过程中,如果是调用自己的Activity,就像从自带的包子一样,指名道姓就可以了。如果想引用其它的程序,比如看网页,可能你手机里有好几个网页浏览器,到底要用哪个?就要像刚才点外卖的过程一样,至少要说清楚筛选条件,系统就可以帮你找出符合条件的APP,包括你自己写的Activity,请你选择。

 Android系统会根据隐式意图中你提前设置好动作条件(action)、类别(category)、数据条件(URI和数据类型)找到最合适的APP来处理程序的需求。“动作”、“类别”、“数据”条件,好比“吃”、“包子”、“肉馅”这个意思。

在哪里设置呢?就在AndroidManifest.xml文件里,这个通常叫“功能清单文件”,这里可以设置意图过滤,即intent-filter里写的内容。

以下是建立了一个新Activity后,需要在功能清单文件中添加的内容,注册了新Activity的名称和筛选条件

        

            
                
                
                
                
            

        
action的功能关键词是VIEW,是“浏览”。category是默认,data数据在这里指明了两条,如果有想用网络,指百度和优酷的,都符合我程序的筛选执行条件,其它的我不管。

在回到MainActivity里来写代码,比如在一个按钮里写了如下三行,只给程序一个条件setAction(注意黑体加粗与上边的加粗是对应的关系)。

Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setAction("android.intent.action.VIEW");
startActivity(intent);
这三行大概的意思是:定义新意图,新意图是浏览,启动新意图。

其中的"android.intent.action.VIEW"内容,是系统已经定义好的,初学者不需要我们修改什么。

再生成程序,执行看看什么样?

安卓初学者笔记(五):用白话讲明白Intent是什么_第1张图片

出现了好多可选择的应用,因为它们都适合刚才的隐式意图里的条件,就好比说“我要吃……”说的太模糊,就会选项太多,会给客户造成选择障碍。所以,现在我们要把条件再给程序说清楚点,把“类别”条件改为“数据”条件。

Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://www.baidu.com/"));
startActivity(intent);
数据条件指定的够确切了吧?我就要吃包子,我就要看百度。 再生成程序,执行看看什么样?

安卓初学者笔记(五):用白话讲明白Intent是什么_第2张图片

结果是只有两个应用程度符合隐式意图描述的条件。当然,如果我们打开的网页是优酷,同样也会出现这样的选项。如果打开的网页即不是优酷,也不是百度,那就会直接出系统自带的浏览器(因为我有这一个浏览器)。

因为我们在“功能清单文件”注册了我们的程序功能,在安装到手机上以后,不管哪个程序调用相关功能,比如在“记事本”APP要打开百度,也会显示我们刚才编写的Activity,是不是很有成就感?

安卓初学者笔记(五):用白话讲明白Intent是什么_第3张图片

Intent,是各个组件中互相通讯的关键纽带,除了启动Activity,还可以启动服务,绑定服务,通过intent还可以在广播之间传递数据。刚才我们是以“浏览网页”为例,隐性意图还可以:打开电话、短信软件,拨打指定号码(需要系统授权),发指定内容的短信(需要系统授权),播放指定音乐,安装和卸载指定的程序等等。

基本上,刚才我们讲了Intent的意思,显性意图和隐性意图的意思和应用案例,再回头翻翻理论的东西,想掌握这个知识点就不难了,其它更深入的内容需要大家继续找资料自学了。

把刚才的程序的代码共享给和我一样的初学者:

AndroidManifest.xml






    
        
            
            

        
    

    

        
            
            
            
            
        

    



activity_main.xml




    
MainActivity

package com.example.jeffersli.myapplicationintent;

import android.content.Intent;
import android.net.Uri;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    //打开指定网页
    public void browsePageClick(View view) {
        Intent intent = new Intent(Intent.ACTION_VIEW);
        intent.setData(Uri.parse("http://www.baidu.com/"));
        startActivity(intent);

    }

}

你可能感兴趣的:(初学者)