|
一.Intent的介绍
Intent的中文意思是“意图,意向”,在Android中提供了Intent机制来协助应用间的交互与通讯,Intent负责对应用中一次操作的动作、动作涉及数据、附加数据进行描述,Android则根据此Intent的描述,负责找到对应的组件,将 Intent传递给调用的组件,并完成组件的调用。Intent不仅可用于应用程序之间,也可用于应用程序内部的Activity/Service之间的交互。因此,可以将Intent理解为不同组件之间通信的“媒介”专门提供组件互相调用的相关信息。
二.Inten启动组件的方法
Intent可以启动一个Activity,也可以启动一个Service,还可以发起一个广播Broadcasts。具体方法如下:
组件名称 <o:p></o:p> | 方法名称 <o:p></o:p> | <o:p> </o:p>
Activity<o:p></o:p> | startActvity( )<o:p></o:p>
startActivity( )<o:p></o:p> | <o:p> </o:p>
Service<o:p></o:p> | startService( )<o:p></o:p>
bindService( )<o:p></o:p> | <o:p> </o:p>
Broadcasts<o:p></o:p> | sendBroadcasts( )<o:p></o:p>
sendOrderedBroadcasts( )<o:p></o:p>
sendStickyBroadcasts( )<o:p></o:p> |
三.Intent的属性
Intent有以下几个属性:
动作(Action),数据(Data),分类(Category),类型(Type),组件(Compent)以及扩展信(Extra)。其中最常用的是Action属性和Data属性。
1.Intent的Action属性
Action是指Intent要完成的动作,是一个字符串常量。SDK中定义了一些标准的Action常量如下表所示。
Constant<o:p></o:p> | Target component<o:p></o:p> | Action<o:p></o:p> | ACTION_CALL <o:p></o:p> | activity <o:p></o:p> | Initiate a phone call.<o:p></o:p> | ACTION_EDIT <o:p></o:p> | activity <o:p></o:p> | Display data for the user to edit.<o:p></o:p> | ACTION_MAIN <o:p></o:p> | activity <o:p></o:p> | Start up as the initial activity of a task, with no data input and no returned output.<o:p></o:p> | ACTION_SYNC <o:p></o:p> | activity <o:p></o:p> | Synchronize data on a server with data on the mobile device.<o:p></o:p> | ACTION_BATTERY_LOW <o:p></o:p> | broadcast receiver <o:p></o:p> | A warning that the battery is low.<o:p></o:p> | ACTION_HEADSET_PLUG <o:p></o:p> | broadcast receiver <o:p></o:p> | A headset has been plugged into the device, or unplugged from it.<o:p></o:p> | ACTION_SCREEN_ON <o:p></o:p> | broadcast receiver <o:p></o:p> | The screen has been turned on.<o:p></o:p> | ACTION_TIMEZONE_CHANGED <o:p></o:p> | broadcast receiver <o:p></o:p> | The setting for the time zone has changed.<o:p></o:p> |
下面是一个测试Action常量的例子:
main.xml
- <? xml version = "1.0" encoding = "utf-8" ?>
- < LinearLayout xmlns:android = "http://schemas.android.com/apk/res/android"
- android:orientation = "vertical"
- android:layout_width = "fill_parent"
- android:layout_height = "fill_parent"
- >
- < TextView
- android:layout_width = "fill_parent"
- android:layout_height = "wrap_content"
- android:text = "@string/hello"
- />
- < Button
- android:text = "测试Action属性"
- android:id = "@+id/getBtn"
- android:layout_width = "wrap_content"
- android:layout_height = "wrap_content"
- />
- </ LinearLayout >
strings.xml
- <? xml version = "1.0" encoding = "utf-8" ?>
- < resources >
- < string name = "hello" > 测试Action属性 </ string >
- < string name = "app_name" > IntentActionDemo </ string >
- </ resources >
MainActivity.java
- package com.android.action.activity;
- import android.app.Activity;
- import android.content.Intent;
- import android.os.Bundle;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.widget.Button;
- public class MainActivity extends Activity {
- private Button getBtn;
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super .onCreate(savedInstanceState);
- setContentView(R.layout.main);
- getBtn=(Button)findViewById(R.id.getBtn);
- getBtn.setOnClickListener( new OnClickListener() {
- @Override
- public void onClick(View v) {
- Intent intent = new Intent();
- intent.setAction(Intent.ACTION_GET_CONTENT); // 设置Intent Action属性
- intent.setType( "vnd.android.cursor.item/phone" ); // 设置Intent Type 属性
- //主要是获取通讯录的内容
- startActivity(intent); // 启动Activity
- }
- });
- }
- }
效果图:
[url=s1.51cto.com/attachment/201108/232215811.jpg] [/url][url=s1.51cto.com/attachment/201108/232235711.jpg] [/url]
2.Intent的Data属性
Intent的Data属性是执行动作的URI和MIME类型,不同的Action有不同的Data数据指定。比如:ACTION_EDIT Action应该和要编辑的文档URI Data匹配,ACTION_VIEW应用应该和要显示的URI匹配。
3.Intent的Category属性
Intent中的Category属性是一个执行动作Action的附加信息。比如:CATEGORY_HOME则表示放回到Home界面,ALTERNATIVE_CATEGORY表示当前的Intent是一系列的可选动作中的一个。下表是SDK文档中关于Category的信息。
Constant<o:p></o:p> | Meaning<o:p></o:p> | CATEGORY_BROWSABLE <o:p></o:p> | The target activity can be safely invoked by the browser to display data referenced by a link — for example, an p_w_picpath or an e-mail message.<o:p></o:p> | CATEGORY_GADGET <o:p></o:p> | The activity can be embedded inside of another activity that hosts gadgets.<o:p></o:p> | CATEGORY_HOME <o:p></o:p> | The activity displays the home screen, the first screen the user sees when the device is turned on or when the HOME key is pressed.<o:p></o:p> | CATEGORY_LAUNCHER <o:p></o:p> | The activity can be the initial activity of a task and is listed in the top-level application launcher.<o:p></o:p> | CATEGORY_PREFERENCE <o:p></o:p> | The target activity is a preference panel.<o:p></o:p> |
下面是一个回到Home界面的例子:
main.xml
- <? xml version = "1.0" encoding = "utf-8" ?>
- < LinearLayout xmlns:android = "http://schemas.android.com/apk/res/android"
- android:orientation = "vertical" android:layout_width = "fill_parent"
- android:layout_height = "fill_parent"
- >
- < TextView
- android:layout_width = "fill_parent"
- android:layout_height = "wrap_content"
- android:text = "测试Intent Category"
- />
- < Button
- android:id = "@+id/Button1"
- android:layout_width = "wrap_content"
- android:layout_height = "wrap_content"
- android:text = "转到Home界面"
- />
- </ LinearLayout >
strings.xml
- <? xml version = "1.0" encoding = "utf-8" ?>
- < resources >
- < string name = "hello" > Hello World, MainActivity! </ string >
- < string name = "app_name" > IntentCategoryDemo </ string >
- </ resources >
MainActivity.java
- package com.android.category.activity;
- import android.app.Activity;
- import android.content.Intent;
- import android.os.Bundle;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.widget.Button;
- public class MainActivity extends Activity {
- private Button btn;
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super .onCreate(savedInstanceState);
- setContentView(R.layout.main);
- btn = (Button)findViewById(R.id.Button1);
- btn.setOnClickListener( new OnClickListener() {
- @Override
- public void onClick(View v) {
- Intent intent = new Intent();
- intent.setAction(Intent.ACTION_MAIN); // 添加Action属性
- intent.addCategory(Intent.CATEGORY_HOME); // 添加Category属性
- startActivity(intent); // 启动Activity
- }
- });
- }
- }
效果图:
[url=s1.51cto.com/attachment/201108/230955675.jpg] [/url][url=s1.51cto.com/attachment/201108/231025114.jpg] [/url]
4.Intent的Type属性
Intent的Type属性显式指定Intent的数据类型(MIME)。一般Intent的数据类型能够根据数据本身进行判定,但是通过设置这个属性,可以强制采用显式指定的类型而不再进行推导。
5.Intent的Compent属性
Intent的Compent属性指定Intent的的目标组件的类名称。通常 Android会根据Intent 中包含的其它属性的信息,比如action、data/type、category进行查找,最终找到一个与之匹配的目标组件。但是,如果 component这个属性有指定的话,将直接使用它指定的组件,而不再执行上述查找过程。指定了这个属性以后,Intent的其它所有属性都是可选的。
6.Intent的Extra属性
Intent的Extra属性是添加一些组件的附加信息。比如,如果我们要通过一个Activity来发送一个Email,就可以通过Extra属性来添加subject和body。
下面的例子在第一个Activity的EditText输入用户名,该年龄保存在Intent的Extras属性中。当单击Button时,会在第二个Activity中显示用户名。
first.xml
- <? xml version = "1.0" encoding = "utf-8" ?>
- < LinearLayout xmlns:android = "http://schemas.android.com/apk/res/android"
- android:orientation = "vertical"
- android:layout_width = "fill_parent"
- android:layout_height = "fill_parent"
- >
- < TextView
- android:layout_width = "wrap_content"
- android:layout_height = "wrap_content"
- android:text = "请输入用户名"
- />
- < EditText
- android:id = "@+id/EditText1"
- android:layout_width = "fill_parent"
- android:layout_height = "wrap_content"
- />
- < Button
- android:id = "@+id/Button1"
- android:layout_width = "wrap_content"
- android:layout_height = "wrap_content"
- android:text = "测试Extras属性"
- />
- </ LinearLayout >
second.xml
- <? xml version = "1.0" encoding = "utf-8" ?>
- < LinearLayout xmlns:android = "http://schemas.android.com/apk/res/android"
- android:orientation = "vertical"
- android:layout_width = "fill_parent"
- android:layout_height = "fill_parent"
- >
- < TextView
- android:id = "@+id/TextView1"
- android:layout_width = "wrap_content"
- android:layout_height = "wrap_content"
- />
- </ LinearLayout >
strings.xml
- <? xml version = "1.0" encoding = "utf-8" ?>
- < resources >
- < string name = "hello" > Hello World, FirstActivity! </ string >
- < string name = "app_name" > IntentExtrasDemo </ string >
- </ resources >
FirstActivity.java
- package com.android.extras.activity;
- import android.app.Activity;
- import android.content.Intent;
- import android.os.Bundle;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.widget.Button;
- import android.widget.EditText;
- public class FirstActivity extends Activity {
- private Button btn;
- private EditText etx;
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.first);
- btn = (Button)findViewById(R.id.Button1);
- etx = (EditText)findViewById(R.id.EditText1);
- btn.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- Intent intent = new Intent();
- //设置Intent的class属性,跳转到SecondActivity
- intent.setClass(FirstActivity.this, SecondActivity.class);
- //为intent添加额外的信息
- intent.putExtra("useName", etx.getText().toString());
- //启动Activity
- startActivity(intent);
- }
- });
- }
- }
SecondActivity.java
- package com.android.extras.activity;
- import android.app.Activity;
- import android.content.Intent;
- import android.os.Bundle;
- import android.widget.TextView;
- public class SecondActivity extends Activity {
- private TextView tv;
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super .onCreate(savedInstanceState);
- //设置当前的Activity的界面布局
- setContentView(R.layout.second);
- //获得Intent
- Intent intent = this .getIntent();
- tv = (TextView)findViewById(R.id.TextView1);
- //从Intent获得额外信息,设置为TextView的文本
- tv.setText(intent.getStringExtra( "useName" ));
- }
- }
注意:在添加第二个Activity SecondActivity的时候,要在AndroidManifest.xml里面添加上SecondActivity,具体如下,即是在15行</activity>的后面添加上16~18行的代码。如果不这样做,就会在模拟器上出现错误。
- <? xml version = "1.0" encoding = "utf-8" ?>
- < manifest xmlns:android = "http://schemas.android.com/apk/res/android"
- package = "com.android.extras.activity"
- android:versionCode = "1"
- android:versionName = "1.0" >
- < uses-sdk android:minSdkVersion = "10" />
- < application android:icon = "@drawable/icon" android:label = "@string/app_name" >
- < activity android:name = ".FirstActivity"
- android:label = "@string/app_name" >
- < intent-filter >
- < action android:name = "android.intent.action.MAIN" />
- < category android:name = "android.intent.category.LAUNCHER" />
- </ intent-filter >
- </ activity >
- < activity android:name = ".SecondActivity"
- android:label = "@string/app_name" >
- </ activity >
- </ application >
- </ manifest >
效果图:
 
----------------------------
原文链接:https://blog.51cto.com/liangruijun/634411
[这个贴子最后由 flybird 在 2020-01-07 20:14:13 重新编辑]
|
|