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