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就学到这里。

  • 相关阅读:
    2017-7-17/18 背包dp cf round 417 div2
    poj3667-Hotel-线段树-区间合并
    STL 总结
    c++ 用freopen简单的重定向,再也不怕debug了~
    dynamic programming 从入门到放弃
    java 输入数据
    数位dp
    ECJTU 2018 Summer Training 5
    ECJTU 2018 Summer Training 2
    dfs和bfs专题
  • 原文地址:https://www.cnblogs.com/nylcy/p/6514032.html
Copyright © 2011-2022 走看看