`

Intent 详解

 
阅读更多

Intent意图

Android基本的设计理念是鼓励减少组件间的耦合,因此Android提供了Intent。Intent提供了一种通用的消息系统,他允许在你的应用程序与其他的应用程序间传递Intent来执行动作和产生事件。

 

使用Intent可以划分三种类型的核心组件:Activity(活动),Service(服务),Broadcast(广播)

 

Intent的常用属性

     1,Component  (应用程序中有很多Activity,根据ComponentName决定要启动某一个Activity)

      2,Action  (指定下一个Activity的功能)

      3,Data (传输了什么数据)  Uri数据

      4,Extras (存放数据)  Bundle

      5,Category (类别,在该属性中可通过一个字符串来表示启动窗口时符合的类别)

      6,Flags  (启动标识值)

显示意图(explicit) 和 隐式意图(implicit)

 

显示意图:调用Intent.setComponent() / Intent.setClassName() /Intent.setClass()

等方法明确指定了要激活的组件名称的Intent显示意图,显示意图明确指定了要激活的组件是哪个组件。

 

Intent intent= new Intent(this, B.class) 
intent.setClassName("com.lydia.day01", "com.lydia.day01.MainActivity3");
intent.setClass(TelPhoneActivity.this, MainActivity3.class);
intent.setComponent(new ComponentName("com.tarena.day01","com.tarena.day01.MainActivity3"));

 

 

 隐式意图:没有明确指定组件的Intent,而是通过设置一些Intent Filter来让系统去筛选合适的Acitivity去启动。

                   主要利用Intent的action属性和Category属性

AndroidManifest.xml中

 

<Activity android:name=".MainActiviy01">
<intent-filter>
     <action android:name="com.lydia.wh"></action>
     <category android:name="com.lydia.category.android"/>
 </intent-filter>
</Activity>

 Activity中:

 

 

intent.setAction("com.lydia.wh");
intent.addCategory("com.lydia.category.android");
startAvtivity(intent);

 

 

注意:这样是匹配不了的,因为startActivity(intent)的方法内部为Intent增加了下面这个类别:

 

           <category android:name="android.intent.category.DEFAULT"/>

          所以:我们定义的activity如果接受implicit intent的话,intent-filer就一定要加上android.intent.category.DEFAULT这个category。

 

Data匹配

1,如果intent-filter 中加入:

 

<data android:scheme="wuhan" 
	android:host="www.baidu.com"  android:path="/charles">
</data>

 则必须和:wuhan://www.027tarena.com/charles 来匹配,否则不成功

 

 

intent.setData(Uri.parse("wuhan://www.baidu.com/charles"));

 

 

2,如果intent-filter 中加入:

<data android:mimeType="image/*"></data>  <--匹配图片-->

 则:

intent.setDataAndType(Uri.parse("wuhan://www.baidu.com/charles"), "image/jpeg");

 

Intent传值:

发送代码:

// intent.putExtra("123", "123");

// intent.putExtra("456", "456");

---------------------

Intent intent = new Intent(...); 

Bundle bundle = new Bundle(); 

bundle.putString("param", "value"); 

intent.putExtras(bundle); 

context.startActivity(intent);

--------------------------

传入对象:Entity实体类一定要实现序列号接口

//传递一个对象:方法1,Entity要实现Serializable接口

extras.putSerializable("user", (Serializable) p);

//传递一个对象:方法2,Entity要实现Parcelable接口

// extras.putParcelable("user", (Parcelable) p);

 

===============================

接收代码:

intent = this.getIntent();

// String ss = intent.getStringExtra("123");

// String high = intent.getStringExtra("456");

---------------------

Bundle bunde = intent.getExtras(); 

String name = bunde.get("param"); 

---------------------

Person p = (Person) intent.getSerializableExtra("user");

 

//Person p = (Person) intent.getParcelableExtra("user");

 

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics