Intent 进阶
(一)概述
Intent 负责组件之间消息传递和跳转,较好地实现了组件之间的解耦合。
耦合是指两个应用程序之间存在的依赖关系程度。依赖程度高的称为强耦合,依赖程度低的称为弱耦合。
软件开发推荐应用程序之间采用弱耦合的方式,即某个应用程序的改动,对其它的应用程序的影响越小越好。这种设计方式能最大程度地降低程序维护的成本。
预定义 mAction 和 mCategories 属性值
Action 和 category 的值可以自定义,Android 系统也提供了许多预定义的常量值,用于启动系统预定义的 Activity、Service。
Intent 类中与 Action 相关的常量列表
mAction 常量 对应的字符串 说明 ACTION_MIAN android.intent.action.MAIN 应用程序入口 ACTION_VIEW android.intent.action.VIEW 显示指定数据 ACTION_EDIT android.intent.action.EDIT 编辑指定数据 ACTION_DIAL android.intent.action.DIAL 显示拨号面板 ACTION_CALL android.intent.action.CALL 向指定用户打电话 ACTION_SEND android.intent.action.SEND 发送数据 ACTION_SENDTO android.intent.action.SENDTO 发送消息 ACTION_ANSWER android.intent.action.ANSWER 应答电话 ACTION_INSERT android.intent.action.INSERT 插入数据 ACTION_DELETE android.intent.action.DELETE 删除数据 ACTION_RUN android.intent.action.RUN 运行数据 ACTION_SYNC android.intent.action.SYNC 用户数据同步 ACTION_PICK_ACTIVITY android.intent.action.PICK_ACTIVIT 选择Activity ACTION_SEARCH android.intent.action.SEARCH 执行搜索 ACTION_WEB_SEARCH android.intent.action.WEB_SEARCH 执行Web搜索
Intent 类中与 Category 相关的常量值列表
mCategory 常量 对应的字符串 说明 CATEGORY_DEFAULT android.intent.category_DEFAULT 默认的Category CATEGORY_LAUNCHER android.intent.category_LAUNCHER Activity 显示在顶级程序列表中 CATEGORY_INFO android.intent.category_INFO 用于提供包信息 CATEGORY_HOME android.intent.category_HOME 设置该 Activity 随系统启动而运行 CATEGORY_PREFERENCE android.intent.category_PREFERENCE 设置 Activity 是参数面板
(二)<intent-filter>标签
1、概述
以上的启动还差一个环节,在项目清单中注册组件时,在<intent-filter>标签中设置<action>标签和<category>标签的值
<intent-filter>是 Intent 的过滤器,在该过滤器中通过在<action>、<category>标签中设置条件,凡符合设置条件的 Activity 都会被启动。
2、通过 Action 和 Category 启动 Activity
假设有一个名为 SecondActivity.java 的 Activity,项目入口为:MainActivity,按以下步骤启动 SecondActivity:
步骤1、在项目清单文件中注册 SecondActivity 类。
<activity android:name=".SecondActivity">
<intent-filter>
<action android:name="com.jxust.SECOND_ACTIVITY"/>
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
步骤2、在MainActivity 的 onCreate()方法中输入以下代码:
Intent intent = new Intent();
intent.setAction("com.jxust.SECOND_ACTIVITY");
intent.addCategory("android.intent.category.DEFAULT");
*** 隐式意图启动系统预定义Activity ***
为什么要用隐式意图启动系统预定义 Activity?
因为显式意图只能用于启动同一个程序中的 Activity,如果想要启动不同程序中的 Activity 就需要使用隐式意图来启动。
实例:
MainActivity.java代码
package com.jxust.day04_06_intentdemo; import java.io.File; import android.app.Activity; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.os.Environment; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.View.OnClickListener; public class MainActivity extends Activity implements OnClickListener { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); setListener(); } private void setListener() { findViewById(R.id.btnBrowser).setOnClickListener(this); findViewById(R.id.btnCall).setOnClickListener(this); findViewById(R.id.btnDial).setOnClickListener(this); findViewById(R.id.btnInstall).setOnClickListener(this); findViewById(R.id.btnPlayMusic).setOnClickListener(this); findViewById(R.id.btnSendSms).setOnClickListener(this); findViewById(R.id.btnStartSecondActivity).setOnClickListener(this); findViewById(R.id.btnUninstall).setOnClickListener(this); } @Override public void onClick(View v) { Intent intent = null; switch (v.getId()) { case R.id.btnBrowser: intent = new Intent(Intent.ACTION_VIEW); intent.setData(Uri.parse("http://www.baidu.com")); break; case R.id.btnCall: intent = new Intent(Intent.ACTION_CALL); intent.setData(Uri.parse("tel:11111111111")); // 这个是拨号的固定格式 // 拨号要一个权限所以要在Manifest里设置好 break; case R.id.btnDial: intent = new Intent(Intent.ACTION_DIAL); intent.setData(Uri.parse("tel:110")); break; case R.id.btnInstall: { // 自动找到 android 系统中的 SD 卡中的 Download 目录 File dir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS); File file = new File(dir, "mobileqq_android.apk"); intent = new Intent(Intent.ACTION_VIEW); // 特别需要注意的是application/vnd.android.package-archive 是固定写法 intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive"); } break; case R.id.btnPlayMusic: { intent = new Intent(Intent.ACTION_VIEW); File dir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS); File file = new File(dir, "Amy Diamond - Heartbeats.mp3"); intent.setDataAndType(Uri.fromFile(file), "audio/mp3"); } break; case R.id.btnSendSms: intent = new Intent(Intent.ACTION_SENDTO); intent.setData(Uri.parse("smsto:11111111111")); intent.putExtra("sms_body", "hello android!"); break; case R.id.btnStartSecondActivity: intent = new Intent("com.jxust.day04_06.SecondActivity"); break; case R.id.btnUninstall: intent = new Intent(Intent.ACTION_DELETE); intent.setData(Uri.parse("package:com.jxust.day04_02_startactivityforresut")); break; } startActivity(intent); } }
activity_main.xml代码
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <Button android:id="@+id/btnStartSecondActivity" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="start SecondActivity" /> <Button android:id="@+id/btnBrowser" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="浏览网页" /> <Button android:id="@+id/btnCall" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="拨打电话" /> <Button android:id="@+id/btnDial" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="启动拨号面板" /> <Button android:id="@+id/btnUninstall" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="卸载应用程序" /> <Button android:id="@+id/btnInstall" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="安装应用程序" /> <Button android:id="@+id/btnSendSms" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="发送短信" /> <Button android:id="@+id/btnPlayMusic" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="播放音乐" /> </LinearLayout>
Manifast.xml代码
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.jxust.day04_06_intentdemo" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="14" android:targetSdkVersion="21" /> <uses-permission android:name="android.permission.CALL_PHONE"/> <!-- 拨号所需要的权限 --> <uses-permission android:name="android.permission.INTERNET"/> <!-- 浏览网页所需要的权限 --> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name=".MainActivity" 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/title_activity_second" > <intent-filter > <action android:name="com.jxust.day04_06.SecondActivity"/> <category android:name="android.intent.category.DEFAULT"/> </intent-filter> </activity> </application> </manifest>
activity_second.xml代码
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="com.jxust.day04_06_intentdemo.SecondActivity" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/hello_world" /> </RelativeLayout>
SecondActivity.java代码
package com.jxust.day04_06_intentdemo; import android.app.Activity; import android.os.Bundle; import android.util.Log; import android.view.Menu; import android.view.MenuItem; public class SecondActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); Log.i("main", "SecondActivity.onCreate()"); } }
相关推荐
《Android高手进阶教程》是一本专为已经具备Android基础知识并渴望进一步提升技能的开发者设计的教程。本书深入探讨了Android开发的高级概念和技术,旨在帮助读者从技术层面跨越到专家水平。 首先,我们来了解一下...
1. **Activity与Intent**:深入解析Activity生命周期和Intent机制,如何合理管理Activity栈,以及如何通过Intent进行组件间通信,包括隐式Intent和显式Intent的使用。 2. **Service**:详细讲解Service的启动、绑定...
4. **Android框架源码解析**:深入研究Android系统框架,如Activity、Intent、BroadcastReceiver、ContentProvider的工作原理,有助于理解和解决实际问题。 5. **Jetpack组件库**:Jetpack是Google推出的Android...
在“Android进阶知识点一”这个主题中,我们主要探讨的是Android应用开发的高级概念,特别是在使用Android Studio作为开发环境时遇到的各种技术和实践。这个知识判断器可能是一个小型的交互式应用,它根据用户的选择...
在Android开发领域,深入理解源码是提升技能的关键步骤,特别是在进阶阶段。"进阶Android源码demo"提供了一系列的实践项目,包括游戏和聊天应用,为开发者提供了丰富的学习资源。下面,我们将深入探讨这些知识点,以...
五、学习与进阶 理解并熟练掌握Intent_TabHostSample源码,不仅可以帮助开发者快速构建多标签页应用,还能深入了解Android组件通信机制。进一步,可以研究如何结合Fragment实现更灵活的界面切换,或者使用ViewPager...
同时,读者将了解到Activity和Intent的概念,它们是Android应用中的核心元素,负责管理用户界面和应用间通信。此外,Service、BroadcastReceiver和ContentProvider也会得到深入讨论,这些都是构建功能丰富的Android...
《Android开发进阶:从小工到专家》这本书是Android开发者提升技能的重要参考资料,它面向有一定基础的Android程序员,旨在帮助他们从初级阶段过渡到高级专家水平。书中涵盖了一系列深入的Android开发主题,包括但不...
《Android开发进阶从小工到专家》是一本旨在帮助Android开发者提升技能,从初学者逐步成长为专业人士的指南。这本书涵盖了Android开发的多个方面,包括基础知识、高级技术以及实践应用,旨在帮助读者掌握全面且深入...
在Android应用开发进阶工程中,我们探讨的主题是Android应用程序的高级开发技术。这个压缩包包含了一系列单独的模块,每个模块都专注于一个特定的开发领域,以帮助学习者深入理解和实践Android开发的关键概念。 ...
3. Intent机制:理解Intent的作用,掌握如何通过Intent在组件间传递数据和启动服务。 四、网络编程 1. HTTP请求:学习使用HttpURLConnection或OkHttp进行网络请求,处理JSON或XML数据。 2. Retrofit:引入Retrofit...
- Intent:不仅用于启动Activity和服务,还可以实现不同进程间的通信。 - AIDL (Android Interface Definition Language):一种接口定义语言,用于创建可以在不同进程间调用的方法。 6. **高级特性**: - ...
在核心组件方面,书籍详细介绍了Activity的生命周期管理、Intent的使用,以及Service、BroadcastReceiver、ContentProvider的原理和实践。这些组件是Android应用的基石,理解并掌握它们能帮助开发者构建功能完善的...
### Android高手进阶教程知识点概览 #### 一、Android常用命令集锦 - **ADB命令**: ADB(Android Debug Bridge)是Android平台下用于调试的工具,它可以帮助开发者进行设备管理、应用安装与卸载等操作。 - `adb ...
它可能会详细介绍如何创建Activity、Intent、布局管理器,以及如何处理用户输入和事件。此外,还会讲解Android的四大组件(Activity、Service、Broadcast Receiver、Content Provider)的应用场景和实现方法。对于...
《Android高手进阶教程》是一份详尽的指南,旨在帮助开发者深入了解并掌握Android平台的高级功能与技术细节。这份教程覆盖了多个关键主题,包括系统命令、UI组件的定制化、数据存储、网络通信、位置服务等,是提升...