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系统拨号器的清单文件
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本身的。