Intent对象是一组信息,我们能够通过设置其Action、Data、Category属性来指定启动哪个组件并完毕什么样的动作(包括动作所需的数据)。
"意图"分为显示intent和隐式intent。所谓显示intent,指的是Intent已经明白了它将要启动哪个组件-通过指定Intent对象的Component属性实现。而隐式intent,
指的是 Intent不能确定它将要启动哪个组件( 没有指定Component属性 )-通过AndroidManifest.xml文件里的Intent Filter来对组件进行筛选来确定启动的组件。 一、显式"intent" 显式"意图"。顾名思义,就是指Intent已经明白以我们可了它将要启动哪个组件。因为一个组件类能够通过其所在的包名和类名唯一的确定,所以通过intent的Component属性来实现。Intent的Component属性须要接受一个ComponentName对象。其构造函数传入了该组件的包名、类名。 1.显式"intent"开发基本思路 (1)创建一个ComponentName对象,用于为"意图"指定组件包名、类名 ComponentName comp=new ComponentName(ComponentAttr.this,SecondaryActivity.class); (2)创建一个Intent对象,并为该对象设置Component属性 Intent intent=new Intent(); intent.setComponent(comp); 注意:通过使用Intent不同的构造函数,(1)、(2)步骤能够合并为: Intent intent=new Intent(ComponentAttr.this,SecondaryActivity.class); (3)启动一个类名为SecondaryActivity的Activity组件 startActivity(intent); 或者 startActivityForResult(intent,requestCode); //关闭启动的Activity会返回结果 (4)实现被启动的组件SecondaryActivity类(继承于Activity) (5)在AndroidManifest.xml加入一个<Activity></Activity>元素,可是无需配置<intent-filter>元素 <!-- 被intent启动的activity --> <activity android:name=".SecondaryActivity" android:label="第二个Activity界面" > <intent-filter> <action android:name="action.CRAZYIT_ACTION"/> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>显式intent能够通过设置其Component属性实现。而隐式intent就通过Intent Filter来实现。
详细的说就是,我们事先设置好"意图"启动组件的相关信息(intent属性),然后再在其它组件的AndroidManifest.xml文件设置好对应的intent属性。当组件发出"意图"时。Android系统通过查找project文件
AndroidManifest.xml(或者系统级组件)其它组件的<intent-filter/>相关信息来进行匹配。筛选得到满足"意图"条件的组件。 1.使用Action属性开发基本思路 Intent是组件之间的通信的载体,组件的通信能够分为应用内部组件之间的通信和应用间的通信。Intent的Action、Category属性都是一个普通的字符串,当中Action代表Intent索要完毕的一个"抽象"动作,Category属性用于为Action添加附加的类别信息。 (1)应用内部组件通信-自己定义字符串 方式 public final String CUSTOME_ACTION="intent.action.CUSTOME_JIANG";//字符串能够随意 Intent intent=new Intent(); //创建一个Intent对象 intent.setAction(ActionAttr.CUSTOME_ACTION); //注意:ActionAttr为我们创建的类 startActivity(intent); //启动一个Activity (2)与其它应用程序通信-使用系统预定action常量 Intent intent=new Intent(); intent.setAction(Intent.ACTION_CALL); //当中ACTION_CALL为Intent类的静态成员变量,能够类直接调用 startActivity(intent); 2.使用Action、Category属性开发基本思路 (1)应用内部组件通信-自己定义字符串 方式 public final String CUSTOME_ACTION="intent.action.CUSTOME_JIANG";//字符串能够随意 public final String CUSTOME_CATEGORY="intent.action.CUSTOME_CATEGORY";//字符串能够随意 Intent intent=new Intent(); //创建一个Intent对象 intent.setAction(ActionAttr.CUSTOME_ACTION); //注意:ActionAttr为我们创建的类 intent.addCategory(ActionAttr.CUSTOME_CATEGORY); startActivity(intent); //启动一个Activity (2)使用系统预定action、category常量-下面代码实现当点击某个button时,通过Intent对象实现返回HOME桌面。 Intent intent=new Intent(); intent.setAction(Intent.ACTION_MAIN); intent.addCategory(Intent.CATEGORY_HOME);//返回Home桌面 startActivity(intent); //启动一个Activity 注意:这里无需设置AndroidManifest.xml 假设是实现应用内部组件的通信。除了上述(1)(2)步骤,我们还须要完毕步: (3)实现须要启动的Activity,如SecondaryActivity.java,ThirdActivity.java,使其继承于Activity; (4)在projectAndroidManifest.xml加入<activity></activity>元素,并加入<intent-filter/>相关信息 <activity android:name=".SecondaryActivity" android:label="第二个Activity界面" > <intent-filter> <action android:name="intent.action.JIANG_ACTION" /> <category android:name="intent.action.JIANG_CATEGORY" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity> <activity android:name=".ThirdActivity" android:label="第三个Activity界面" > <intent-filter> <action android:name="intent.action.JIANG_ACTION" /> <category android:name="intent.action.JIANG_CATEGORY" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>这里须要注意的是,Type属性和Data属性通常会出现相互覆盖的情况,假设希望Intent既有Data属性也有Type属性,必须通过setDataAndType()方法来实现。
这里须要注意的是,Data属性仅仅接受一个Uri对象。一个Uri对象通常通过例如以下形式的字符串来表示:
Uri字符串格式:scheme://host:port/path 举例: content://com.android.contacts/contacts/1或tel://18819463209 这里有两 种情况。一是启动系统级应用程序;二是。启动应用内部组件。前者无需配置 AndroidManifest.xml中的<data../>元素。仅仅需加入对应权限就可以;后者。须要配置 AndroidManifest.xml中的<data/>元素内容。当中。为组件声明Data、Type属性都通过<data../>元素,格式例如以下: <data android:mimeType="" //用于声明该组件所能匹配的Intent的Type属性 android:scheme="" //协议 android:host="" //用于声明该组件所能匹配的Intent的Data属性host部分(主机) android:port="" //串口 android:path="" //资源路径 android:pathPrefix="" //Data属性的前缀 android:pathPattern=""/> //Data属性的path字符串模板 情况一、启动系统级应用组件 (1)实现一个Intent对象。并启动组件 Intent intent=new Intent(); //创建一个Intent对象 String data="content://com.android.contacts/contacts/1"; Uri uri=Uri.parse(data); //将字符串转换为Uri intent.setAction(Intent.ACTION_VIEW); //设置Intent对象Action属性 intent.setData(uri); //设置Intent对象Data属性 startActivity(intent); 或者 Intent intent=new Intent(); intent.setAction(Intent.ACTION_VIEW); intent.setData(Uri.parse("content://com.android.contacts/contacts/1")); startActivity(intent); (2)在 AndroidManifest.xml中加入对应的权限 在Android中读取电话信息时,要注意增加 <use-permission android:name="android.permission.READ_CONTACTS"/> 在android中使用BroadcastReceiver时 <use-permission android:name="android.permission.RECEIVE_SMS"/> 在android中使用有关的文件下载功能时,要使用到的 <use-permission android:name="android.permission.INTERNET"/> <use-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> (3)源码 该应用程序实现三个button实现三个功能:打开网页、编辑联系人、拨打电话 firstActivity.java package com.android.android_intent_4; import android.support.v7.app.ActionBarActivity; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.content.Intent; import android.net.Uri; import android.os.Bundle; public class MainActivity extends ActionBarActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); /*第一个按键功能:打开网页*/ Button btn1=(Button)findViewById(R.id.button1); btn1.setOnClickListener(new OnClickListener(){ //为按钮1注冊一个事件监听器对象 @Override public void onClick(View v) { //1.创建Intent Intent intent=new Intent(); //2.设置action、data属性 String data="http://www.baidu.com"; Uri uri=Uri.parse(data); //将字符串转化为Uri-通用资源标识 intent.setAction(Intent.ACTION_VIEW); //设置intent属性为系统提前定义的Intent.ACTION_VIEW intent.setData(uri); //为intent设置数据属性。用于传递数据 //3.启动Activity startActivity(intent); }}); /*第二个按键功能:编辑标识为1的联系人*/ Button btn2=(Button)findViewById(R.id.button2); btn2.setOnClickListener(new OnClickListener(){ //为按钮1注冊一个事件监听器对象 @Override public void onClick(View v) { //1.创建Intent Intent intent=new Intent(); //2.设置action、data属性 intent.setAction(Intent.ACTION_EDIT); //设置intent属性为系统提前定义的Intent.ACTION_VIEW intent.setData(Uri.parse("content://com.android.contacts/contacts/1")); //为intent设置数据属性。依据指定的字符解析出Uri对象 //3.启动Activity startActivity(intent); }}); /*第三个按键功能:拨打电话18819465188*/ Button btn3=(Button)findViewById(R.id.button3); btn3.setOnClickListener(new OnClickListener(){ //为按钮1注冊一个事件监听器对象 @Override public void onClick(View v) { //1.创建Intent Intent intent=new Intent(); //2.设置action、data属性 intent.setAction(Intent.ACTION_DIAL); //设置intent属性为系统提前定义的Intent.ACTION_VIEW intent.setData(Uri.parse("tel:18819465188")); //依据指定的字符解析出Uri对象 //3.启动Activity startActivity(intent); }}); } } 效果例如以下图: 情况二、启动应用内部组件 (1)实现一个Intent对象,并启动组件 Intent intent=new Intent(); //创建一个Intent对象 String data="lee://www.fkjava.org:8888/mypath"; Uri uri=Uri.parse(data); //将字符串转换为Uri intent.setAction(Intent.ACTION_VIEW); intent.setData(uri); //设置Intent对象Data属性 startActivity(intent); 或者 Intent intent=new Intent(); intent.setAction(Intent.ACTION_VIEW); intent.setData(Uri.parse("lee://www.fkjava.org:8888/mypath")); startActivity(intent); (2) 在 AndroidManifest.xml中设置<data../>元素中的相关内容就可以 <data android:mimeType="" android:host="" android:port="" android:path="" android:pathPrefix="" android:pathPattern=""/> (3)实现其他Activity版权声明:本文博主原创文章。博客,未经同意不得转载。
转载于:https://www.cnblogs.com/bhlsheji/p/4802570.html
相关资源:数据结构—成绩单生成器