Android学习笔记入门 : 05 Intent

1 Intent概述

4大基本组件见过了,Intent通常用来启动目标组件.

IntentFilter : 用来描述基本组件所在的地址.

文档地址: 

http://developer.android.com/guide/components/intents-filters.html


2 Intent通过组件名称来启动组件

Intent i = new Intent();
// 设置组件. 参数是包名和类名,注意类名一定要写完整
i.setComponent(new ComponentName("cn.zyh.l008intents",
"cn.zyh.l008intents.Aty01"));
startActivity(i);

 一样可以如Intent(Context,Class)那样启动Activity (显式启动)


 3 Intent通过Action来启动组件

 Action 用来指定启动的目标,Action地址写在AndroidManifest.xml中.

还记得MainActivity是如何启动的吗? 它就使用了Intent-filter和Action

<activity
            android:name="cn.zyh.l008intents.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>

android.intent.action.MAIN就是组件的Action名称.


我们还可以为刚建立的类设置一个Action

一般格式是 包名+intent.action+action名称

        <activity android:name="Aty01">
            <intent-filter>
                <action android:name="cn.zyh.l008intent.intent.action.aty01"/>
                <category android:name="android.intent.category.DEFAULT"/>
            </intent-filter>
        </activity>


隐式启动应用

Intent i = new Intent("cn.zyh.l008intent.intent.action.aty01");
startActivity(i);


4 使用系统自带的隐式Intent打开Activity

都是使用android.Intent.ACTION_VIEW

 

/*//打开一张图片  
File f = new File("/mnt/sdcard/1.jpg");
Intent i = new Intent(Intent.ACTION_VIEW);
i.setDataAndType(Uri.fromFile(f), "image/*");
startActivity(i);
*/


/*
// 打电话
Intent i = new Intent(Intent.ACTION_VIEW);
i.setData(Uri.parse("tel:10086"));
startActivity(i);
*/


// 打开网页
Intent i = new Intent(Intent.ACTION_VIEW, Uri
.parse("http://www.baidu.com"));
startActivity(i);


由于使用的是系统内设的界面,所以不必担心权限问题


如果多个Activity使用同一个Action,则会出现用用户选择的界面.


觉得有些东西还可以丰富下,有点困了,记在这 明天补.


我读了下API文档中的东西,做点笔记,也算实现昨天的要补的话

1 intent 的三大基本功能: 

1 启动Activity : startActivity   startActivityForResult  

2 启动Service :  startService  bindService

3 发送广播     : sendBroadCast

2 intent的两种类型"

1 显示intent : 已知要启动的组件的全名

直接启动组件

2 隐式intent:  已知要启动组件的Action

去manifest文件中查找

3 构建intent

1 组件名 component name

显示意图必须的,可以用setComponent() setClass() setClassName() 或者使用构造函数来设置

2 Action

3 Data 

其实就是URI,setData() 

设置MMI ,setType()

还可以使用 setDataAndType()

4Category

规定可以启动该Intent的

5 Extra  通过intent传递消息 putExtra()


intent到底发给哪个activity,需要进行三个匹配,一个是action,一个是category,一个是data。

理论上来说,如果intent不指定category,那么无论intent filter的内容是什么都应该是匹配的。但是,如果是implicit intent,Android默认给加上一个CATEGORY_DEFAULT,这样的话如果intent filter中没有android.intent.category.DEFAULT这个category的话,匹配测试就会失败。所以,如果你的 activity支持接收implicit intent的话就一定要在intent filter中加入android.intent.category.DEFAULT。

例外情况是:android.intent.category.MAIN和android.intent.category.LAUNCHER的filter中没有必要加入android.intent.category.DEFAULT,当然加入也没有问题。

我们定义的activity如果接受implicit intent的话,intent filer就一定要加上 android.intent.category.DEFAULT这个category。

 



==============================

MainActivity

package cn.zyh.l008intents;

import java.io.File;

import android.net.Uri;
import android.os.Bundle;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.view.Menu;
import android.view.View;
import android.widget.Button;

public class MainActivity extends Activity
{
	Button startAct01Btn;
	Button startAct02Btn;

	@Override
	protected void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		startAct01Btn = (Button) findViewById(R.id.startAty01);
		startAct01Btn.setOnClickListener(new View.OnClickListener()
		{
			@Override
			public void onClick(View v)
			{
				// Intent i = new Intent();
				// 设置组件. 参数是包名和类名,注意类名一定要写完整
				// i.setComponent(new ComponentName("cn.zyh.l008intents",
				// "cn.zyh.l008intents.Aty01"));

				Intent i = new Intent("cn.zyh.l008intent.intent.action.aty01");
				startActivity(i);
			}
		});

		startAct02Btn = (Button) findViewById(R.id.startAty02);
		startAct02Btn.setOnClickListener(new View.OnClickListener()
		{
			@Override
			public void onClick(View v)
			{
				/*//打开一张图片
				File f = new File("/mnt/sdcard/1.jpg");
				Intent i = new Intent(Intent.ACTION_VIEW);
				i.setDataAndType(Uri.fromFile(f), "image/*");
				startActivity(i);
				*/

				/*
				// 打电话
				Intent i = new Intent(Intent.ACTION_VIEW);
				i.setData(Uri.parse("tel:10086"));
				startActivity(i);
				*/

				// 打开网页
				Intent i = new Intent(Intent.ACTION_VIEW, Uri
						.parse("http://www.baidu.com"));
				startActivity(i);

			}
		});
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu)
	{
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

}

Act01代码略.因为只是被调用 没什么操作 


Manifest

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="cn.zyh.l008intents"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="18" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="cn.zyh.l008intents.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="Aty01">
            <intent-filter>
                <action android:name="cn.zyh.l008intent.intent.action.aty01"/>
                <category android:name="android.intent.category.DEFAULT"/>
             
            </intent-filter>
        </activity>
    </application>

</manifest>










  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值