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>