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

前言上一节介绍了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





  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值