Android四大组件之Activity详解——创建和启动Activity

前面我们已经对Activity有过简单的介绍:

Android开发——初始Activity

Android开发——响应用户事件

Android开发——Activity生命周期

先来看一下最终结果

创建Activity:

接下来打开我们的IDE,创建一个名叫ActivityDemo的Android Application Project

工程默认已经为我们创建了一个Activity,现在我们手动添加一个名叫SecondActivity的类

点击finish完成SecondActivity类的创建。完了我们为这个Activity创建一个布局文件activity_second

点finish完成布局的创建。

下面是activity_second布局的代码

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/txtView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Second Activity"       android:textSize="20sp"/>

</LinearLayout>
下面是SecondActivity的代码:
package com.example.activitydemo;

import android.app.Activity;
import android.os.Bundle;

public class SecondActivity extends Activity
{
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        //绑定activity_second布局到SecondActivity
        setContentView(R.layout.activity_second);
    }
}

Activity和布局activity_second都创建好,最后一步就是要在AndroidManifest文件中注册该Activity

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

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

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.example.activitydemo.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>

        <!-- 注册SecondActivity开始 -->
        <activity
            android:name=".SecondActivity"
            android:label="Second Activity">
            <intent-filter>
                <action android:name="com.example.activitydemo.mysecondactivity"/>
                <category android:name="android.intent.category.DEFAULT"/>
            </intent-filter>
        </activity>
        <!-- 注册SecondActivity结束 -->

    </application>

</manifest>

注册SecondActivity的时候除了action标签要设置外,

<category android:name="android.intent.category.DEFAULT"/> 也是必须的,

否则系统会找不到你的Activity,启动的时候会抛出ActivityNotFoundException异常。

当然你也可以定义自己的category类别,这个后面再说。

准备工作都准备好后,我们就可以启动这个Activity。

下面是Button按钮的事件处理代码:

package com.example.activitydemo;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity extends Activity
{

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //查找我们在布局中创建的按钮
        Button startSecondActivity = (Button)findViewById(R.id.btnStartSecondActivity);

        //为按钮绑定点击事件
        startSecondActivity.setOnClickListener(new View.OnClickListener()
        {

            @Override
            public void onClick(View v)
            {
                //隐式启动SecondActivity
                startActivity(new Intent("com.example.activitydemo.mysecondactivity"));
                //也可以显式启动Activity
                //startActivity(new Intent(getBaseContext(), SecondActivity.class));
            }
        });
    }
}

解决Intent Filter冲突

我们不能启动一个不存在的Activity,否则程序会崩溃。

但是,如果系统中存在多个相同的Activity呢,结果又会怎样?

现在我们尝试一下,定义第三个Activity,名叫ThridActivity。这个Activity的action和SecondActivity的一样

ThirdActivity的Java程序文件不在这里列出。创建过程和SecondActivity一样。

下面是ThirdActivity在AndroidManifest文件中的注册信息:

<!-- 注册ThirdActivity开始 -->
        <activity
            android:name=".ThirdActivity"
            android:label="The Third Activity">
            <intent-filter>
                <action android:name="com.example.activitydemo.mysecondactivity"/>
                <category android:name="android.intent.category.DEFAULT"/>
            </intent-filter>
        </activity>
        <!-- 注册ThirdActivity结束 -->

我们重新运行一下程序,看结果是什么

没错,系统会弹出一个选择框让我们决定打开的是哪一个Activity。

那么,当系统中有多个相同action的Activity存在的时候能不让这个选择框弹出来吗?

答案是有的,这个时候,就要用到category标签。

先来更新一下ThirdActivity在AndroidManifest文件中的注册信息

<!-- 注册ThirdActivity开始 -->
        <activity
            android:name=".ThirdActivity"
            android:label="The Third Activity">
            <intent-filter>
                <action android:name="com.example.activitydemo.mysecondactivity"/>
                <!-- 自定义category -->
                <category android:name="com.example.activitydemo.mycategory"/>
                <category android:name="android.intent.category.DEFAULT"/>
            </intent-filter>
        </activity>
        <!-- 注册ThirdActivity结束 –>

我们自定义了一个category标签,那么这个标签有什么用呢。

接着看,这一次我们是更新那个按钮的响应事件

package com.example.activitydemo;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity extends Activity
{

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //查找我们在布局中创建的按钮
        Button startSecondActivity = (Button)findViewById(R.id.btnStartSecondActivity);

        //为按钮绑定点击事件
        startSecondActivity.setOnClickListener(new View.OnClickListener()
        {

            @Override
            public void onClick(View v)
            {
                Intent intent = new Intent("com.example.activitydemo.mysecondactivity");
                intent.addCategory("com.example.activitydemo.mycategory");
                startActivity(intent);
            }
        });
    }
}

我们这里使用了Intent的addCategory方法,这个方法可以让我们明确打开的是哪一个category下的Activity。

这样,我们就可以直接打开ThirdActivity

优化程序的用户体验

前面已经说过,启动不存在的Activity的时候,程序会崩溃,这是很不好的用户体验。

启动Activity之前先验证一下是否存在这个Activity非常必要。

具体方法:使用PackageManager的queryIntentActivities方法

//为按钮绑定点击事件
        startSecondActivity.setOnClickListener(new View.OnClickListener()
        {

            @Override
            public void onClick(View v)
            {
                //启动一个不存在的Activity
                Intent intent = new Intent("com.example.activitydemo.NoSuchActivity");
                intent.addCategory("com.example.activitydemo.mycategory");

                //创建PackageManager类
                PackageManager packageManager = getPackageManager();

                //获取包含能处理给定intent的activity列表
                List<ResolveInfo> activities = packageManager.queryIntentActivities(intent, 0);

                if(activities.size() > 0)
                    startActivity(intent);
                else
                    Toast.makeText(getBaseContext(), "Activity not found", Toast.LENGTH_SHORT).show();
            }
        });

现在,启动一个不存在的Activity试一下

创建应用程序选择器(App Chooser)

应用程序选择器的作用是允许我们可以每次都选择以哪一个程序处理数据。

那么跟上面所说的Activity选择框有什么不一样呢。

Activity选择框更多的是一种程序的替代,如浏览器,信息发送程序,图片浏览器等。

而App Chooser更适用于社交型的程序,如信息分享。

借用一下官方的图片,先看看App Chooser的真面目

创建App Chooser

//为按钮绑定点击事件
        startSecondActivity.setOnClickListener(new View.OnClickListener()
        {

            @Override
            public void onClick(View v)
            {

                //startActivity(new Intent("com.example.activitydemo.mysecondactivity"));

                Intent intent = new Intent("com.example.activitydemo.mysecondactivity");
                //intent.addCategory("com.example.activitydemo.mycategory");

                //创建App Chooser
                Intent chooser = Intent.createChooser(intent, "将信息分享到");

                //创建PackageManager类
                PackageManager packageManager = getPackageManager();

                //获取包含能处理给定intent的activity列表
                List<ResolveInfo> activities = packageManager.queryIntentActivities(intent, 0);

                if(activities.size() > 0)
                    startActivity(chooser); //通过chooser启动Activity
                else
                    Toast.makeText(getBaseContext(), "Activity not found", Toast.LENGTH_SHORT).show();
            }
        });

运行结果:

时间: 2024-12-12 00:52:27

Android四大组件之Activity详解——创建和启动Activity的相关文章

Android 四大组件之Service详解

                   Android四大组件之Service详解    来这实习已经10多天了,今天整理整理学习时的Android笔记.正所谓好记性不如烂笔头,今天来说说service组件. service可以在和多场合的应用中使用,比如播放多媒体的时候用户启动了其他Activity这个时候程序要在后台继续播放,比如检测SD卡上文件的变化,再或者在后台记录你地理信息位置的改变等等,总之服务嘛,总是藏在后头的. Service是在一段不定的时间运行在后台,不和用户交互应用组件.每个

Android四大组件-Service并非详解

距离上篇文章竟然快一年了.这次是想明确service一些比较重要的点. 至于什么是service,我也不想多去讨论,我只想清晰确认这么几个问题: 1.service的生命周期到底如何? 2.Activity如何让service做事? 3.service与thread之间有没有关系? 4.远程service是什么东西? 5.AIDL的使用? 6.前台service? 一.生命周期 如果需要图,可以百度,好多.我这里直接运行代码打log. 1.startService()启动Service 操作顺序

Android四大视图动画图文详解

Android中的动画分为视图动画(View Animation).属性动画(Property Animation)以及Drawable动画. Android从最初的版本就支持视图动画,视图动画顾名思义,就是应用在视图View上的动画.视图动画的核心类是android/view/animation/Animation,该类是一个抽象类,该类有五个子类,分别是AlphaAnimation.TranslateAnimation.RotateAnimation.ScaleAnimation.Anima

android四大组件--ContentProvider详解

一.相关ContentProvider概念解析: 1.ContentProvider简介 在Android官方指出的Android的数据存储方式总共有五种,分别是:Shared Preferences.网络存储.文件存储.外储存储.SQLite.但是我们知道一般这些存储都只是在单独的一个应用程序之中达到一个数据的共享,有时候我们需要操作其他应用程序的一些数据,例如我们需要操作系统里的媒体库.通讯录等,这时我们就可能通过ContentProvider来满足我们的需求了. 2.为什么要选择Conte

Android四大组件--Activity详解

Android四大组件--Activity详解 分类: android android应用android开发 本文的主要内容包括1.activity的建立.配置和使用:2.activity的跳转和传值:3.startActivityForResult:4.activity的生命周期. 1.activity的建立.配置和使用 Activity是一个应用中的组件,它为用户提供一个可视的界面,方便用户操作,比如说拔打电话.照相.发邮件或者是浏览地图等.每个activity会提供一个可视的窗口,一般情况

Android开发四大组件--Activity详解

Android开发四大组件--Activity详解 - Android开发教程 Android开发的四大组件在开发中应用中是必不可少的,下面就来详解下四大组件之一Activity,总结自网络.Activty的生命周期的也就是它所在进程的生命周期. 一个Activity的启动顺序: onCreate()——>onStart()——>onResume() 当另一个Activity启动时: 第一个Activity onPause()——>第二个Activity onCreate()——>

Android四大组件之Activity详解 &middot; yclog

Activity生命周期: onCreate:在Acitivty第一次创建时调用,用于做初始化的工作onStart:onCreate调用后调用,此次界面对用户来说无法看见onResume:此次界面可见并显示到前台,且当前Acitvity位于当前栈顶,并且处于运行状态onPause:表示当前Activity正在停止,常做一些存储数据.停止动画等工作(不做耗时操作)onStop:表示当前Activity即将停止,一般做微量级的回收工作onDestory:表示当前Activity即将被销毁,可做一些回

Android四大组件之——Activity的开启:StartActivity()和StartActivityForResult()(图文详解)

            如需转载请在文章开头处注明本博客网址:http://www.cnblogs.com/JohnTsai       联系方式:[email protected]       [Android四大组件学习系列Activity篇]        1.Android四大组件之——Activity(一)定义.状态和后退栈(图文详解) 2.Android四大组件之——Activity的生命周期(图文详解) 3.Android四大组件之——Activity的开启StartActivit

Android 四大组件 详解

[置顶] Android四大组件详解 分类: Android四大组件2013-02-09 16:23 19411人阅读 评论(13) 收藏 举报 Android开发 注:本文主要来自网易的一个博主的文章,经过阅读,总结,故留下文章在此 Android四大基本组件介绍与生命周期 Android四大基本组件分别是Activity,Service服务,Content Provider内容提供者,BroadcastReceiver广播接收器. 一:了解四大基本组件 Activity : 应用程序中,一个