zoukankan      html  css  js  c++  java
  • Android学习总结(十)———— Intent的使用

    一.Intent的基本概念

      我们已经学习完了Android的四大组件了,在四大组件中我们用得最多的是Intent-Filter。Intent含义就是你想利用它调用哪个组件实现相关的功能,比如调用相机组件实现拍照、调用Contact组件获取联系人信息等。通过传递Intent对象调用的这些组件功能时,这些组件可能是安卓系统自身提供的,也可能是你自定义的。

      Intent 是一个将要执行的动作的抽象的描述,一般来说是作为参数来使用,由Intent来协助完成Android各个组件之间的通讯。比如说调用startActivity()来启动一个activity,或者broadcaseIntent()来传递给所有感兴趣的BroadcaseReceiver, 再或者由startService()/bindservice()来启动一个后台的service.所以可以看出来,intent主要是用来启动其他的activity 或者service,所以可以将intent理解成activity之间的粘合剂。 

    二.显式Intent与隐式Intent的区别

    2.1 显式Intent

      通过组件名指定启动的目标组件,比如startActivity(new Intent(A.this,B.class)); 每次启动的组件只有一个。

    2.2隐式Intent

      不指定组件名,而指定Intent的Action,Data,或Category,当我们启动组件时, 会去匹配AndroidManifest.xml相关组件的Intent-filter,逐一匹配出满足属性的组件,当不止一个满足时, 会弹出一个让我们选择启动哪个的对话框。

    三.Intent的七个属性

    3.1 ComponentName(组件名称)

      指定了ComponentName属性的Intent已经明确了它将要启动哪个组件,因此这种Intent被称为显式Intent,没有指定ComponentName属性的Intent被称为隐式Intent。隐式Intent没有明确要启动哪个组件,应用会根据Intent指定的规则去启动符合条件的组件。示例如下:

        ComponentName componentName = new ComponentName(MainActivity.this,NextActivity.class);
        Intent intent = new Intent();
        intent.setComponent(componentName);
        startActivity(intent);
        //简化为
        Intent intent = new Intent(MainActivity.this,NextActivity.class);
        startActivity(intent);

    3.2 Action(动作)

      一个普通的字符串,代表Intent要完成的一个抽象动作,比如发信息的一个权限,而具体由哪个组件来完成Intent并不负责,就是仅仅知道会用这个动作,谁来完成就交给Intent-filter进行筛选。

      要注意在java中的Action和Intent-filter中的格式是不一样的,比如:<action android name = "android.intent.action.CALL"> 和 intent.setAction(Intent.ACTION_CALL)。

    3.3 Category(类别)

      同样是普通的字符串,Category则用于为Action提供额外的附加类别信息,两个通常结合使用,一个Intent对象只能有一个Action,但是能有多个Category。

      同样在java与Intent-filter中的格式也是不一样的,比如:<category android name = android.intent.category .DEFAULT> 和 intent.addCategorie(Intent.CATEGORY_DEFAULT);可调用removeCategory()删除上次添加的种类,也可以getCategories()方法获取当前对象所包含全部种类。

    3.4  Data(数据),Type(MIME类型)

      Data属性通常用于向Action属性提供操作的数据。Data属性接受一个Uri对象,一个Uri对象通常通过如下形式的字符串来表示:scheme://host:port/path(参数依次为协议头,主机,端口,路径)

      Type属性则用于明确指定Data属性所指定数据的类型或MIME类型,通常来说,当Intent不指定Data属性时,Type属性才会起作用,否则Android系统会根据Data属性值来分析数据类型。

      

    3.5 Extras(额外)

      Extra属性用于在多个Action之间进行数据交换,extra的属性值应该是一个Bundle对象,Bundle对象就像一个Map对象,有自己的key-value,进行数据存储。

    3.6 Flags(标记)

      表示不同来源的标记,多数用于只是Android如何启动Activity以及启动后如何对待,标记都定义在Intent类中。也可以通过FLAG属性为intent添加一些额外的控制旗标。如:intent.addFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT);  

    四.示例代码

    4.1 显示Intent

      这个用得很多,直接就上例子,代码如下:

    package com.nyl.intenttest;
    
    import android.app.Activity;
    import android.content.Intent;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Button;
    
    public class MainActivity extends Activity implements View.OnClickListener {
    
        private Button btnHome;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            btnHome = (Button) findViewById(R.id.btnHome);
            btnHome.setOnClickListener(this);
        }
    
        @Override
        public void onClick(View view) {
            switch (view.getId()){
                case R.id.btnHome:
                    Intent it = new Intent();
                    it.setAction(Intent.ACTION_MAIN);
                    it.addCategory(Intent.CATEGORY_HOME);
                    startActivity(it);
                    break;
            }
        }
    }

      这是一个非常简单的例子,点击按钮后就会跳转到系统桌面,就不上运行的效果图了,动手去操作吧!

    4.2 隐式Intent

      点击按钮后,所有Action为VIEW的Activity被筛选出来,由用户进一步选择,代码如下:

    package com.nyl.intenttest;
    
    import android.app.Activity;
    import android.content.Intent;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Button;
    
    public class MainActivity2 extends Activity implements View.OnClickListener {
    
        private Button btnTwo;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main2);
            btnTwo = (Button) findViewById(R.id.btnTwo);
            btnTwo.setOnClickListener(this);
        }
    
        @Override
        public void onClick(View view) {
            switch (view.getId()) {
                case R.id.btnTwo:
                    Intent it = new Intent();
                    it.setAction(Intent.ACTION_VIEW);
                    startActivity(it);
                    break;
            }
        }
    }

      最后在第二个Activity的Intent中添加以下代码,如下所示:

     <activity android:name=".MainActivity2"
                android:label="第二个Activity">
                <intent-filter>
                    <action android:name="android.intent.action.VIEW"/>
                    <category android:name="android.intent.category.DEFAULT"/>
                </intent-filter>
            </activity>

      运行效果图,如下:

      

      一个简单的显式Intent和隐式Intent就学到这里。

  • 相关阅读:
    A1052. Linked List Sorting (25)
    A1032. Sharing (25)
    A1022. Digital Library (30)
    A1071. Speech Patterns (25)
    A1054. The Dominant Color (20)
    A1060. Are They Equal (25)
    A1063. Set Similarity (25)
    电子码表
    矩阵键盘
    对象追踪、临时对象追踪、绝对坐标与相对坐标
  • 原文地址:https://www.cnblogs.com/nylcy/p/6514032.html
Copyright © 2011-2022 走看看