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本身的。

posted @ 2017-06-05 15:46  鲁迅认识的那只猹  阅读(590)  评论(0编辑  收藏  举报