隐式意图的剖析

一个页面跳转另一个页面:

隐式意图的剖析_第1张图片






    



要跳转的界面:





    





1>.在只指定android:name的时候


package com.sqf.intent2;
import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;


public class MainActivity extends Activity {
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
	}


	public void click(View v){
		Intent intent = new Intent();
		intent.setAction("com.sqf.intent2.open2"); //与配置文件中的action一样
	}

}
	 

	
package com.sqf.intent2;


import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;


public class SeconedActivity extends Activity {


	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_seconed);
	}
}


清单文件:

        
                 
            




错误:

 Caused by: android.content.ActivityNotFoundException: No Activity found to handle Intent { act=com.sqf.intent2.open2 }

就是Activity没有被找到,指定包下的文件


2>.当指定mimeType的时候  

mimeType可以自己指定,也可以自己指定





	public void click(View v){  //MainActivity 类

		Intent intent = new Intent();
		intent.setAction("com.sqf.intent2.open2"); //与配置文件中的action一样
		intent.setType("application/person");
		startActivity(intent);
	}


清单文件:
 
            
             
                 
            	  
                      


错误:

04-18 04:56:18.185: E/AndroidRuntime(1364): Caused by: android.content.ActivityNotFoundException: No Activity found to handle Intent 

{ act=com.sqf.intent2.open2 typ=application/person }

乃是没找到,原因没有指定intent.addCategory(Intent.CATEGORY_DEFAULT);  有的加有的版本没有加



3>.加上Intent.CATEGORY_DEFAULT



            
             
                 
            	  
		       	
            

activity/> 	  
 
  

 

public void click(View v){
		Intent intent = new Intent();
		intent.setAction("com.sqf.intent2.open2"); //与配置文件中的action一样
		intent.addCategory(Intent.CATEGORY_DEFAULT);   
		intent.setType("application/person");
		startActivity(intent);
	}


可以运行



4>.只在配置文件中加这句代码:   约束



            
             
                 
            	  
		            	
           	  
            
 
  

public void click(View v){
		Intent intent = new Intent();
		intent.setAction("com.sqf.intent2.open2"); //与配置文件中的action一样
		intent.addCategory(Intent.CATEGORY_DEFAULT);   
		intent.setType("application/person");
		startActivity(intent);
	}

Caused by: android.content.ActivityNotFoundException: No Activity found to handle Intent 

{ act=com.sqf.intent2.open2 cat=[android.intent.category.DEFAULT] typ=application/person }

错误原因:你在配置文件中  指定了约束但是没有类型,就是你打人,你要知道打谁吧


5>.同时在MainActivity的click方法中指定打人的类型 intent.setData(Uri.parse("jianren:张三"));




            
             
                 
            	  
		            	
           	  
            
 
  


	public void click(View v){
		Intent intent = new Intent();
		intent.setAction("com.sqf.intent2.open2"); //与配置文件中的action一样
		intent.addCategory(Intent.CATEGORY_DEFAULT);   //默认类别
		intent.setType("application/person");
		
		//URL:统一资源定位符     URI:统一资源标识符  URL是URI的子集
		intent.setData(Uri.parse("jianren:张三"));
		startActivity(intent);
	}


Caused by: android.content.ActivityNotFoundException: No Activity found to handle Intent 

{ act=com.sqf.intent2.open2 cat=[android.intent.category.DEFAULT] dat=jianren:张三 }


原因: 

intent类的setData方法:

Set the data this intent is operating on. This method automatically clears any type that was previously set by setType or setTypeAndNormalize.  

这个方法的解释是:在操作意图的时候,这个方法回自动清除先前的setType或setTypeAndNormalize方法

所以,上面设置的setType方法失效


同理:如果把setType方法放在前面的话

setType方法的解释:

This is used to create intents that only specify a type and not data, for example to indicate the type of data to return.

This method automatically clears any data that was previously set (for example by setData).  

和setData一样,


解决这个问题的办法:调用intent的setDataAndType方法,同时设置Date和type,就可以解决这个问题


            
             
                 
            	  
				            	
           		  
            

 

	public void click(View v){
		//打  action
		//人  数据 Type
		//附加的数据 Category 类别
		Intent intent = new Intent();
		intent.setAction("com.sqf.intent2.open2"); //与配置文件中的action一样
		intent.addCategory(Intent.CATEGORY_DEFAULT);   //默认类别
//		intent.setType("application/person");
//		intent.setData(Uri.parse("jianren:张三"));
		
		intent.setDataAndType(Uri.parse("jianren:张三"),"application/person");
		//关于约束后面是否加//,意思就是jianren:后面是否加双斜杠,是根据,是否有主机名
		//当有主机名的时候,jianren://baidu.com
		//一般的uri  scheme://host:port/path    没有主机名不用加//
		startActivity(intent);
	}

可以运行accept






说一个点击按钮访问百度的例子:







你可能感兴趣的:(Intent)