• Intent(意图)


    Intent 意图

    显式意图

    在构造Intent对象的时候就指定接受者。通常用于本程序之间。

    Demo

    我们最常见一个显示意图就是我们的应用程序Activity之间的跳转

    public void click(View v){
        ntent  intent = new Intent(this,TestActivity.class);
     	this.startActivity(intent);
    }
    

    隐式意图

    在构造的Intent时候我们可能并不知道或者不关心接受者时候是谁,而是通过一组特定的筛选条件来由系统自动筛选符合条件的Intent接受者。这个方式叫作隐式意图,我们经常在跨程序传输数据的时候用到。

    Demo

    我们所熟悉的隐式意图就是我们写的入门程序:电话拨号器

    电话拨号器

    public void click(View v) {
        //与显式意图,不同的是在构造Intent对象的时候我们并不指定接受者
        Intent intent = new Intent();
        //设置意图的动作
        intent.setAction(Intent.ACTION_CALL);
        //设置意图的数据
        intent.setData(Uri.parse("tel:" + 123456));
        this.startActivity(intent);
    }
    
    Android系统拨号器的清单文件
    <!--Android 系统拨号器的清单文件-->
    <activity android:name="OutgoingCallBroadcaster"
            android:permission="android.permission.CALL_PHONE"
            android:theme="@android:style/Theme.NoDisplay"
            android:configChanges="orientation|keyboardHidden">
        <!-- CALL action intent filters, for the various ways
             of initiating an outgoing call. -->
        <intent-filter>
          	<!--
    		intent.setAction(Intent.ACTION_CALL);
    		指定本活动【可以接收的动作】
    		这里规定我们的意图的动作只有是 这个动作的时候才可以跳转到
    		拨号器界面
    		-->
            <action android:name="android.intent.action.CALL" />
            <category android:name="android.intent.category.DEFAULT" />
          	<!--
    		intent.setData(Uri.parse("tel:" + 123456));
    		指定参数的格式,这里指定我们在使用拨号器的时候传递的参数必须是
    		tel:打头的 [:]冒号,就是一个固定的写法了
    		-->
            <data android:scheme="tel" />
        </intent-filter>
        <intent-filter android:icon="@drawable/ic_launcher_sip_call">
            <action android:name="android.intent.action.CALL" />
            <category android:name="android.intent.category.DEFAULT" />
            <data android:scheme="sip" />
        </intent-filter>
        <intent-filter>
            <action android:name="android.intent.action.CALL" />
            <category android:name="android.intent.category.DEFAULT" />
            <data android:scheme="voicemail" />
        </intent-filter>
        <intent-filter>
            <action android:name="android.intent.action.CALL" />
            <category android:name="android.intent.category.DEFAULT" />
            <data android:mimeType="vnd.android.cursor.item/phone" />
            <data android:mimeType="vnd.android.cursor.item/phone_v2" />
            <data android:mimeType="vnd.android.cursor.item/person" />
        </intent-filter>
    </activity>
    
    Demo

    通过Intent让Activity返回数据

    Step[1] 发送短信一定要找到发送短信的activity,通过打Log的方式找到该Activity

    //父Activity的代码
    public class MainActivity extends AppCompatActivity {
    
        private Button btn_send;
        private final int SECODACTIVITY_REQUESTCODE = 1;
    
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            btn_send = (Button) findViewById(R.id.btn_send);
        }
    
        public void click(View v) {
            Intent intent = new Intent(this, SecondActivity.class);
            //允许子Activity可以返回结果
            startActivityForResult(intent, SECODACTIVITY_REQUESTCODE);
        }
    
        /*当子activity关闭的时候就会执行这个方法。
         *Node:只有通过【startActivityForResult()】方法开启Activity的是否再回执行此方法
         *当子Activity有多个的时候并且都需要返回数据的时候那么结果码的作用就
         *非常重要了,可以通过不同的请求码来标识各个子activity并且通过请求码来判断
         *返回的数据来自于哪个子Activity。
         *resultCode:用来标识子activity执行的状态:比如是否成功等等
         */
        @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
            if (resultCode == Activity.RESULT_OK
                    && requestCode == this.SECODACTIVITY_REQUESTCODE)
    
                if (data.hasExtra("txt")) {
                    String str = data.getStringExtra("txt");
                    Toast.makeText(this, str, Toast.LENGTH_SHORT).show();
                }
        }
    }
    

    子Activity的代码

    public class SecondActivity extends Activity {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_second);
        }
        public void click(View v) {
            Intent intent = new Intent();
            intent.putExtra("txt", "我要返回数据");
            //设置activity将要返回的数据
            //参数 结果码:表示状态如:是否成功等, Intent 用来传递数据的意图
            this.setResult(Activity.RESULT_OK, intent);
            //结束Activity
            finish();
        }
    

    Intent-Filter 意图过滤器

    如果Intent的接受者,想要告诉自己可以接收和响应哪些Intent,那么就需要Intent-Filter了

    Intent-Filter负责过滤掉无法响应的Intent,采用的是一种 【白名单】的机制,Intent-Filter只过滤【隐式意图】,一个接受者可以有多个Intent-Filter,只需要满足其中一个的过滤方式即可。

    一个Intent-Filter 可以包含以下的过滤条件

    Action

    ​ 一个Intent只能是一个动作,但是一个Intent-Filter可以有一个或者多个action进行过滤。Intent只需要匹配一个就可了。

    Data

    ​ [0]scheme 属性设置参数过滤

    ​ [1] Data可以有零个或者多个;

    ​ [2] 如果Intent-Filter 没有设置Data 那么Intent也必须没有Data才行

    ​ [3] 如果Internet-Filter 没哟设置 mimeType 那么只需要对应 Data 即可

    ​ [4]如果设置了mimeType那么必须Data和Type都对应才行

    Category

    ​ 指定在什么样子的环境下动作才会被响应,一个Intent-filter 可以有多个Category可以自定义或者使用android本身的。

  • 相关阅读:
    [转]史上最最佳软件开发实践指导
    附微信表情代码关键字
    TFS2010配置篇 — 万事具备只欠外网访问
    ASP.NET在IE10中Form表单身份验证失效问题解决方法
    TFS2010 更改已经登录的用户
    TFS命令tf:undo 强制签入别人签出的文件
    ASP.NET Core部署后报错: Could not load file or assembly 'System.Private.ServiceModel, Version=4.1.2.4, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'
    SQL 增删改查语句
    存储过程拼接sql
    sql 求时间差
  • 原文地址:https://www.cnblogs.com/slyfox/p/6945297.html
Copyright © 2020-2023  润新知