今天开始学四大组件。今天是学Activity,然后是广播接收者,然后是服务,然后是内容提供者。四大组件,咱们一天一个。Activity就是跟用户交互的界面,大部分的应用都不会只有这么一个界面。创建多个Activity,在不同的页面之间进行跳转并且在不同的页面之间进行数据的传递。
创建一个新的Activity,想办法把它给打开。打开一个Activity就涉及到一个隐式意图和一个显式意图。intent,第二天的时候打电话,电话拨号器就用到了这个东西。
Activity的生命周期。讲Servlet的时候提到过生命周期的概念。说一下Activity的生命周期和它的生命周期方法究竟有什么用。
最后说一下Activity的任务栈。
Activity是四大组件里面最重要的一个组件。所以今天的内容需要全部掌握,都是非常重要的重点。必须全部掌握。
创建一个新的Activity。其实之前写代码的时候Activity实际上都不需要咱们创建。因为咱们默认勾上了帮咱们创建一个空的MainActivity。现在得自己创建一个新的Activity。
package com.itheima.createnewactivity; import android.os.Bundle; import android.app.Activity; import android.view.Menu; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //加载界面 解析xml文件 把xml文件中声明的控件 创建出对应的java对象 setContentView(R.layout.activity_main); //new M } }
package com.itheima.createnewactivity; import android.app.Activity; import android.os.Bundle; public class SecondActivity extends Activity { //重写onCreate()方法 @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.activity_second);//第二个Activity对应的Java类已经写好了. //findViewById(id) //setOnClickListener } }
<RelativeLayout 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:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/hello_world" /> </RelativeLayout>
<RelativeLayout 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:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="20sp" android:textColor="#ff0000" android:text="我是第二个Activity" /> </RelativeLayout>
为什么要重写这个onCreate()方法?onCreate()什么时候执行这个还记得吗?第一天在讲电话拨号器的时候就提过这个。当我的Activity一创建的时候,这个对象创建起来之后系统就会帮助咱们调用onCreate()方法。所以在onCreate()方法中要做的就是跟初始化相关的操作。比如setContentView把界面初始化过来。比如findViewById(id)找到我需要操作的目标。比如说我给按钮设置点击事件,setOnClickListener。这些东西都要放在onCreate()里面。
不在AndroidManifest.xml里面配置一下是无法显示SecondActivity界面的。MainActivity在清单文件里面有一个activity节点。每创建出一个新的Activity如果你想用的话就必须在清单文件里面声明对应的Activity。为什么必须声明?需要注意的是所有的四大组件都不能自己去创建这个对象。
MainActivity也有无参的构造而且是public也可以去调,但是咱不能自己调。所有的四大组件的对象都需要系统帮助咱们创建。系统创建怎么创建?就是通过反射的方式。所以你必须在清单文件里面声明对应的节点。
SecondActivity第二个界面也已经声明完了。
问题出在清单文件里面activity节点的意图过滤器的那段代码。
<intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter>
意图过滤器如果你给它指定了一个action,这个叫MAIN.category有一个东西叫LAUNCHER.LAUNCHER是启动/发射.所以LAUNCHER这个东西是作为了一个启动器。如果你的一个Activity声明了这么一个intent-filter意图过滤器,它里面action是MAIN,category是LAUNCHER,那么这一个Activity就会作为应用的入口并且在桌面上放了一个图标。
为什么SecondActivty也是写MAIN和LAUNCHER,但是启动的是第一个MainActivity.因为MainActivity在前面,你一个应用那肯定只有一个入口。它这个PULL解析是一行一行来的,解析到<activity默认谁在前面谁就是启动器。但是呢桌面上这个图标确实给SecondActivity放了一个。
当前就比较诡异了,当前我这一个应用但是桌面上有两个图标。但是呢点击去的界面还不一样。正常的情况下所有的应用只有这么一个图标。但是有的设备上你即使这么写了它也不会帮你创建两个图标,它会自动地把第二个Activity过滤掉,默认只是第一个Activity起作用。但是只要有的设备可能会出现这个情况,那咱们就不能够这么做。
所以说每一个应用只能有一个Activity下配置这么一个intent-filter,就是action是MAIN,category是LAUNCHER.
应用的名字是application节点的android:label显示的.
<application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name"
如果application节点的android:label和下面的activity节点的android:label标签是一样的那就无话可说了。但是可以给activity节点指定一个特殊的android:label标签.
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.itheima.createnewactivity" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="17" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.itheima.createnewactivity.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="com.itheima.createnewactivity.SecondActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.itheima.createnewactivity" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="17" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.itheima.createnewactivity.MainActivity" android:label="第一个activity" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name="com.itheima.createnewactivity.SecondActivity" android:label="第二个activity" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
你作为启动界面的Activity它里面所配置的android:label,如果你这个没有配置的话它默认会找application.如果你配置了的话一定是用Activity的android:label.application的label是在应用管理器里显示的.
application的label在这里显示。
android:icon="@drawable/ic_launcher"
icon就是给它指定一个图标。如果在activity节点下你声明了android:icon和android:label,那么默认他使用的就是activity下的icon,如果你没声明的话他会去找application节点下的icon和label。
一个应用两个图标看起来是很诡异的。
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.itheima.createnewactivity" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="17" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.itheima.createnewactivity.MainActivity" android:icon="@drawable/header1" android:label="第一个activity" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name="com.itheima.createnewactivity.SecondActivity" android:icon="@drawable/header2" android:label="第二个activity" > <!-- <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> --> </activity> </application> </manifest>
在activity和application节点里面咱们都可以去声明一个icon和一个label,如果它们俩都有默认使用activity里面,application这个最终就会展示到我的应用管理器,在那个位置上会看到application节点下声明的对应的内容。