今天開始學四大組件。今天是學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節點下聲明的對應的內容。