Andriod学习系列之(四)Intent初涉
2015-08-23 09:54
459 查看
前言:上一节介绍了Activity的基本使用,那么这一节自然就得稍微讲一下Intent的使用了
和 LoginActivity 之间的数据交互,或者 Activity 与 Service 之间的交互等
Intent 负责描述 app 中一次操作的动作、动作涉及数据、附加数据,Android 则根据此 Intent 的描述,负责找到对应的组件,将 Intent 传递给调用的组件,并完成组件的调用(觉得这个说的也很抽象)。举个简单例子:比如我们要实现用户登录,当用户登录成功后进入欢迎的界面这一个需求,那么如何实现呢?这就得利用
Intent 了。步骤如下:
仅仅这两行代码就可以将 WelcomeActivity 显示给用户了(下面会实现类似的需求,进一步介绍 Intent),从这里可以看出,Intent起着一个媒体中介的作用,专门提供组件互相调用的相关信息,实现调用者与被调用者之间的解耦
1. 显示意图的案例:
activity_main.xml:
MainActivity.java:
LoginActivity.java:
部署运行结果和下面那个实例一起显示
2. 隐式意图案例:
1) 修改 activity_main.xml:添加一个 Button,onClick = click2
2) 修改清单文件 AndroidManifest.xml
3) 修改 MainActivity.java: 添加 click2 函数
注意:若我们的配置 action 不仅在 LoginActivity 中存在,还在其他 app 中存在,则点击 Button2 会弹出下面的对话框
3. 小结: 通过上面的案例,我们首先掌握了如下知识
如何通过 intent 来开启一个新的 Activity
如何配置新的 Activity
隐式意图和显示意图的基本使用
现在大家应该对二者还是有困惑,Question:两者的区别在哪里?
Answer:
显式意图:明确指出了目标组件名称的 Intent。它必须要指定要开启的组件的具体信息,如:包名、全类名,才能将组件激活。缺点:耦合度高,依赖于必须知道 app 的具体信息,一旦激活的 app 信息被修改,则项目报错
隐式意图:与显示意图恰恰相反,没有明确指出目标组件名称的 Intent,它不会用组件名称定义需要激活的目标组件,仅需描述动作的行为,它更广泛地用于在不同应用程序之间传递消息
二者的使用场景:
同一个 app 中,自己激活自己的组件,推荐使用显式意图--->效率高
不同的 app 中,激活别人的 app 或 让自己 app 的界面被人激活,推荐使用隐式意图--->耦合低,不易发生错误
注:源码下载 http://download.csdn.net/detail/gulu_gulu_jp/9037359
一、Intent 的介绍:
Intent 即意图,在 Android 参考文档中,对 Intent 的定义是执行某操作的一个抽象描述(有没有感觉确实很抽象?)。Intent 主要被用于解决 App 的各组件之间的通讯,比如:MainActivity和 LoginActivity 之间的数据交互,或者 Activity 与 Service 之间的交互等
Intent 负责描述 app 中一次操作的动作、动作涉及数据、附加数据,Android 则根据此 Intent 的描述,负责找到对应的组件,将 Intent 传递给调用的组件,并完成组件的调用(觉得这个说的也很抽象)。举个简单例子:比如我们要实现用户登录,当用户登录成功后进入欢迎的界面这一个需求,那么如何实现呢?这就得利用
Intent 了。步骤如下:
// 1. 获取 Intent 的实例:构造方法之一,传入两个 Activity Intent intent = new Intent(this, WelcomeActivity.class); // 2. 开启一个 Activity startActivity(intent);
仅仅这两行代码就可以将 WelcomeActivity 显示给用户了(下面会实现类似的需求,进一步介绍 Intent),从这里可以看出,Intent起着一个媒体中介的作用,专门提供组件互相调用的相关信息,实现调用者与被调用者之间的解耦
二、Intent 的使用:
Intent 分为两种,即显示意图和隐式意图。先分别给一个案例介绍一下1. 显示意图的案例:
activity_main.xml:
<LinearLayout 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:orientation="vertical" tools:context="com.johnnie.activity.MainActivity" > <Button android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/btn_txt" android:onClick="click"/> </LinearLayout>[注:如上一节一样, 按钮的文字说明放在res-->values-->strings.xml 中。此处 btn_txt 的字符串为 显示意图 Demo]
MainActivity.java:
public class MainActivity extends Activity { private Intent intent; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } /** * 需求:点击按钮,打开登录界面 * @param view */ public void click(View view){ // func1(); func2(); } /** * 利用显式 Intent 激活组件的第一种写法: */ private void func1() { intent = new Intent(); // setClassName(String packageName, String className) intent.setClassName("com.johnnie.inentdemo", "com.johnnie.inentdemo.LoginActivity"); // 开启一个 Activity startActivity(intent); } /** * 利用显式 Intent 激活组件的第二种写法: */ private void func2() { intent = new Intent(this, LoginActivity.class); // 开启一个 Activity startActivity(intent); } }
LoginActivity.java:
public class LoginActivity extends Activity implements OnClickListener{ private EditText et_username; private EditText et_userpass; private Button btn_login; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initViews(); initEvents(); } /** * 初始化控件 */ private void initViews() { et_username = (EditText) findViewById(R.id.et_username); et_userpass = (EditText) findViewById(R.id.et_userpass); btn_login = (Button) findViewById(R.id.btn_login); } /** * 监听事件 */ private void initEvents() { btn_login.setOnClickListener(this); // 按钮的点击事件 } /** * 控件被点击时:实现 android.view.View.OnClickListener 时,必须实现的方法 */ @Override public void onClick(View v) { switch (v.getId()) { case R.id.btn_login: login(); break; } } /** * 用户登录 */ private void login() { // 获取用户输入 String username = et_username.getText().toString().trim(); String userpass = et_userpass.getText().toString().trim(); // 输入校验 String msg = "登录失败!"; if (!TextUtils.isEmpty(userpass) && !TextUtils.isEmpty(username)) { msg = "登录成功!"; } // 弹出提示 Toast.makeText(this, msg, Toast.LENGTH_SHORT).show(); } }AndroidManifest.xml: 注册 LoginActivity[注:每次新建了一个 Activity 后,都要来这里注册 Activity]
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.johnnie.inentdemo" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="19" android:targetSdkVersion="21" /> <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" > <!-- 意图过滤器:相当于文件关联,让 Activity 与某动作相关联 --> <intent-filter> <!-- 指定当前的 Activity 是主 Activity --> <action android:name="android.intent.action.MAIN" /> <!-- 指定当前应用程序在桌面上产生一个快捷图标 --> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <!-- 注册 LoginActivity --> <activity android:name=".LoginActivity" android:label="@string/app_name" > </activity> </application> </manifest>
部署运行结果和下面那个实例一起显示
2. 隐式意图案例:
1) 修改 activity_main.xml:添加一个 Button,onClick = click2
2) 修改清单文件 AndroidManifest.xml
<activity android:name=".LoginActivity" android:label="@string/app_name" > <intent-filter> <!-- 自定义动作 --> <action android:name="com.johnnie.myaction" /> <!-- category 节点代表的就是附加选项 --> <category android:name="android.intent.category.DEFAULT" /> <!-- data 节点的定义表明该动作的执行必须接收数据,scheme 属性定义规则 --> <data android:scheme="johnnie" /> </intent-filter> </activity>
3) 修改 MainActivity.java: 添加 click2 函数
public void click2(View view){ Intent intent = new Intent(); // 指定自定义动作 intent.setAction("com.johnnie.myaction"); // addCategory: 附加的信息 intent.addCategory("android.intent.category.DEFAULT"); // 因为定义了 data 以及 scheme 属性,因此必须设置 data,且匹配规则前缀 intent.setData(Uri.parse("johnnie:hehe")); // 新开启一个 Activity startActivity(intent); }运行结果:
注意:若我们的配置 action 不仅在 LoginActivity 中存在,还在其他 app 中存在,则点击 Button2 会弹出下面的对话框
3. 小结: 通过上面的案例,我们首先掌握了如下知识
如何通过 intent 来开启一个新的 Activity
如何配置新的 Activity
隐式意图和显示意图的基本使用
现在大家应该对二者还是有困惑,Question:两者的区别在哪里?
Answer:
显式意图:明确指出了目标组件名称的 Intent。它必须要指定要开启的组件的具体信息,如:包名、全类名,才能将组件激活。缺点:耦合度高,依赖于必须知道 app 的具体信息,一旦激活的 app 信息被修改,则项目报错
隐式意图:与显示意图恰恰相反,没有明确指出目标组件名称的 Intent,它不会用组件名称定义需要激活的目标组件,仅需描述动作的行为,它更广泛地用于在不同应用程序之间传递消息
二者的使用场景:
同一个 app 中,自己激活自己的组件,推荐使用显式意图--->效率高
不同的 app 中,激活别人的 app 或 让自己 app 的界面被人激活,推荐使用隐式意图--->耦合低,不易发生错误
三、关于 Intent 的其他说明:
Intent 不仅可以开启一个新的 Activity(视图),还可以开启 Service(服务),Activity 之间的数据传递等,用处十分广泛。这些使用就留待下回分解了注:源码下载 http://download.csdn.net/detail/gulu_gulu_jp/9037359
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories