隐式Intent的使用——Android学习笔记3

隐式Intent的使用


一、为什么要用隐式Intent?


    但如果想调用别的程序的组件时,且开发人员往往并不清楚别的应用程序的组件名称,这时我们只能用隐式Intent,隐式Intent恰恰相反,它不会用组件名称定义需要激活的目标组件,而是Android系统帮助应用程序寻找与Intent请求意图最匹配的组件。



二、Android系统怎么找?


     主要是通过Intent Filter来寻找与隐式Intent相关的对象。具体的选择方法是:Android将Intent的请求内容<intent-filter>比较,Intent Filter中包含系统中所有可能的待选组件。如果<intent-filter>中某一组件匹配隐式Intent请求的内容,那么Android就选择该组件作为该隐式Intent的目标组件。



三、<intent-filter>的基本格式如下:

<!--1.这里定义了目标活动(目标组件) -> .SecondActivity-->
<!--2.指明这个活动的【动作标识action为】:com.example.activity.ACTION_START-->
<!--3.指明这个活动的【类别标识category为】:android.intent.category.DEFAULT 与-->
<!--com.example.activity.CPJ_category1与com.example.activity.CPJ_category2-->
		
<activity android:name="com.example.activity.SecondActivity">
	<intent-filter>
			
		<action android:name="com.example.activity.ACTION_START"/>
						   
		<category android:name="android.intent.category.DEFAULT"/>
		<category android:name="com.example.activity.CPJ_category1"/>
		<category android:name="com.example.activity.CPJ_category2"/>
	</intent-filter>
</activity>
	
<!--指定当前活动可以响应com.example.activity.ACTION_START这个action-->
<!--1.<category>标签包含一些附加信息,更精确指明当前的活动能够响应的Intent中,还可能带有的category-->
<!--2.只有action和category同时匹配才能响应Intnet-->                   
<!--3.android.intent.category.DEFAULT是一种默认的category,在调用-->
<!--startActivity()时会自动把这个category添加到intent中-->                    
<!--4.一个intent只能有一个action,但是可以有多个category-->
<!--5.一个intent-filter可以同时有多个个action-->



四、Intent的请求内容如何与<intent-filter>比较?


1.动作比较-<action/> (第一步)  如:
<intent-filter>

	<actionandroid:name="com.example.project.SHOW_CURRENT" />
	<actionandroid:name="com.example.project.SHOW_RECENT" />
	<actionandroid:name="com.example.project.SHOW_PENDING" />

</intent-filter>
 
1). 一条<intent-filter>元素至少应该包含一个<action>,否则任何Intent请求都不能和该<intent-filter>匹配。
  
2). 如果Intent请求的Action和<intent-filter>中个某一条<action>匹配,那么该Intent就通过了这条<intent-filter>的动作比较。(第一步完成)

  

2.类别比较-<category/> (第二步)如:
<intent-filter>

	<categoryandroid:name="android.Intent.Category.DEFAULT" />
	<categoryandroid:name="android.Intent.Category.BROWSABLE" />

</intent-filter>
 
1). 只有当Intent请求中所有的Category与组件中某一个Intent-filter的<category>完全匹配时,才会通过匹配成功。也就说某一个<intent-filter>中的category必须包含Intent中的所有category时,才算类别匹配成功。(第二步完成)
  
2). Intent-filter中多余的<category>声明并不会导致匹配失败,也就是说<intent-filter>中的category可以存在多余项;
  
3). <categoryandroid:name="android.Intent.Category.DEFAULT" />是一种默认的category,在调用startActivity()时会自动把这个category添加到intent中.
 
4). 每一个通过 startActivity()方法发出的隐式 Intent 都至少有一个 category,就是 "android.intent.category.DEFAULT",所以只要是想接收一个隐式Intent的Activity都应该包括
"android.intent.category.DEFAULT" category,不然将导致 Intent匹配失败。

  
3.数据比较-<data/> (第三步)  如:
<intent-filter>

	<data android:type="video/mpeg" android:scheme="http" . . . />
	<data android:type="audio/mpeg" android:scheme="http" . . . />

</intent-filter>
 
1). <data>元素指定了希望接受的Intent请求的数据URI和数据类型,URI被分成三部分来进行匹配:scheme、authority和path。其中,用setData()设定的Intent请求的URI数据类型和scheme必须与Intent-filter中所指定的一致。若Intent-filter中还指定了authority或path,它们也需要相匹配才会通过测试。(第三步完成)

总:
   只有第一步匹配成功,才会继续匹配此<intent-filter>的category及第二步,第二步匹配完成,才会匹配第三步。当都匹配上时,就找到对应的包含它们的 <activity android:name=".SecondActivity">跳转到对应的目标组件上。



五、Intent.Action(安卓系统内置动作)的常见用法:


    
1.  Intent.ACTION_MAIN

  String: android.intent.action.MAIN
     作用:标识Activity为一个程序的开始(表明app首先执行的Activity)。比较常用。
   Input: nothing
  Output: nothing 
  
例:

<!--android.intent.action.MAIN  决定应用程序最先启动的Activity-->
<!--android.intent.category.LAUNCHER  决定应用程序是否显示在程序列表里-->

<activity android:name=".Main" android:label="@string/app_name">   
	<intent-filter>
		<action android:name="android.intent.action.MAIN" />
		<category android:name="android.intent.category.LAUNCHER" />
	</intent-filter>
</activity>
  
例:利用Intent实现返回系统的Home桌面
Intent intent = new Intent();
  intent.setAction(Intent.ACTION_MAIN);
  intent.addCategory(Intent.CATEGORY_HOME);
startActivity(intent);

   
2.  Intent.Action_CALL


  Stirng: android.intent.action.CALL 
     作用:呼叫指定的电话号码(直接拨打电话)。
   Input: 电话号码。数据格式为:tel:+phone number 
  Output: Nothing
   
例:

Intent intent=new Intent(); 
  intent.setAction(Intent.ACTION_CALL);//设置当前动作为拨打电话   
  intent.setData(Uri.parse("tel:1320010001"));//设置要拨打的电话
startActivity(intent);

在AndroidMainifest.xml文件中,为当前程序设置拨打电话权限:
<uses-permission android:name="android.permission.CALL_PHONE"/>

 
 3. Intent.Action.DIAL


  String: action.intent.action.DIAL
     作用:调用拨号面板(只是调用,并没有开始打电话)
   Input: 电话号码。数据格式为:tel:+phone number 
  Output: Nothing
     说明:打开Android的拨号UI。如果没有设置数据,则打开一个空的UI;
 
例:

Intent intent = new Intent();
  intent.setAction(Intent.ACTION_DIAL);//设置当前动作为调用拨号盘
  intent.setData(Uri.parse("tel:1584014xxxx"));//设置准备要拨打的电话
startActivity(intent);

(这里通过一个例子来仔细演示拨打电话的用法,包括:直接拨号、打开拨号盘、用户自定义拨号)
//Button的点击事件-直接拨打电话
Button  btn_call = (Button) findViewById(R.id.Call);
btn_call.setOnClickListener(new View.OnClickListener() {
	@Override
	public void onClick(View v) {
		Intent intent = new Intent();
		intent.setAction(Intent.ACTION_CALL);//设置当前动作为拨打电话
		intent.setData(Uri.parse("tel:1584014xxxx"));//设置要拨打的电话
		startActivity(intent);
	}
});

//Button的点击事件-直接拨打电话
Button  btn_dial = (Button) findViewById(R.id.Dial);
btn_dial.setOnClickListener(new View.OnClickListener() {
	@Override
	public void onClick(View v) {
		Intent intent = new Intent();
		intent.setAction(Intent.ACTION_DIAL);//设置当前动作为调用拨号盘
		intent.setData(Uri.parse("tel:1584014xxxx"));//设置准备要拨打的电话
		startActivity(intent);
	}
});

//获取用户输入电话号码的EditText
final EditText edt_phoneNumber = (EditText) findViewById(R.id.phonebunber_id);

//Button点击事件-用户自己拨号
Button  btn_userCall = (Button) findViewById(R.id.userCall);
btn_userCall.setOnClickListener(new View.OnClickListener() {
	@Override
	public void onClick(View v) {

		//先验证用户输入电话的有效性(使用安卓自带的包来判断电话的有效性)
		String phoneNumber = edt_phoneNumber.getText().toString();
		if(PhoneNumberUtils.isGlobalPhoneNumber(phoneNumber)){
			Intent intentDial = new Intent();
			  intentDial.setAction(Intent.ACTION_CALL);//设置当前为用户自定义拨号
			  intentDial.setData(Uri.parse("tel:"+ phoneNumber));
			startActivity(intentDial);

		//提示用户电话输入有误
		} else {
			Toast.makeText(CallActivity.this, "你输入的电话有误,请重新输入", Toast.LENGTH_SHORT)
					.show();
		}
	}
});



    
4. Intent.ACTION_VIEW


  String:android.intent.action.VIEW  
     作用:用于显示用户的数据,比较通用,会根据用户的数据类型打开相应的Activity。
  数据类型就是指:tel(打开拨号Activity)、
http(打开浏览器Activity)、 geo(打开地图定位Activity)等

     说明:这里演示几个简单的应用;

//Button的点击事件-打开地图
Button btn_geo = (Button) findViewById(R.id.geo);
btn_geo.setOnClickListener(new View.OnClickListener() {
	@Override
	public void onClick(View v) {
		Intent intent = new Intent();
		intent.setAction(Intent.ACTION_VIEW);//设置当前动作
		intent.setData(Uri.parse("geo:39.899533,116.036476"));//打开地图定位(直接打开你手机上的地图软件)
		startActivity(intent);
	}
});

//Button的点击事件-打开浏览器
Button btn_http = (Button) findViewById(R.id.http);
btn_http.setOnClickListener(new View.OnClickListener() {
	@Override
	public void onClick(View v) {
		Intent intent = new Intent();
		intent.setAction(Intent.ACTION_VIEW);//设置当前动作
		intent.setData(Uri.parse("http://www.baidu.com"));//打开浏览器并打开百度
		startActivity(intent);
	}
});

//Button的点击事件-打开一张照片
Button btn_image = (Button) findViewById(R.id.image);
btn_image.setOnClickListener(new View.OnClickListener() {
	@Override
	public void onClick(View v) {
		Intent intent = new Intent();
		intent.setAction(Intent.ACTION_VIEW);//设置当前动作
		//你若不清楚你的存储路劲,可以在DDMS下查看
		Uri uri = Uri.parse("file:///storage/sdcard1/DCIM/Camera/IMG_20150622_172748.jpg");
		intent.setDataAndType(uri, "image/*");
		startActivity(intent);
	}
});

//Button的点击事件-打开视频
Button btn_video = (Button) findViewById(R.id.video);
btn_video.setOnClickListener(new View.OnClickListener() {
	@Override
	public void onClick(View v) {
		Intent intent = new Intent();
		intent.setAction(Intent.ACTION_VIEW);//设置当前动作
		Uri uri = Uri.parse("file:///storage/sdcard1/---");
		intent.setDataAndType(uri, "video/*");
		startActivity(intent);
	}
});
	 
//Button的注册事件-查看通讯录
Button SeeContacts_BT = (Button) findViewById(R.id.SeeContacts);
SeeContacts_BT.setOnClickListener(new View.OnClickListener() {
	@Override
	public void onClick(View v) {

		Intent intent = new Intent();
		  intent.setAction(Intent.ACTION_VIEW);
		  intent.setData(Uri.parse("content://contacts/people/1"));//查看通讯录中的第一个联系人
		startActivity(intent);
	}
});


 
5. Intent.ACTION_SENDTO 


  String: android.intent.action.SENDTO 
     作用:发送短信息
     说明:这里演示几个简单的应用;


String number = numberET.getText().toString();// 获得用户输入的号码
String message = messageET.getText().toString();// 获得用户输入的短信
if(PhoneNumberUtils.isGlobalPhoneNumber(number)) {
	Intent intent = new Intent();// 创建Intent对象
	intent.setData(Uri.parse("smsto:" + number)); // 设置要发送的号码
	intent.putExtra("sms_body", message); // 设置要发送的信息内容
	startActivity(intent);// 将Intent传递给Activity
} else {
	Toast.makeText(SendToActivity.this, "你输入的电话错误,请重新输入!",
			Toast.LENGTH_SHORT).show();
}

(安卓发送短信的方式有2种:

第一种:就是上面写的这个 -> 调起系统发短信功能;
也就说用这种方式,当你点击发送按钮时,并没有立马发出去,而是让系统打开了你手机上的自带的发短信的程序,
并将你输入的电话号码和短信内容写在了上面,你在单击手机自带的短信程序的发送按钮,才能发出去,
就像前面的ACTION_DIAL,只是打开了拨号盘,并没有开始打电话;

第二种:利用SmsManager -> 调用系统短信接口直接发送短信;
用这种方式时,当你点击你写的发送短信按钮,直接就发出去了,并不调用别的短信程序。
且这种方式可以监控发送状态和对方接收状态(具体的以后介绍))



   
6. Intent.ACTION_BATTERY_LOW
      
  作用:显示电量低的警告信息
  说明:因为这一块用到广播,所以具体的实现办法在复习有关广播的知识时写



    
7. Intent.ACTION_EDIT
    
  作用:编辑通讯录中某条特定的联系人信息
    
例:

Intent intent = new Intent();
  intent.setAction(Intent.ACTION_EDIT);
  intent.setData(Uri.parse("content://contacts/people/1"));//修改通讯录中的第一个联系人
startActivity(intent);	

 
(获取通信录中的所有联系人信息还有别的办法-用到了内容提供器,后面再说)

 
参考网址与资料:


1.http://blog.csdn.net/coder80/article/details/7879259
2.http://www.cnblogs.com/hanyonglu/archive/2012/03/26/2417278.html
3.《Android程序开发范例宝典》













你可能感兴趣的:(android,intent,隐式intent,Intent.Action)