Intent 的理解

来源:互联网 发布:webpack压缩单个js文件 编辑:程序博客网 时间:2024/06/13 02:28


Intent的理解
1.显式Intent 页面跳转有三种方法:
方法一:构造方法传入 Component(最常用方式)
Intent intent = new Intent(this,SecondActivity.class)
startActivity(intent);
方法二:setComponent方法:
Component componentName = new ComponentName(this,SecondActivity.class)
Intent intent = new Intent();
intent.setComponent(componentName);
startActivity(intent);
方法三:setClass/setClassName方法
Intent intent = new Intent();
intent.setClass(this.SecondActivity.class);
startActivity(intent);

2.隐式Intent
不像显式直接指定需要的Activity,不明确指定启动哪个Activity,而是设置Action、Data、
Category,让系统来筛选出合适的Activity。筛选是根据所有的<intent-filter>来筛选的。

例如:在AndroidMainfest.xml文件中定义:
<activity 
android:name="com.example.app.SecondActivity">
<intent-filter>
<action name="abcdefg"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
<activity>
然后才能在MainActivity中通过setAction或构造方法设置Action

方法一:通过setAction方法
Intent intent = new Intent();
intent.setAction(abcdefg);
startActivity(intent);
方法二:通过构造方法
Intent intent = new Intent("abcdefg");
startActivity(intent);

使用隐式Intent的优点:
1.这个Activity其他应用程序也可以调用,只要使用这个action的字符串。应用程序间的交互就很容易
例如:手机qq可以调用qq空间,可以调用腾讯微博等。
因此,为了防止应用程序间互相影响,一般命名方式都是 “包名+action名”

2.你也可以使用其他应用程序的action
例如:调用拨号面板
Intent intent = new Intent(Intent.ACTION_DIAL);  
// 或者Intent intent = new Intent("android.intent.action.DIAL");  
// Intent.ACTION_DIAL是内置常量,值为"android.intent.action.DIAL"  
startActivity(intent);  

3.一个Activity可以处理多种Action
<activity  
android:name="com.example.app016.SecondActivity">  
<intent-filter>  
<!-- 可以处理下面三种Intent -->  
<action android:name="com.example.app016.SEND_EMAIL"/>  
<action android:name="com.example.app016.SEND_MESSAGE"/>  
<action android:name="com.example.app016.DAIL"/>  
<category android:name="android.intent.category.DEFAULT" />  
</intent-filter>  
</activity>  

3.对于一个Action字符串,系统可能找到一个Activity或多个Activity,也可能一个都找不到
1.找到一个:
直接打开这个Activity
2.找到多个:
系统提示从多个activity中打开一个
例如:点开浏览器时 :会提示是打开哪一个浏览器
3.没有找到:
会抛出ActivityNotFoundException,所以应该注意 try catch 异常 或者:使用resolveActivity来
判断能否找到合适的Activity
例如: Intent intent = new Intent(Intent.ACTION_DIAL);
if(intent.resolveActivity(getPackageManager())==null){
//设置找不到操作
}




4.利用Intent对象携带数据
1.Extras :可以传递一些int,long,char等一些基础类型
1.1设置参数:
Intent intent1 = new Intent(this,Test1.class);
Bundle bundleTest = new Bundle();
bundleTest.putString("user","mali");
bundleTest.putString("pwd","123456");
intent1.putExtras(bundleTest);

startActivity(intent1);

1.2接受参数:
Bundle bundle = this.getIntent().getExtras();
String user = bundle.getString("user");
String pwd = bundle.getString("pwd");

2.ArrayList可以携带一些复杂数据
2.1设置参数
Map<String,Object> map1 = new HashMap<String,Object>();
map1.put("key1","value1");
map1.put("key2","value2");
List<Map<String,Object>> list = new ArrayList<HashMap<String,Object>>();
list.add(map);

Intent intent = new Intent();
intent.setClass(this,Test2Activity.class);
Bundle bundle = new Bundle();
//须定义一个list用于在budnle中传递需要传递的ArrayList<Object>,这个是必须要的 
ArrayList bundlelist = new ArrayList();
bundlelist.add(list);
bundle.putParcelableArrayList("list",bundlelist);
intent.putExtras(bundle);
startActivity(intent);
2.2接受参数
Bundle bundle = getIntent().getExtras();
ArrayList list = bundle.getParcelableArrayList("list");
List<Map<String,Object>> lists = (List<Map<String,Object>>)list.get(0);
String sResult ="";
for(Map<String,Object> m:lsits){
for(String k:m.keySet()){
sResult +="\r\n"+k+":"+m.get(k);
}
}
3.Serializable 接口
3.1 设置参数: 将数据序列化后,再将其传递出去
Map<String,String> map1 = new HashMap<String,String>();
map1.put("key1","value1");
map1.put("key2","value2");

Bundle bundleSerializable = new Bundle();
bundleSerializable.putSerializable("serializable",map1);
Intent intent = new Intent();
intent.putExtras(bundleSerizable);
intent.setClass(this,SerializableActivity.class);
startActivity(intent);

3.2接收参数:
Bundle bundle = this.getIntent().getExtras();
HashMap<String,String> map = (HashMap<String,String>)bundle.getSerializable("serializable");
String sResult = "map.size() = "map.size();
Iterator iter = map.entrySet.iterator;
while(iter.hasNext()){
Map.Entry entry = (Map.Entry)iter.next();
Object key = entry.getKey();
Object value = entry.getValue();
sResult+="\r\n key-->"+(String)key;
sResult+="\r\n value-->"+(String)value;

}

4.使用单例模式实现参数传递 (这是性能最好的)
单例模式的特点就是-->一个类只能有一个实例

4.1先定义一个单实例的类

public class IntentSingleTest {
private static IntentSingleTest instance = null;


public IntentSingleTest() {
mMap = new HashMap<String, Object>();
}
//    synchronized  用于线程安全,防止多线程同时创建实例?


public synchronized static IntentSingleTest getInstance() {
if (instance==null){
instance = new IntentSingleTest();
}
return instance;
}
final HashMap<String,Object> mMap;
public void put(String key,Object value){
mMap.put(key,value);
}
public Object get(String key){
return mMap.get(key);
}
}

4.2 设置参数
IntentSingleTest instance = IntentSingleTest.getInstance();
instance.put("key1","value1");
instance.put("key2","value2");

Intent intent = new Intent(this,TestActivity.class);
startActivity(intent);

4.3 接收参数
HashMap<String,Object> map = IntentSingleTest.getInstance.mMap;
String sResult = "map.size() = "+map.size();
//遍历参数,用entrySet效率是最高的e
Iterator iter = map.entrySet().iterator();
while(iter.hasNext()){
Map.Entry entry = (Map.Entry)iter.next();
Object key = entry.getKey();
Object value = entry.geyValue();
sResult +="\r\n key----> "+(String)key;  
sResult +="\r\n value----> "+(String)value;     
}


整理笔记来源:http://blog.csdn.net/xiao__gui/article/details/11392987
ttp://blog.csdn.net/xcl168/article/details/14436539
原创粉丝点击