8.1.什么是Activity

  • 安卓四大组件之一, 用来显示界面, 一个Activity就是应用中一个界面

8.2. 创建

  • 定义类继承Activity
  • 在AndroidManifest.xml的<application>节点中声明<activity>
  • 清单文件说明
<?xml version="1.0" encoding="utf-8"?>//xml文件声明
<manifest xmlns:android="http://schemas.android.com/apk/res/android"//命名空间
    package="net.dxs.activity"//应用程序的包名,一个Android系统不可以同时安装两个及以上的同包名程序
    android:versionCode="1"//版本号
    android:versionName="1.0" >//版本名

    <uses-sdk
        android:minSdkVersion="8"//最低兼容版本
        android:targetSdkVersion="17" />//目标版本

    <uses-permission android:name="android.permission.CALL_PHONE" />//申请一个拨打电话的权限

    <application
       android:allowBackup="true"
       android:icon="@drawable/ic_launcher"//应用的图标
       android:label="@string/app_name"//应用的名称,系统设置卸载界面看到的应用名称
       android:theme="@style/AppTheme" >//应用要使用的主题
       <activity//一个界面
           android:name="net.dxs.activity.MainActivity"
           android:label="12.Main" >//当前界面的名称
           <intent-filter>//意图过滤器
               <action android:name="android.intent.action.MAIN" />//设置一个动作,启动程序

               <category android:name="android.intent.category.LAUNCHER" />//在桌面生成一个图标
           </intent-filter>
       </activity>

    //可以配置多个启动,在桌面生成多个启动图标
       <activity
           android:name="net.dxs.activity.OtherActivity"
           android:label="12.Other" >
           <intent-filter>
               <action android:name="android.intent.action.MAIN" />

               <category android:name="android.intent.category.LAUNCHER" />
           </intent-filter>
       </activity>
    </application>
</manifest>

8.3. 启动

创建Intent对象, Intent指定要启动哪个Activity, startActivity()

8.3.1 显式意图:

  • 指定类名, 通常用作应用程序内部跳转
  • 通过构造函数, 或者setClass(), setClassName()方法可以指定类名
  • startActivity()启动一个Activity
  • 如果启动其他应用程序中的Activity, 该Activity的export属性必须为true
    eg. 显示启动
public void explicit(View v) {
    Intent intent = new Intent();// 创建意图
    // Intent intent = new Intent(this, OtherActivity.class);// 创建意图
    // intent.setClass(this, OtherActivity.class);// 指定类
    // intent.setClassName(this, "net.dxs.activity.OtherActivity");
    intent.setClassName("com.android.mms", "com.android.mms.ui.ConversationList");//启动其他应用时(系统短信), Activity的export属性为true才能用
    // intent.setClassName("com.android.camera", "com.android.camera.Camera");// 启动其他应用时(系统照相机), Activity的export属性为true才能用
    startActivity(intent);// 启动Activity
}

8.3.2 隐式意图:

  • 不指定类名, 通常用在应用程序之间跳转
  • 通过Intent.setAction()和Intent.setData()来设置意图的动作和数据
  • Activity中的<intent-filter>如果能匹配上动作和数据就可以启动
    eg.隐式启动
/**
 * 隐式启动
 * 
 * @param v
 */
public void implicit(View v) {
    Intent intent = new Intent();

    //打电话
    intent.setAction(Intent.ACTION_CALL); // 设置动作
    intent.setData(Uri.parse("tel://15010990415")); // 设置数据

    //网址
    intent.setAction(Intent.ACTION_VIEW);//注意启动浏览器打开网址没有配置访问网络权限
    intent.setData(Uri.parse("http://www.baidu.com"));

    //图片
    intent.setAction(Intent.ACTION_VIEW);
    intent.setDataAndType(Uri.parse("file:///mnt/sdcard/a.jpg"), "image/*");//前两个//是协议,后一个/是跟目录

    //音频
    intent.setAction(Intent.ACTION_VIEW);
    intent.setDataAndType(Uri.parse("file:///mnt/sdcard/1.mp3"), "audio/*");

    intent.setAction(Intent.ACTION_VIEW);
    intent.setDataAndType(Uri.parse("file:///mnt/sdcard/1.mp4"), "video/*");

    startActivity(intent); // 根据意图中的动作和数据来匹配一个Activity
}

附加:android用于打开各种文件的intent工具类

//android用于打开各种文件的intent【原创】

import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.net.Uri.Builder;
import java.io.File;
import android.content.Intent;

//自定义android Intent类,
//可用于获取打开以下文件的intent
//PDF,PPT,WORD,EXCEL,CHM,HTML,TEXT,AUDIO,VIDEO

示例:
//这个不行,可能是因为PDF.apk程序没有权限访问其它APK里的asset资源文件,又或者是路径写错?
//Intent it = getPdfFileIntent("file:///android_asset/helphelp.pdf");
//下面这些都OK
//Intent it = getHtmlFileIntent("/mnt/sdcard/tutorial.html");//SD卡主目录
//Intent it = getHtmlFileIntent("/sdcard/tutorial.html");//SD卡主目录,这样也可以
Intent it = getHtmlFileIntent("/system/etc/tutorial.html");//系统内部的etc目录
//Intent it = getPdfFileIntent("/system/etc/helphelp.pdf");
//Intent it = getWordFileIntent("/system/etc/help.doc");
//Intent it = getExcelFileIntent("/mnt/sdcard/Book1.xls")
//Intent it = getPptFileIntent("/mnt/sdcard/download/Android_PPT.ppt");//SD卡的download目录下
//Intent it = getVideoFileIntent("/mnt/sdcard/ice.avi");
//Intent it = getAudioFileIntent("/mnt/sdcard/ren.mp3");
//Intent it = getImageFileIntent("/mnt/sdcard/images/001041580.jpg");
//Intent it = getTextFileIntent("/mnt/sdcard/hello.txt",false);

startActivity( it );

public class MyIntent
{

//android获取一个用于打开HTML文件的intent
  public static Intent getHtmlFileIntent( String param )
  {
    Uri uri = Uri.parse(param ).buildUpon().encodedAuthority("com.android.htmlfileprovider").scheme("content").encodedPath(param ).build();
    Intent intent = new Intent("android.intent.action.VIEW");
    intent.setDataAndType(uri, "text/html");
    return intent;
  }

//android获取一个用于打开图片文件的intent
  public static Intent getImageFileIntent( String param )
  {
    Intent intent = new Intent("android.intent.action.VIEW");
    intent.addCategory("android.intent.category.DEFAULT");
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    Uri uri = Uri.fromFile(new File(param ));
    intent.setDataAndType(uri, "image/*");
    return intent;
  }

  //android获取一个用于打开PDF文件的intent
  public static Intent getPdfFileIntent( String param )
  {
    Intent intent = new Intent("android.intent.action.VIEW");
    intent.addCategory("android.intent.category.DEFAULT");
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    Uri uri = Uri.fromFile(new File(param ));
    intent.setDataAndType(uri, "application/pdf");
    return intent;
  }

//android获取一个用于打开文本文件的intent
 public static Intent getTextFileIntent( String param, boolean paramBoolean)
{
 Intent intent = new Intent("android.intent.action.VIEW");
 intent.addCategory("android.intent.category.DEFAULT");
 intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
 if (paramBoolean)
 {
Uri uri1 = Uri.parse(param );
intent.setDataAndType(uri1, "text/plain");
 }
 else
 {
Uri uri2 = Uri.fromFile(new File(param ));
intent.setDataAndType(uri2, "text/plain");
 }

 return intent;
}

//android获取一个用于打开音频文件的intent
  public static Intent getAudioFileIntent( String param )
  {
    Intent intent = new Intent("android.intent.action.VIEW");
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    intent.putExtra("oneshot", 0);
    intent.putExtra("configchange", 0);
    Uri uri = Uri.fromFile(new File(param ));
    intent.setDataAndType(uri, "audio/*");
    return intent;
  }

  //android获取一个用于打开视频文件的intent
  public static Intent getVideoFileIntent( String param )
  {
    Intent intent = new Intent("android.intent.action.VIEW");
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    intent.putExtra("oneshot", 0);
    intent.putExtra("configchange", 0);
    Uri uri = Uri.fromFile(new File(param ));
    intent.setDataAndType(uri, "video/*");
    return intent;
  }

  //android获取一个用于打开CHM文件的intent
  public static Intent getChmFileIntent( String param )
  {
    Intent intent = new Intent("android.intent.action.VIEW");
    intent.addCategory("android.intent.category.DEFAULT");
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    Uri uri = Uri.fromFile(new File(param ));
    intent.setDataAndType(uri, "application/x-chm");
    return intent;
  }

//android获取一个用于打开Word文件的intent
  public static Intent getWordFileIntent( String param )
  {
    Intent intent = new Intent("android.intent.action.VIEW");
    intent.addCategory("android.intent.category.DEFAULT");
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    Uri uri = Uri.fromFile(new File(param ));
    intent.setDataAndType(uri, "application/msword");
    return intent;
  }

//android获取一个用于打开Excel文件的intent
  public static Intent getExcelFileIntent( String param )
  {
    Intent intent = new Intent("android.intent.action.VIEW");
    intent.addCategory("android.intent.category.DEFAULT");
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    Uri uri = Uri.fromFile(new File(param ));
    intent.setDataAndType(uri, "application/vnd.ms-excel");
    return intent;
  }

//android获取一个用于打开PPT文件的intent
  public static Intent getPptFileIntent( String param )
  {
    Intent intent = new Intent("android.intent.action.VIEW");
    intent.addCategory("android.intent.category.DEFAULT");
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    Uri uri = Uri.fromFile(new File(param ));
    intent.setDataAndType(uri, "application/vnd.ms-powerpoint");
    return intent;
  }
}

注意:
一定要在Manifest.xml中声明权限:
    <!-- 在SDCard中创建与删除文件权限 -->
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
    <!-- 往SDCard写入数据权限 -->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

8.3.3 创建一个工具程序供第三方隐式意图调用的清单配置

<activity
   android:name="net.dxs.activity.OtherActivity"
    android:label="12.Other" >
    <intent-filter>//配置上网过滤器
        <action android:name="android.intent.action.VIEW" />//动作

        <data android:scheme="http" />//协议

        <category android:name="android.intent.category.DEFAULT" />//必须指定类型
    </intent-filter>
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />

        <data
            android:mimeType="image/*"
            android:scheme="file" />

        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />

        <data
            android:mimeType="audio/*"
            android:scheme="file" />
        <data
            android:mimeType="audio/*"
            android:scheme="http" />

        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>

获取第三方传递过来的数据

String action = getIntent().getAction();        
Uri data = getIntent().getData();               
String type = getIntent().getType();

Intent intent = getIntent();// 获取Intent
// 从Intent中获取数据
String name = intent.getStringExtra("name");
int age = intent.getIntExtra("age", -1);

示例源码->百度网盘