intent_intentservice - CSDN
intent 订阅
Intent(意图)主要是解决Android应用的各项组件之间的通讯。Intent负责对应用中一次操作的动作、动作涉及数据、附加数据进行描述,Android则根据此Intent的描述,负责找到对应的组件,将 Intent传递给被调用的组件,并完成组件的调用。因此,Intent在这里起着一个媒体中介的作用,专门提供组件互相调用的相关信息,实现调用者与被调用者之间的解耦。例如,在一个联系人维护的应用中,当我们在一个联系人列表屏幕(假设对应的Activity为listActivity)上,点击某个联系人后,希望能够跳出此联系人的详细信息屏幕(假设对应的Activity为detailActivity)为了实现这个目的,listActivity需要构造一个 Intent,这个Intent用于告诉系统,我们要做“查看”动作,此动作对应的查看对象是“某联系人”,然后调用startActivity (Intent intent),将构造的Intent传入,系统会根据此Intent中的描述,到ManiFest中找到满足此Intent要求的Activity,系统会调用找到的 Activity,即为detailActivity,最终传入Intent,detailActivity则会根据此Intent中的描述,执行相应的操作。 展开全文
Intent(意图)主要是解决Android应用的各项组件之间的通讯。Intent负责对应用中一次操作的动作、动作涉及数据、附加数据进行描述,Android则根据此Intent的描述,负责找到对应的组件,将 Intent传递给被调用的组件,并完成组件的调用。因此,Intent在这里起着一个媒体中介的作用,专门提供组件互相调用的相关信息,实现调用者与被调用者之间的解耦。例如,在一个联系人维护的应用中,当我们在一个联系人列表屏幕(假设对应的Activity为listActivity)上,点击某个联系人后,希望能够跳出此联系人的详细信息屏幕(假设对应的Activity为detailActivity)为了实现这个目的,listActivity需要构造一个 Intent,这个Intent用于告诉系统,我们要做“查看”动作,此动作对应的查看对象是“某联系人”,然后调用startActivity (Intent intent),将构造的Intent传入,系统会根据此Intent中的描述,到ManiFest中找到满足此Intent要求的Activity,系统会调用找到的 Activity,即为detailActivity,最终传入Intent,detailActivity则会根据此Intent中的描述,执行相应的操作。
信息
作    用
解决Android应用各项组件的通讯
提供信息
组件互相调用的相关信息
实现目的
调用者与被调用者之间的解耦
中文名
意图
性    质
媒体中介
外文名
intent
intent术语解释
在Android参考文档中,对Intent的定义是执行某操作的一个抽象描述(确实很抽象)。我们先来看看这里的抽象描述,到底描述了什么。首先,是要执行的动作(action)的一个简要描述,如VIEW_ACTION(查看)、EDIT_ACTION(修改)等,Android为我们定义了一套标准动作:MAIN_ACTIONVIEW_ACTIONEDIT_ACTIONPICK_ACTIONGET_CONTENT_ACTIONDIAL_ACTIONCALL_ACTIONSENDTO_ACTIONANSWER_ACTIONINSERT_ACTIONDELETE_ACTIONRUN_ACTIONLOGIN_ACTIONCLEAR_CREDENTIALS_ACTIONSYNC_ACTIONPICK_ACTIVITY_ACTIONWEB_SEARCH_ACTION此外,我们还可以根据应用的需要,定义我们自己的动作,并可定义相应的Activity来处理我们的自定义动作。其次,是执行动作要操作的数据(data),Android中采用指向数据的一个URI来表示,如在联系人应用中,一个指向某联系人的URI可能为:content://contacts/1。这种URI表示,通过 ContentURI这个类来描述,具体可以参考android.net.ContentURI类的文档。以联系人应用为例,以下是一些action / data对,及其它们要表达的意图:VIEW_ACTION content://contacts/1-- 显示标识符为"1"的联系人的详细信息EDIT_ACTION content://contacts/1-- 编辑标识符为"1"的联系人的详细信息VIEW_ACTION content://contacts/-- 显示所有联系人的列表PICK_ACTION content://contacts/-- 显示所有联系人的列表,并且允许用户在列表中选择一个联系人,然后把这个联系人返回给父activity。例如:电子邮件客户端可以使用这个Intent,要求用户在联系人列表中选择一个联系人另外,除了action和data这两个重要属性外,还有一些附加属性:category(类别),被执行动作的附加信息。例如 LAUNCHER_CATEGORY 表示Intent 的接受者应该在Launcher中作为顶级应用出现;而ALTERNATIVE_CATEGORY表示当前的Intent是一系列的可选动作中的一个,这些动作可以在同一块数据上执行。type(数据类型),显式指定Intent的数据类型(MIME)。一般Intent的数据类型能够根据数据本身进行判定,但是通过设置这个属性,可以强制采用显式指定的类型而不再进行推导。component(组件),指定Intent的的目标组件的类名称。通常 Android会根据Intent 中包含的其它属性的信息,比如action、data/type、category进行查找,最终找到一个与之匹配的目标组件。但是,如果 component这个属性有指定的话,将直接使用它指定的组件,而不再执行上述查找过程。指定了这个属性以后,Intent的其它所有属性都是可选的。extras(附加信息),是其它所有附加信息的集合。使用extras可以为组件提供扩展信息,比如,如果要执行“发送电子邮件”这个动作,可以将电子邮件的标题、正文等保存在extras里,传给电子邮件发送组件。总之,action、 data/type、category和extras 一起形成了一种语言。这种语言使系统能够理解诸如“查看某联系人的详细信息”之类的短语。随着应用不断的加入到系统中,它们可以添加新的action、 data/type、category来扩展这种语言。应用也可以提供自己的Activity来处理已经存在的这样的“短语”,从而改变这些“短语”的行为。
收起全文
精华内容
参与话题
  • Intent 简介与详解

    千次阅读 2017-12-30 23:32:10
    1.Intent作用Intent是一个将要执行的动作的抽象的描述,解决Android应用的各项组件之间的通讯,Intent负责对应用中一次操作的动作、动作涉及数据、附加数据进行描述,Android则根据此Intent的描述,负责找到对应的...

    1.Intent作用

    Intent是一个将要执行的动作的抽象的描述,解决Android应用的各项组件之间的通讯,Intent负责对应用中一次操作的动作、动作涉及数据、附加数据进行描述,Android则根据此Intent的描述,负责找到对应的组件,将 Intent传递给调用的组件,并完成组件的调用。intent主要用来启动activity或者service(并携带需要传递的参数信息)。

    2.Intent形式

    意图包括:Action(动作),Category(附加信息),Data(数据,具体内容),Tpye(类型)等等,举个例子,说白了意图就是启动一个组件的完整的动作信息,就像打人,打就是Action动作,人就是Data内容,而Type就是类型,打什么人呢?打坏人,type就是坏人的类型,只有这些信息全了才能执行一个完整的意图,当然还有一些信息,比如scheme就是URI类型的数据的前缀,还有host主机名,path路径等。

    • (1).显式意图(Explicit Intents)

      • 调用Intent.setComponent()或Intent.setClass()方法明确指定了组件名的Intent为显式意图,显式意图明确指定了Intent应该传递给哪个组件。
        
        //  1.创建Intent实例化对象几种方式  
        Intent intent = new Intent();  
        // 跳转到与该工程下的(同一个Application中的)activity或者service
        intent.setClass(Context packageContext, Class<?> cls) ;           // 跳转到不同Applicaiton的activity或者service
        intent.setClassName(Context packageContext, String className) ;   
        //内部调用setComponent(ComponentName),可以激活外部应用    
        intent.setComponent(new ComponentName(this, Class<?> cls));  
        intent.setComponent(new ComponentName(this, "package Name"));  
        
    • (2).隐式意图(Implicit Intents)
      • 没有明确指定组件名的Intent为隐式意图。系统会根据隐式意图中设置的 动作(action)、类别(category)、数据URI等来匹配最合适的组件。
      • 1).action:
      • The general action to be performed, such as ACTION_VIEW, ACTION_EDIT, ACTION_MAIN, 包括Android 系统指定的 和 自定义的
    intent.setAction("com.baidu.action.TEST"); 
    <action android:name="com.baidu.action.TEST"/>  
    • 2).data
      • expressed as a Uri, The data to operate on, such as a person record in the contacts database.
    Action Data(Uri) Content
    ACTION_VIEW content://contacts/people/1 Display information about the person whose identifier is “1”.
    ACTION_VIEW tel:123 Display the phone dialer with the given number filled in.
    ACTION_DIAL tel:123 Display the phone dialer with the given number filled in.
    intent.setData(Uri.parse("baidu://www.baidu.com/news"));  
    <!-- android:path 内容字符串需要以 / 开头 -->  
    <data android:scheme="baidu" android:host="www.baidu.com" android:path="/news"/>  
    • 3).category

      • Gives additional information about the action to execute.
      • 注意:项目清单的xml文件意图过滤器中必须指定 android.intent.category.DEFAULT类别,Activities will very often need to support the CATEGORY_DEFAULT so that they can be found by Context.startActivity,or Context can’t the acitivity component

        intent.addCategory("com.baidu.category.TEST");  
        <!-- 必须指定CATEGORY_DEFAULT,只有这样startActivity(intent)才能找到 -->  
        <category android:name="com.baidu.category.TEST" />  
        <category android:name="android.intent.category.DEFAULT" />  
    • 4).type

      • Specifies an explicit type (a MIME type) of the intent data.

        intent.setType("image/jpeg");  
        <data android:mimeType="image/*" />  
      • 注意:Java文件中data Uri 和 type不能同时使用各自的函数进行设定,因为使用type时会把Uri清除掉,可以使用setDataAndType方法设定

        intent.setDataAndType(Uri.parse("baidu://www.baidu.com/news"), "image/jpeg");  
    <data android:mimeType="image/*" android:scheme="baidu" android:host="www.baidu.com" android:path="/news"/>  
    • (3).两者的使用区别

      • 显式意图一般在应用的内部使用,因为在应用内部已经知道了组件的名称,直接调用就可以了。
        当一个应用要激活另一个应用中的Activity时,只能使用隐式意图,根据Activity配置的意图过滤器建一个意图,让意图中的各项参数的值都跟过滤器匹配,这样就可以激活其他应用中的Activity。所以,隐式意图是在应用与应用之间使用的。

    3.Activity的Intent数据传递

    //Activity间的数据传递  
    //  1.直接向intent对象中传入键值对(相当于Intent对象具有Map键值对功能)  
    intent.putExtra("first", text1.getText().toString());  
    intent.putExtra("second", text2.getText().toString());  
    
    //  2.新建一个Bundle对象 ,想该对象中加入键值对,然后将该对象加入intent中  
    Bundle bundle = new Bundle();  
    bundle.putString("first", "zhang");  
    bundle.putInt("age", 20);  
    intent.putExtras(bundle);  
    
    //  3.向intent中添加ArrayList集合对象  
    intent.putIntegerArrayListExtra(name, value);  
    intent.putIntegerArrayListExtra(name, value);     
    
    //  4.intent传递Object对象(被传递的对象的类实现Parcelable接口,或者实现Serialiable接口)  
    public Intent putExtra(String name, Serializable value)  
    public Intent putExtra(String name, Parcelable value)   

    4.Activity退出的返回结果

    //  1.通过startActivityForResult方式启动一个Activity  
    MainActivity.this.startActivityForResult(intent, 200);  //intent对象,和  requestCode请求码  
    
    //  2.新activity设定setResult方法,通过该方法可以传递responseCode 和 Intent对象  
    setResult(101, intent2);                                //responseCode响应码 和 intent对象  
    
    //  3.在MainActivity中覆写onActivityResult方法,新activity一旦退出,就会执行该方法  
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
        Toast.makeText(this, data.getStringExtra("info")+"requestCode:"+requestCode+"resultCode:"+resultCode, Toast.LENGTH_LONG).show();  
    }  

    5.设置IntentFilter当前应用打开(应用多选)

    <activity  
        android:name="com.example.player.MainActivity"  
        android:label="@string/app_name" >  
        <intent-filter>  
            <action android:name="android.intent.action.MAIN" />  
    
            <category android:name="android.intent.category.LAUNCHER" />  
        </intent-filter>  
    
        <!-- 指定action, data类型为video, category为default,设置完成之后,当打开video文件时,本应用作为可选打开软件 -->  
        <intent-filter>  
            <action android:name="android.intent.action.VIEW" />  
    
            <data android:mimeType="video/*" />  
    
            <category android:name="android.intent.category.DEFAULT" />  
        </intent-filter>  
    </activity>  

    使用隐式意图启动系统短信,并给指定号码发送信息

    /** 
         * 隐式意图的方法启动系统短信 
         *  
         * 简单概括就是: 意图包括:Action(动作),Category(附加信息),Data(数据,具体内容),Tpye(类型)等等,举个例子, 
         * 说白了意图就是启动一个组件的的完整的动作信息 
         * ,就像打人,打就是Action动作,人就是Data内容,而Type就是类型,打什么人呢?打坏人,type就是坏指的类型 
         * ,只有这些信息全了才能执行一个完整的意图 
         * ,当然还有一些信息,比如scheme就是URI类型的数据的前缀,就像这个例子当中的sms:,还有host主机名,path路径等 
         *  
         * @param view 
         */  
        public void startOne(View view) {  
            Intent intent = new Intent();  
            intent.setAction("android.intent.action.SENDTO");// 发送信息的动作  
            intent.addCategory("android.intent.category.DEFAULT");// 附加信息  
            intent.setData(Uri.parse("sms:10086"));// 具体的数据,发送给10086  
            startActivity(intent);  
        }  
    • 自定义的隐式意图调用:
      • 首先是先在清单文件中进行注册:
    <?xml version="1.0" encoding="utf-8"?>  
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"  
        package="net.loonggg.intent"  
        android:versionCode="1"  
        android:versionName="1.0" >  
    
        <uses-sdk  
            android:minSdkVersion="8"  
            android:targetSdkVersion="17" />  
    
        <application  
            android:allowBackup="true"  
            android:icon="@drawable/ic_launcher"  
            android:label="@string/app_name"  
            android:theme="@style/AppTheme" >  
            <activity  
                android:name="net.loonggg.intent.MainActivity"  
                android:label="@string/app_name" >  
                <intent-filter>  
                    <action android:name="android.intent.action.MAIN" />  
    
                    <category android:name="android.intent.category.LAUNCHER" />  
                </intent-filter>  
            </activity>  
            <activity android:name="net.loonggg.intent.SecondActivity" >  
                <intent-filter>  
    
                    <!-- 自定义的动作 -->  
                    <action android:name="net.loonggg.xxx" />  
                    <!-- 自定义的scheme和host -->  
                    <data  
                        android:host="www.baidu.com"  
                        android:path="/person"  
                        android:scheme="loonggg" />  
                    <!-- 自定义的类型 -->  
                    <data android:mimeType="person/people" />  
                    <!-- 附加信息 -->  
                    <category android:name="android.intent.category.DEFAULT" />  
                </intent-filter>  
            </activity>  
        </application>  
    
    </manifest>  
    • 自定义设置的Activity:
    <activity android:name="net.loonggg.intent.SecondActivity" >  
               <intent-filter>  
    
                   <!-- 自定义的动作 -->  
                   <action android:name="net.loonggg.xxx" />  
                   <!-- 自定义的scheme和host -->  
                   <data  
                       android:host="www.baidu.com"  
                       android:path="/person"  
                       android:scheme="loonggg" />  
                   <!-- 自定义的类型 -->  
                   <data android:mimeType="person/people" />  
                   <!-- 附加信息 -->  
                   <category android:name="android.intent.category.DEFAULT" />  
               </intent-filter>  
           </activity>  
    • 代码调用自定义
    /** 
     * 通过自定义的隐式意图启动 
     *  
     * @param view 
     */  
    public void startTwo(View view) {  
        Intent intent = new Intent();
        intent.setAction("net.loonggg.xxx");         
        intent.addCategory("android.intent.category.DEFAULT");  
        intent.setDataAndType(Uri.parse("loonggg://www.baidu.com/person"),  
        "person/people");  
        startActivity(intent);  
    }  

    注意:

    intent.setData(data)和intent.setType(type)注意这两个方法会互相清除,意思就是:如果先设置setData(data)后设置setType(type),那么后设置的setType(type)会把前面setData(data)设置的内容清除掉,而且会报错,反之一样,所以如果既要设置类型与数据,那么使用setDataAndType(data,type)这个方法。

    展开全文
  • 安卓——Intent(实现页面跳转的两种方法)

    万次阅读 多人点赞 2018-02-27 17:35:00
    下图中两个不同的方法就是两种页面之间跳转的情况1&gt;跳转不返回数据2&gt;跳转返回数据实例:第一种启动方式(跳转不返回数据)第二种启动方式(跳转返回数据)先看第一种:点击第一种...下面是所有代码An...


    下图中两个不同的方法就是两种页面之间跳转的情况

    1>跳转不返回数据

    2>跳转返回数据



    实例:

    第一种启动方式(跳转不返回数据)

    第二种启动方式(跳转返回数据)

    先看第一种:


    点击第一种启动方式按钮会出现右边的图,然后再点击Button按钮返回左边的界面,TextView中的内容没变。

    再看第二种启动方式

    不同的是,点击Button按钮返回左边的界面,TextView中的内容变成了你好。



    下面是所有代码

    AndroidManifest.xml

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.lenovo.intent">
    
        <application
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:roundIcon="@mipmap/ic_launcher_round"
            android:supportsRtl="true"
            android:theme="@style/AppTheme">
            <activity android:name=".MainActivity">
    
            </activity>
            <activity android:name="com.example.lenovo.intent.firstactivity">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
            <activity android:name="com.example.lenovo.intent.Secondactivity">
    
            </activity>
        </application>
    
    </manifest>

    factivity

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        >
    
        <Button
            android:id="@+id/bt1__first"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="第一种启动方式" />
    
        <Button
            android:id="@+id/bt2__second"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="第二种启动方式" />
    
        <TextView
            android:id="@+id/textView1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="吧第二个页面回传的数据显示出来" />
    
    </LinearLayout>
    

    sactivity

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    
        <Button
            android:id="@+id/button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="Button" />
    </LinearLayout>
    

    firstactivity.java

    package com.example.lenovo.intent;
    
    import android.app.Activity;
    import android.content.Intent;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Button;
    import android.widget.TextView;
    
    /**
     * Created by lenovo on 2018/2/27.
     */
    
    public class firstactivity extends Activity {
        private Button bt1;
        private Button bt2;
        private TextView tv;
        @Override
        protected void onCreate(Bundle savedInstanceState){
            super.onCreate(savedInstanceState);
            setContentView(R.layout.factivity);
    
            /*
               通过点击bt1实现界面之间的跳转
               1.通过startActivity的方式来实现
               1>初始Intent(意图)
             */
    
    
            bt1=(Button) findViewById(R.id.bt1__first);
            bt2=(Button)findViewById(R.id.bt2__second);
            tv=(TextView) findViewById(R.id.textView1);
            //给bt1添加点击事件
            bt1.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    /*
                    第一个参数:上下文对象this
                    第二个参数:目标文件
                     */
                    Intent intent = new Intent(firstactivity.this,Secondactivity.class);
                    startActivity(intent);
    
                }
            });
    
            /*
            2.通过startActivityForResult的方式来实现
             */
            //给bt2添加点击事件
            bt2.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    Intent intent = new Intent(firstactivity.this,Secondactivity.class);
    
                    /*
                    第一个参数:Intent对象
                    第二个参数:请求的一个标识
                     */
                    startActivityForResult(intent,1);
                }
            });
        }
    
        /*
        通过startActivityForResult的方式接受返回数据的方法
        requestCode:请求的标志,给每个页面发出请求的标志不一样,这样以后通过这个标志接受不同的数据
        resultCode:这个参数是setResult(int resultCode,Intent data)方法传来的,这个方法用在传来数据的那个页面
         */
        @Override
        protected  void onActivityResult(int requestCode,int resultCode ,Intent data){
            super.onActivityResult(requestCode,resultCode,data);
            if(requestCode==1&&resultCode==2){//当请求码是1&&返回码是2进行下面操作
                String content=data.getStringExtra("data");
                tv.setText(content);
            }
        }
    }
    

    Secondactivity.java

    package com.example.lenovo.intent;
    
    import android.app.Activity;
    import android.content.Intent;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Button;
    
    /**
     * Created by lenovo on 2018/2/27.
     */
    
    public class Secondactivity extends Activity {
        private Button bt;
        String content="你好";//想返回的内容
        @Override
        protected void onCreate( Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.sactivity);
    
            /*
            第二个页面什么时候给第一个页面回传数据
            回传到第一个页面的实际上是一个Intent对象
             */
            bt=(Button) findViewById(R.id.button);
            bt.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    Intent data = new Intent();
                    //name相当于一个key,content是返回的内容
                    data.putExtra("data",content);
                    //resultCode是返回码,用来确定是哪个页面传来的数据,这里设置返回码是2
                    //这个页面传来数据,要用到下面这个方法setResult(int resultCode,Intent data)
                    setResult(2,data);
                    //结束当前页面
                    finish();
                }
            });
        }
    }
    

    展开全文
  • Intent的基本知识

    万次阅读 2018-09-28 08:21:20
    我们知道,Intent 是一个消息传递对象,使用它可以向其他Android组件请求操作。Intent的基本用途主要包括:启动 Activity、启动服务、传递广播。Intent分为显式Intent和隐式Intent。下面我通过启动Activity来讲解...

    我们知道,Intent 是一个消息传递对象,使用它可以向其他Android组件请求操作。Intent的基本用途主要包括:启动 Activity、启动服务、传递广播。Intent分为显式Intent和隐式Intent。下面我通过启动Activity来讲解学习Intent。

    Intent对象可以封装传递下面6种信息:

    1. 组件名称(ComponentName)
    2. 动作(Action)
    3. 种类(Category)
    4. 数据(Data)
    5. 附件信息(Extra)
    6. 标志(Flag)

    下面来讲解这些信息

    1、组件名称(CompomentName)

    组件名称指定要访问的组件,但也是构建显式 Intent 的一项重要信息,如下所示:

    Intent intent = new Intent(LoginActivity.this, HomeActivity.class);

    startActivity(intent);

    这样我们就启动了HomeActivity组件。

    通过构造函数指定组件名称是我们常用的方式,此外还可以通过以下三种方法指定组件名称

    Intent setClass (Context packageContext,  Class<?> cls);

    Intent setClassName (Context packageContext, String className);

    Intent setClassName (String packageName, String className);

    Intent setComponent (ComponentName component)

    这里首先需要说明是的CompomentName对象,它定义了一个组件的基本信息,通过Android的源代码我们可以看到,其实不论哪种方法,最终Intent都会创建一个CompomentName对象封装被调用的组件信息。

    其次我们来看一下Intent setClassName (String packageName, String className);这个方法。packageName指的是组件所属APP的包名。也就是AndroidManifest.xml中指定的包名,如下图所示:

    最后,需要说明的是,如果传递字符串形式的className,必须指定类的全名,包括类所属的命名空间。下面给出了一个样例代码:

    Intent intent = new Intent();

    intent.setClassName("com.practise.salary.nvwa", "com.practise.salary.nvwa.HomeActivity");

    startActivity(intent);

    设置Intent的组件名称,调用相关的组件,我们称为显式调用,一般用于调用APP自身的组件,当然,我们也可以通过显式调用其他APP的组件,后面讲解显示调用时,我们在来学习。

    2、动作(Action)

    所谓动作就是与Activity、Service、BroadcastRecvier绑定的一个字符串,通常在AndroidManifest.xml声明组件时,设置动作参数,如下图所示:

    我们可以通过设置Action属性,调用相关的组件,这称为隐式调用。

    一般我们通过Intent的setAction方法设置Intent的动作,这样系统会根据动作中指定的字符串查找匹配的组件。如下所示代码:

    Intent intent = new Intent();

    intent.setAction("android.intent.action.MAIN");

    startActivity(intent);

    当我们定义自己的操作,建议将应用的软件包名称作为前缀,动作名称用大写。

    3、种类(Category)

    运行上面的代码,大家会发现,弹出了一个选择框,选在调用那个组件,如下图所示:

    之所以会出现这种情况,是因为动作“android.intent.action.MAIN”对应的组件不止一个,Android系统无法判断到底调用那个组件(详细的筛选过程将在后面过滤规则中讲解)。

    Intent的Category的就是为了解决这类冲突问题的,Category的设置也是在AndroidManifest.xml文件中完成,如下图所示:

    Category也是一个字符串,我们可以通过addCategory为Intent添加Category,可以添加多个Category,如下面代码所示:

    Intent intent = new Intent();

    intent.setAction("com.practise.salary.nvwa.action.HOME");

    /*

    我们可以不用手动添加android.intent.category.DEFAULT,系统会自动添加这个Category

    */

    intent.addCategory("android.intent.category.DEFAULT");  

    startActivity(intent);

     我们可以通过文件夹、文件类比Category和Action。

     4、数据(Data)

    在Intent的隐式调用中,系统要根据请求对满足条件的组件进行筛选,这就是Intent的筛选机制。筛选条件除了Action、Category外,还有一个就是Data。此外Data还承担了简单的数据传递工作。

    组件Data的申明如下图所示:

    下面我们学习一下Intent的Data属性。

    Data包括MIME Type和URI。

    MIME Type指数据的类型,例如:video/mp4,video/avi通常我们通过

    Intent setType (String type)

    或者

    Intent setTypeAndNormalize (String type)

    完成MINE Type的设置。不同之处在于setTypeAndNormalize可以规范MINE Type。

    URI,统一资源标识符(Uniform Resource Identifier,或URI)是一个用于标识某一资源名称的字符串,URI可以表示成如下格式:

    scheme://host:port/path

           其中

    1. scheme:协议表示,如http,https,ftp,content等;
    2. host:主机名称
    3. port:端口号
    4. path:具体的资源路径;

    我们常见的URL地址就是一种特殊的URI。

    我们可以通过

     

    Intent setData (Uri data)

    Intent setDataAndNormalize (Uri data)

    来设置Intent的URI,注意此处需要传递的是一个Uri对象,该对象封装了具体的URI,我们采用如下静态方法江URI字符串转换成URI对象。

    Uri parse (String uriString)

    此外我们还可以调用setDataAndType一次性设置URI和MIME Type。

    Intent setDataAndType (Uri data, String type)

    Intent setDataAndTypeAndNormalize(Uri data, String type)

    需要注意的是,当我们调用setType方法设置MIME Type,会自动清理URI的属性值,当调用setData方法来设置URI时,会自动清理MIME Type的值,如果要同时设置URI和MIMIE Type,必须使用setDataAndType方法。

    关于如何通过Data进行过滤,后面我们会讲到,下面我们通过一个样例来讲解如何通过Data完成简单的数据传递。

    我们通过显示调用Intent同时设置Intent的Data。代码如下:

    Intent intent = new Intent(LoginActivity.this, HomeActivity.class);

    intent.setDataAndType(Uri.parse("content://findUser/20180910"), "nvwa/user");

    startActivity(intent);

           在被调用的HomeActivity中,我们通过getItent()获取传递来的Intent。然后我们就可以通过

    Uri getData ()

    String getDataString ()

    获取URI,有了URI我们就可以解析出其中数据。下面给出被调用的组件的样例代码

    Intent intent = getIntent();

    Uri uri = intent.getData();

    Log.v("URI参数传递", uri.getPath());

    输出结果如下图所示:

    Uri类提供了更多的方法用于处理Uri值,可参考Uri相关的帮助 https://developer.android.google.cn/reference/android/net/Uri

    5、附件信息(Extra)

    通过Data只能传输比较简单的数据,Intent主要通过Extra完成组件之间的数据传递。

    调用方通过intent的putExtra设置数据,被调用的组件通过getXXXExtra获取数据,代码如下所示:

    调用方传递参数

    Intent intent = new Intent(LoginActivity.this, HomeActivity.class);

    intent.putExtra("userName", "zhangw");

    intent.putExtra("loginTime", Calendar.getInstance());

    startActivity(intent);

    被调方获取参数

    Intent intent = getIntent();

    Log.v("Extra数据传递", intent.getStringExtra("userName"));

    我们分析Android代码可以发现,其实通过Exctra传递的是一个Bundle,我们可以把Bundle理解成一个键值对,他通过putXXX设置数据,通过getXXX读取数据。我们可以自己定义一个Bundle对象,进行数据的传递,下面给一个样例程序。

           调用方传递参数

    Bundle bundle = new Bundle();

    bundle.putString("userName", "account");

    bundle.putSerializable("loginTime", Calendar.getInstance());

    intent.putExtras(bundle);

    被调方获取参数

    Intent intent = getIntent();

    Bundle bundle = intent.getExtras();

    Log.v("登录时间", bundle.getSerializable("loginTime").toString());

    输出结果如下图:

    注意,调用方通过intent的getExtras获取传递的来的bundle。

           6、标记(Flag)

          Intent通过

    Intent setFlags (int flags)

    设置标记。   关于标记的用法,后面我们用到后再给大家将,这并不表示这个概念不重要。

    (张伟:2018年9月27日)

    (转载时请注明来源)

    展开全文
  • Android---intent传递参数

    2016-08-06 12:35:42
    Intent是Activity与Activity之间,Activity与Service之间传递参数的介质,使用Intent和Bundle在组件之间传递数据,而这两种通常实现的是Java基本对象类型和String的传递。 在实际项目中,页面之间传值,除了以上几...

    Intent是Activity与Activity之间,Activity与Service之间传递参数的介质,使用Intent和Bundle在组件之间传递数据,而这两种通常实现的是Java基本对象类型和String的传递。
    在实际项目中,页面之间传值,除了以上几种,经常还有传递Object对象、List类型、List<Object>类型和全局变量等等的需求。

    一、传递List<String>和List<Integer>
    以下以传递List<String>为例,发送List<String>语法为:
    intent.putStringArrayListExtra(key, list);
    接收List<String>的语法为:
    list = (ArrayList<String>)getIntent().getStringArrayListExtra(key);
    以下是一个运用实例:


    ArrayList<String> stringList = new ArrayList<String>(); 
    stringList.add("string1"); 
    stringList.add("string2"); 
    stringList.add("string3"); 
    Intent intent = new Intent(); 
    intent.setClass(ListDemoActivity.this, StringListActivity.class); 
    intent.putStringArrayListExtra("ListString", stringList); 
    startActivity(intent); 
    接收
    ArrayList<String> stringList = (ArrayList<String>) getIntent().getStringArrayListExtra("ListString"); 

    List<Integer>类似以上的操作调用下面的方法也可以实现发送和接收:
    intent.putIntegerArrayListExtra(key, list);
    list =(ArrayList<Integer>) getIntent().getIntegerArrayListExtra(key);


    二、使用Serializable和Parcelable两种方式传递Object
    Android的Intent之间传递对象有两种方法,一种是Bundle.putSerializable(Key,Object);另一种是Bundle.putParcelable(Key,Object)。方法中的Object要满足一定的条件,前者实现了Serializable接口,而后者实现了Parcelable接口。
    以下是实现了Serializable接口的User类,命名为SerializableUser纯粹是从类名方便区分实现了Parcelable接口的User类:

    public class SerializableUser implements Serializable { 
    private String userName; 
    private String password; 
    public SerializableUser() { 

    public SerializableUser(String userName, String password) { 
    this.userName = userName; 
    this.password = password; 

    public String getUserName() { 
    return userName; 

    public void setUserName(String userName) { 
    this.userName = userName; 

    public String getPassword() { 
    return password; 

    public void setPassword(String password) { 
    this.password = password; 




    以下是实现了Parcelable接口的User类:

    public class ParcelableUser implements Parcelable { 
    private String userName; 
    private String password; 
    public ParcelableUser() { 

    public ParcelableUser(String userName, String password) { 
    this.userName = userName; 
    this.password = password; 

    public String getUserName() { 
    return userName; 

    public void setUserName(String userName) { 
    this.userName = userName; 

    public String getPassword() { 
    return password; 

    public void setPassword(String password) { 
    this.password = password; 

    public static final Parcelable.Creator<ParcelableUser> CREATOR = new Creator<ParcelableUser>() { 
    @Override 
    public ParcelableUser createFromParcel(Parcel source) { 
    ParcelableUser parcelableUser = new ParcelableUser(); 
    parcelableUser.userName = source.readString(); 
    parcelableUser.password = source.readString(); 
    return parcelableUser; 

    @Override 
    public ParcelableUser[] newArray(int size) { 
    return new ParcelableUser[size]; 

    }; 
    @Override 
    public int describeContents() { 
    // TODO Auto-generated method stub 
    return 0; 

    @Override 
    public void writeToParcel(Parcel dest, int flags) { 
    // TODO Auto-generated method stub 
    dest.writeString(userName); 
    dest.writeString(password); 




    使用两种方式传递的语法分别为:
    bundle.putSerializable(key,object);
    bundle.putParcelable(key,object);
    使用两种方式接收的语法分别为:
    object=(Object) getIntent().getSerializableExtra(key);
    object=(Object) getIntent().getParcelableExtra(key);

    分别使用Serializable和Parcelable发送Object 
    SerializableUser serializableUser = new SerializableUser("user1", "123456"); 
    ParcelableUser parcelableUser = new ParcelableUser("user2","654321"); 
    Intent intent = new Intent(); 
    Bundle bundle = new Bundle(); 
    bundle.putSerializable("serializableUser", serializableUser); 
    bundle.putParcelable("parcelableUser", parcelableUser); 
    intent.setClass(ListDemoActivity.this,ObjectActivity.class); 
    intent.putExtras(bundle); 
    startActivity(intent); 
    接收Object
    SerializableUser serializableUser = (SerializableUser) getIntent().getSerializableExtra("serializableUser"); 
    ParcelableUser parcelableUser = (ParcelableUser) getIntent().getParcelableExtra("parcelableUser"); 


    实现Serializable接口就是把对象序列化,然后再传输,和Java的常用编程没什么明显区别,而且User不需要明显改变,比较简单。
    然而,后一种实现Parcelable接口的类比较复杂
    Android提供了一种新的类型:Parcel,被用作封装数据的容器,封装后的数据可以通过Intent或IPC传递。 除了基本类型以外,只有实现了Parcelable接口的类才能被放入Parcel中。
    实现Parcelable接口需要实现三个方法:
    )writeToParcel 方法。该方法将类的数据写入外部提供的Parcel中。
    声明:writeToParcel (Parcel dest, int flags)。
    )describeContents方法。直接返回0就可以。
    )静态的Parcelable.Creator<T>接口,本接口有两个方法:

    createFromParcel(Parcel in) 实现从in中创建出类的实例的功能。
    newArray(int size) 创建一个类型为T,长度为size的数组, returnnew T[size];即可。本方法是供外部类反序列化本类数组使用。
    通过log测试输出可知程序的运行情况,在bundle.putParcelable(“parcelableUser”, parcelableUser);时,调用了ParcelableUser类中的publicvoid writeToParcel(Parcel dest, int flags)方法,并向dest写数据,在 ParcelableUserparcelableUser= (ParcelableUser)getIntent().getParcelableExtra(“parcelableUser”);的时候,调用了ParcelableUser类中的public ParcelableUsercreateFromParcel(Parcel source) 方法,创建了一个ParcelableUser对象,并给这个对象的属性赋值,这里的Parcel source和Parcel dest是相同的,然后返回这个ParcelableUser对象。最后就可以打印出parcelableUser的属性信息了。

    三、传递List<Object>
    如果我们要传递的是Object组成的List列表,即List<Object>,首先需要将Object对象实现Serializable接口,然后把list强制类型转换成Serializable类型,最后通过:
    Intent.putExtra(key, (Serializable)objectList);
    这样的语法来传递,接收方在接收的时候也需要强制类型转换成List<Object>,接收 List<Object>使用的语法是:
    objectList= (List<Object>) getIntent().getSerializableExtra(key);
    以下是一个应用实例,这里使用的SerializableUser类在上一步有给出,这里就不再重复给出。

    发送List<Object>
    SerializableUser user1 = new SerializableUser("user1", "123456"); 
    SerializableUser user2 = new SerializableUser("user2", "654321"); 
    List<SerializableUser> objectList = new ArrayList<SerializableUser>(); 
    objectList.add(user1); 
    objectList.add(user2); 
    Intent intent = new Intent(); 
    intent.setClass(ListDemoActivity.this, ObjectListActivity.class); 
    intent.putExtra("ListObject", (Serializable) objectList); 
    startActivity(intent); 
    接收List<Object>
    List<SerializableUser> objectList = (List<SerializableUser>) getIntent().getSerializableExtra("ListObject"); 

    四、全局变量
    如果一些特殊的应用级别的参数,不方便使用intent来传递参数,我们很容易想到是不是有全局变量或静态变量可以使用?Java中的静态变量在这里是适合的,但其值在Activity调用了System.exit(0)或finish()后就丢失了。
    而在android中有个更优雅的方式是使用ApplicationContext。这种全局变量方法相对静态类更有保障,直到应用的所有Activity全部被destory掉之后才会被释放掉。
    Android的SDK中有说道,Application是用来保存全局变量的,并且是在package创建的时候就存在了。所以当我们需要创建全局变量的时候,不需要再像J2SE那样需要创建public权限的static变量,而直接在application中去实现。只需要调用Context的 getApplicationContext或者Activity的getApplication方法来获得一个Application对象,就可以设置或读取全局变量的值。
    启动Application时,系统会创建一个PID,即进程ID,所有的Activity就会在此进程上运行。那么我们在Application创建的时候初始化全局变量,同一个应用的所有Activity都可以取到这些全局变量的值,换句话说,我们在某一个Activity中改变了这些全局变量的值,那么在同一个应用的其他Activity中值就会改变。
    用法:
    . 创建一个属于你自己的android.app.Application的子类,为想要共享的private全局变量增加setter和getter方法。

    public class MyApp extends Application{ 
    private String globalVariable; 
    public String getGlobalVariable() { 
    return globalVariable; 

    public void setGlobalVariable(String globalVariable) { 
    this.globalVariable = globalVariable; 



    . 在manifest中申明一下这个类,这时Android就为此建立一个全局可用的实例。
    其实就是在原来仅有的一个application标签上为application制定一个名字为这个全局实例。

    <application android:name=".MyApp" android:icon="@drawable/icon" android:label="@string/app_name"></span> 
    . 可以在其他任何地方使用Context.getApplicationContext()方法获取这个实例,进而获取其中的状态(变量)。

    使用全局变量传递参数 
    MyApp myApp = ((MyApp) getApplicationContext());//获得我们的应用程序MyApp 
    myApp.setGlobalVariable("全局变量"); 
    Intent intent = new Intent(); 
    intent.setClass(ListDemoActivity.this, GlobalActivity.class); 
    startActivity(intent); 
    接收全局变量的参数
    MyApp myApp = ((MyApp) getApplicationContext()); 
    String globalVariable = myApp.getGlobalVariable();

    展开全文
  • Intent的基本使用

    万次阅读 2019-06-15 10:53:32
    Intent(意图),Android通信的桥梁,比如我们可以通过: startActivity(Intent)/startActivityForResult(Intent):来启动一个Activity startService(Intent)/bindService(Intent):来启动一个Service ...
  • Intent的详细解析以及用法

    千次阅读 2018-02-08 10:49:37
    Intent的详细解析以及用法  Android的四大组件分别为Activity 、Service、BroadcastReceiver(广播接收器)、ContentProvider(内容提供者),这四种组件是独立的,它们之间可以互相调用,协调工作,最终组成一个...
  • Intent详解及其用法

    千次阅读 2019-04-11 14:50:20
    Intent 概述 翻译过来为“意图”,它是一种运行时绑定(run-time binding)机制,可以应用于两个应用间的通讯交互,也能够应用于在同一个应用下不同组件的交互(activity、service、broadcast receiver) 看下面...
  • Intent的用法(初步)

    万次阅读 2018-05-09 15:49:10
    可视化的知识便于复习和查找(注:笔记以学习《androi第一行代码》这本书为基础) 什么是IntentIntent在Android中的核心作用就是“跳转”(Android中的跳转机制),同时可以携带必要的信息,也可以将Intent作为一...
  • intent详解(一)

    万次阅读 多人点赞 2019-09-11 11:58:53
    前言:通过重新翻看android入门书籍,才发现原来自己露掉了那么多基础知道。原以为有了C的基础,快速开发应该是没有问题的了,但没有遇到问题的时候还是海搜,只知道这么写能完成这个功能,但为...《intent详解(二...
  • Intent分为直接Intent和间接Intent /*** * 直接查找法(通过组件名称) * @param v */ public void componentClick(View v){ // Intent intent = new Intent(); // ComponentName componentName = new ...
  • 安卓常用代码片段

    万次阅读 2017-10-17 12:05:44
    常用代码片段 //1.拨打电话 // 给移动客服10086拨打电话 ...Intent intent = new Intent(Intent.ACTION_DIAL, uri); startActivity(intent); //2.发送短信 // 给10086发送内容为“Hello”的短信 Uri uri = Uri.parse
  • Android 文件打开方式

    万次阅读 热门讨论 2011-11-23 09:09:21
    Android打开文件,具体还是看代码吧,代码最能说明...public static Intent openFile(String filePath){ File file = new File(filePath); if(!file.exists()) return null; /* 取得扩展名 */ String end=fi
  • Activity 生命周期     显式 Intent 调用 ... 1 //创建一个显式的 Intent 对象(方法一:在构造函数中... 2 Intent intent = new Intent(Intent_Demo1.this, Intent_Demo1_Result1.class); 3 4 Bundle bundle =
  • Android系统中标准Intent的使用

    万次阅读 2014-04-18 13:07:37
    一 Android系统用于Activity的标准Intent 1 根据联系人ID显示联系人信息 Intent intent = new Intent(); intent.setAction(Intent.ACTION_VIEW); //显示联系人信息 intent.setData(Uri.parse("content://...
  • Android中 跳转到系统设置界面方法总结

    万次阅读 多人点赞 2017-06-01 10:51:57
    有时候,我们在开发app时,会有跳转到系统设置界面的需求。例如:检查到网络连接错误,提示用户跳转到网络设置界面去设置网络连接...1. ACTION_ACCESSIBILITY_SETTINGS : // 跳转系统的辅助功能界面 Intent intent = n
  • android打开文件,intent的使用
  • android之android.intent.category.DEFAULT的用途和使用

    万次阅读 多人点赞 2019-07-27 08:23:25
    1、要弄清楚这个问题,首先需要弄明白什么是implicit(隐藏) intent什么是explicit(明确) intent。 Explicit Intent明确的指定了要启动的Acitivity ,比如以下Java代码: Intent intent= new Intent(this, B....
  • 怎么样把数据从一个activity(intent)发送到另一个呢? 我发送数据的代码如下: Intent i=new Intent(context,SendMessage.class); i.putExtra("id",user.getUserAccountId()+""); i.putExtra("name",user...
  • 问题:ActivityManager: Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.example.gnss_rtk/.MainActivity },运行开始即退出 解决:将依赖的项目appcompat包...
  • Android中Intent组件详解

    万次阅读 多人点赞 2011-06-30 10:05:00
    Intent是不同组件之间相互通讯的纽带,封装了不同组件之间通讯的条件。Intent本身是定义为一个类别(Class),一个Intent对象表达一个目的(Goal)或期望(Expectation),叙述其所期望的服务或动作、与动作有关的数据等。...
1 2 3 4 5 ... 20
收藏数 302,954
精华内容 121,181
关键字:

intent