您的位置:首页 > 移动开发 > Android开发

Andriod学习系列之(四)Intent初涉

2015-08-23 09:54 459 查看
前言:上一节介绍了Activity的基本使用,那么这一节自然就得稍微讲一下Intent的使用了

一、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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android Activity intent