1. 程式人生 > >Android四大元件之 Activity(上)

Android四大元件之 Activity(上)

(一)概述
本節開始講解Android的四大元件之一的Activity(活動);
官方文件:
Activity是一個應用程式的元件,他在螢幕上提供了一個區域,允許使用者在上面做一些互動性的操作, 比如打電話,照相,傳送郵件,或者顯示一個地圖!Activity可以理解成一個繪製使用者介面的視窗, 而這個視窗可以填滿整個螢幕,也可能比螢幕小或者浮動在其他視窗的上方!

從上面這段話,我們可以得到以下資訊:

1. Activity用於顯示使用者介面,使用者通過Activity互動完成相關操作
2. 一個App允許有多個Activity

(二)Activity
1.Activity的概念與Activity的生命週期圖:
這裡寫圖片描述

注意事項:

1. onPause()和onStop()被呼叫的前提是: 打開了一個新的Activity!而前者是舊Activity還可見的狀態;後者是舊Activity已經不可見!   

2. 另外,親測:AlertDialog和PopWindow是不會觸發上述兩個回撥方法的~

2.Activity/ActionBarActivity/AppCompatActivity的區別:

在開始講解建立Activity之前要說下這三個的一個區別:

Activity就不用說啦,後面這兩個都是為了低版本相容而提出的提出來的,他們都在v7包下, ActionBarActivity已被廢棄,從名字就知道,ActionBar~,而在5.0後,被Google棄用了,現在用 ToolBar…而我們現在在Android Studio建立一個Activity預設繼承的會是:AppCompatActivity! 當然你也可以只寫Activity,不過AppCompatActivity給我們提供了一些新的東西而已! 兩個選一個;

3.Activity的建立流程
——————–Activity的建立流程——————————
這裡寫圖片描述

好了,上面也說過,可以繼承Activity和AppCompatActivity,只不過後者提供了一些新的東西而已! 另外,切記,Android中的四大元件,只要你定義了,無論你用沒用,都要在AndroidManifest.xml對 這個元件進行宣告,不然執行時程式會直接退出,報ClassNotFindException…

4.onCreate()一個引數和兩個引數的區別:

相信用as的朋友在重寫Act的onCreate()方法時會發現,這玩意有兩個引數:

這裡寫圖片描述

可是正常的才只有一個引數啊:

這裡寫圖片描述

恩呢,這就是5.0給我們提供的新的方法,要用它,先要在配置檔案中為我們的Activity設定一個屬性:

android:persistableMode="persistAcrossReboots"

然後我們的Activity就擁有了持久化的能力了,一般我們會搭配另外兩個方法來使用:

public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState)
public void onRestoreInstanceState(Bundle savedInstanceState, PersistableBundle persistentState)

相信有些朋友對這兩個方法名不陌生吧,前一個方法會在下述情形中被呼叫:

    點選home鍵回到主頁或長按後選擇執行其他程式 

    按下電源鍵關閉螢幕 

    啟動新的Activity 

    橫豎屏切換時,肯定會執行,因為橫豎屏切換的時候會先銷燬Act,然後再重新建立 重要原則:當系統"未經你許可"時銷燬了你的activity,則onSaveInstanceState會被系統呼叫, 這是系統的責任,因為它必須要提供一個機會讓你儲存你的資料(你可以儲存也可以不儲存)。

而後一個方法,和onCreate同樣可以從取出前者儲存的資料: 一般是在onStart()和onResume()之間執行! 之所以有兩個可以獲取到儲存資料的方法,是為了避免Act跳轉而沒有關閉, 然後不走onCreate()方法,而你又想取出儲存資料~

說回來: 說回這個Activity擁有了持久化的能力,增加的這個PersistableBundle引數令這些方法 擁有了系統關機後重啟的資料恢復能力!!而且不影響我們其他的序列化操作,臥槽, 具體怎麼實現的,暫時還不瞭解,可能是另外弄了個檔案儲存吧~!後面知道原理的話會告知下大家! 另外,API版本需要>=21,就是要5.0以上的版本才有效~

4.啟動一個Activity的幾種方式

在Android中我們可以通過下面兩種方式來啟動一個新的Activity,注意這裡是怎麼啟動,而非 啟動模式!!分為顯示啟動和隱式啟動!
  1. 顯式啟動:通過包名來啟動,寫法如下:
    ①最常見的:
startActivity(new Intent(當前Act.this,要啟動的Act.class));

②通過Intent的ComponentName:

ComponentName cn = new ComponentName("當前Act的全限定類名","啟動Act的全限定類名") ;
Intent intent = new Intent() ;
intent.setComponent(cn) ;
startActivity(intent) ;

③初始化Intent時指定包名:

Intent intent = new Intent("android.intent.action.MAIN");
intent.setClassName("當前Act的全限定類名","啟動Act的全限定類名");
startActivity(intent);

2.隱式啟動:通過Intent-filter的Action,Category或data來實現 這個是通過Intent的 intent-filter**來實現的,這個Intent那章會詳細講解! 這裡知道個大概就可以了!
這裡寫圖片描述

  1. 另外還有一個直接通過包名啟動apk的:
Intent intent = getPackageManager().getLaunchIntentForPackage
("apk第一個啟動的Activity的全限定類名") ;
if(intent != null) startActivity(intent) ;

5.橫豎屏切換與狀態儲存的問題
前面也也說到了App橫豎屏切換的時候會銷燬當前的Activity然後重新建立一個,你可以自行在生命週期 的每個方法裡都新增列印Log的語句,來進行判斷,又或者設一個按鈕一個TextView點選按鈕後,修改TextView 文字,然後橫豎屏切換,會神奇的發現TextView文字變回之前的內容了! 橫豎屏切換時Act走下述生命週期:
onPause-> onStop-> onDestory-> onCreate->onStart->onResume
關於橫豎屏切換可能遇到下述問題:

1.先說下如何禁止螢幕橫豎屏自動切換吧,很簡單,在AndroidManifest.xml中為Act新增一個屬性: android:screenOrientation, 有下述可選值:

unspecified:預設值 由系統來判斷顯示方向.判定的策略是和裝置相關的,所以不同的裝置會有不同的顯示方向。

landscape:橫屏顯示(寬比高要長)  

portrait:豎屏顯示(高比寬要長)  

user:使用者當前首選的方向  

behind:和該Activity下面的那個Activity的方向一致(在 Activity堆疊中的)  

sensor:有物理的感應器來決定。如果使用者旋轉裝置這螢幕會橫豎屏切換。  

nosensor:忽略物理感應器,這樣就不會隨著使用者旋轉裝置而更改了("unspecified"設定除外)。  

2.橫豎屏時想載入不同的佈局:

1)準備兩套不同的佈局,Android會自己根據橫豎屏載入不同佈局: 建立兩個佈局資料夾:layout-land橫屏,layout-port豎屏 然後把這兩套佈局檔案丟這兩資料夾裡,檔名一樣,Android就會自行判斷,然後載入相應佈局了!

2 )自己在程式碼中進行判斷,自己想載入什麼就載入什麼:

我們一般是在onCreate()方法中載入佈局檔案的,我們可以在這裡對橫豎屏的狀態做下判斷,關鍵程式碼如下:

if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE){  
     setContentView(R.layout.橫屏);
}  

else if (this.getResources().getConfiguration().orientation ==Configuration.ORIENTATION_PORTRAIT) {  
    setContentView(R.layout.豎屏);
}
  1. 如何讓模擬器橫豎屏切換

如果你的模擬器是GM的話。直接按模擬器上的切換按鈕即可,原生模擬器可按ctrl + f11/f12切換!

  1. 狀態儲存問題:

這個上面也說過了,通過一個Bundle savedInstanceState引數即可完成! 三個核心方法:

onCreate(Bundle savedInstanceState);
onSaveInstanceState(Bundle outState);
onRestoreInstanceState(Bundle savedInstanceState);

你只重寫onSaveInstanceState()方法,往這個bundle中寫入資料,比如:

outState.putInt("num",1);

這樣,然後你在onCreate或者onRestoreInstanceState中就可以拿出裡面儲存的資料,不過拿之前要判斷下是否為null哦!

savedInstanceState.getInt("num");

然後想怎麼玩就怎麼玩~

6.系統給我們提供的常見的Activity

好的,最後給大家附上一些系統給我們提供的一些常見的Activtiy吧!

//1.撥打電話
// 給移動客服10086撥打電話
Uri uri = Uri.parse("tel:10086");
Intent intent = new Intent(Intent.ACTION_DIAL, uri);
startActivity(intent);

//2.傳送簡訊
// 給10086傳送內容為“Hello”的簡訊
Uri uri = Uri.parse("smsto:10086");
Intent intent = new Intent(Intent.ACTION_SENDTO, uri);
intent.putExtra("sms_body", "Hello");
startActivity(intent);

//3.傳送彩信(相當於傳送帶附件的簡訊)
Intent intent = new Intent(Intent.ACTION_SEND);
intent.putExtra("sms_body", "Hello");
Uri uri = Uri.parse("content://media/external/images/media/23");
intent.putExtra(Intent.EXTRA_STREAM, uri);
intent.setType("image/png");
startActivity(intent);

//4.開啟瀏覽器:
// 開啟Google主頁
Uri uri = Uri.parse("http://www.baidu.com");
Intent intent  = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);

//5.傳送電子郵件:(閹割了Google服務的沒戲!!!!)
// 給[email protected].com發郵件
Uri uri = Uri.parse("mailto:[email protected]");
Intent intent = new Intent(Intent.ACTION_SENDTO, uri);
startActivity(intent);
// 給[email protected].com發郵件傳送內容為“Hello”的郵件
Intent intent = new Intent(Intent.ACTION_SEND);
intent.putExtra(Intent.EXTRA_EMAIL, "[email protected]");
intent.putExtra(Intent.EXTRA_SUBJECT, "Subject");
intent.putExtra(Intent.EXTRA_TEXT, "Hello");
intent.setType("text/plain");
startActivity(intent);
// 給多人發郵件
Intent intent=new Intent(Intent.ACTION_SEND);
String[] tos = {"[email protected]", "[email protected]"}; // 收件人
String[] ccs = {"[email protected]", "[email protected]"}; // 抄送
String[] bccs = {"[email protected]", "[email protected]"}; // 密送
intent.putExtra(Intent.EXTRA_EMAIL, tos);
intent.putExtra(Intent.EXTRA_CC, ccs);
intent.putExtra(Intent.EXTRA_BCC, bccs);
intent.putExtra(Intent.EXTRA_SUBJECT, "Subject");
intent.putExtra(Intent.EXTRA_TEXT, "Hello");
intent.setType("message/rfc822");
startActivity(intent);

//6.顯示地圖:
// 開啟Google地圖中國北京位置(北緯39.9,東經116.3)
Uri uri = Uri.parse("geo:39.9,116.3");
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);

//7.路徑規劃
// 路徑規劃:從北京某地(北緯39.9,東經116.3)到上海某地(北緯31.2,東經121.4)
Uri uri = Uri.parse("http://maps.google.com/maps?f=d&saddr=39.9 116.3&daddr=31.2 121.4");
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);

//8.多媒體播放:
Intent intent = new Intent(Intent.ACTION_VIEW);
Uri uri = Uri.parse("file:///sdcard/foo.mp3");
intent.setDataAndType(uri, "audio/mp3");
startActivity(intent);

//獲取SD卡下所有音訊檔案,然後播放第一首=-= 
Uri uri = Uri.withAppendedPath(MediaStore.Audio.Media.INTERNAL_CONTENT_URI, "1");
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);

//9.開啟攝像頭拍照:
// 開啟拍照程式
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
startActivityForResult(intent, 0);
// 取出照片資料
Bundle extras = intent.getExtras(); 
Bitmap bitmap = (Bitmap) extras.get("data");

//另一種:
//呼叫系統相機應用程式,並存儲拍下來的照片
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
time = Calendar.getInstance().getTimeInMillis();
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(Environment
.getExternalStorageDirectory().getAbsolutePath()+"/tucue", time + ".jpg")));
startActivityForResult(intent, ACTIVITY_GET_CAMERA_IMAGE);

//10.獲取並剪下圖片
// 獲取並剪下圖片
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("image/*");
intent.putExtra("crop", "true"); // 開啟剪下
intent.putExtra("aspectX", 1); // 剪下的寬高比為1:2
intent.putExtra("aspectY", 2);
intent.putExtra("outputX", 20); // 儲存圖片的寬和高
intent.putExtra("outputY", 40); 
intent.putExtra("output", Uri.fromFile(new File("/mnt/sdcard/temp"))); // 儲存路徑
intent.putExtra("outputFormat", "JPEG");// 返回格式
startActivityForResult(intent, 0);
// 剪下特定圖片
Intent intent = new Intent("com.android.camera.action.CROP"); 
intent.setClassName("com.android.camera", "com.android.camera.CropImage"); 
intent.setData(Uri.fromFile(new File("/mnt/sdcard/temp"))); 
intent.putExtra("outputX", 1); // 剪下的寬高比為1:2
intent.putExtra("outputY", 2);
intent.putExtra("aspectX", 20); // 儲存圖片的寬和高
intent.putExtra("aspectY", 40);
intent.putExtra("scale", true);
intent.putExtra("noFaceDetection", true); 
intent.putExtra("output", Uri.parse("file:///mnt/sdcard/temp")); 
startActivityForResult(intent, 0);

//11.開啟Google Market 
// 開啟Google Market直接進入該程式的詳細頁面
Uri uri = Uri.parse("market://details?id=" + "com.demo.app");
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);

//12.進入手機設定介面:
// 進入無線網路設定介面(其它可以舉一反三)  
Intent intent = new Intent(android.provider.Settings.ACTION_WIRELESS_SETTINGS);  
startActivityForResult(intent, 0);

//13.安裝apk:
Uri installUri = Uri.fromParts("package", "xxx", null);   
returnIt = new Intent(Intent.ACTION_PACKAGE_ADDED, installUri);

//14.解除安裝apk:
Uri uri = Uri.fromParts("package", strPackageName, null);      
Intent it = new Intent(Intent.ACTION_DELETE, uri);      
startActivity(it); 

//15.傳送附件:
Intent it = new Intent(Intent.ACTION_SEND);      
it.putExtra(Intent.EXTRA_SUBJECT, "The email subject text");      
it.putExtra(Intent.EXTRA_STREAM, "file:///sdcard/eoe.mp3");      
sendIntent.setType("audio/mp3");      
startActivity(Intent.createChooser(it, "Choose Email Client"));

//16.進入聯絡人頁面:
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setData(People.CONTENT_URI);
startActivity(intent);

//17.檢視指定聯絡人:
Uri personUri = ContentUris.withAppendedId(People.CONTENT_URI, info.id);//info.id聯絡人ID
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setData(personUri);
startActivity(intent);

<完>

相關推薦

Android四大元件 Activity

(一)概述 本節開始講解Android的四大元件之一的Activity(活動); 官方文件: Activity是一個應用程式的元件,他在螢幕上提供了一個區域,允許使用者在上面做一些互動性的操作, 比如打電話,照相,傳送郵件,或者顯示一個地圖!Activit

Android--四大元件Activity

####1. Activity是什麼? ####2. 生命週期 ######1). Activity跳轉 ######2). 從後臺啟動 ######3). 橫豎屏切換 ####3. 啟動模式 ######1). 任務棧 ######2). laucherMode ######3).

Android 基礎知識——四大元件Activity

今天我們來探討一下activity有什麼啟動模式,都有什麼特點呢,且看下面分析 1.Task以及back stack     >Task(任務)  為了完成一個功能  多個Activity的集合,     當你的應用程式啟動時 系統會自動建立Task用於管理Activ

Android四大元件ContentProvider

上節提到的四大元件之ContentProvider的簡單使用,在這篇文章中詳細的介紹其中的一些方法。 1.String getType(Uri uri)方法 首先看看官方對它的解釋: /** * Implement this to handle requests

Android四大元件ContentProvider

1.什麼是ContentProvider? 內容提供程式管理對資料結構化資料集的訪問。它們封裝資料,並提供用於定義資料安全性的機制。內容提供者是連線一個程序中的資料與另一個程序中執行的程式碼的標準介面。 是不同應用程式之間進行資料交換的標準API,以某種Uri的形式對外提供資料,

Android:四大元件-----廣播Broadcast

相信很多讀者都與筆者一樣,在剛學安卓的時候就接觸到廣播。但是並不知道廣播其實也分好幾種,我們剛學習使用的只是廣播的其中一種:普通廣播 android的廣播分為: 普通廣播, 有序廣播, 本地廣播, sticky廣播, 下面就為大家介紹一下這四種廣播的區別與用法。 一.普通

Android四大元件BroadcastReceiver

(一)概述 上節我們對BroadcastReceiver已經有了一個初步的瞭解了,知道兩種廣播型別:標準與有序, 動態或靜態註冊廣播接收者,監聽系統廣播,自己傳送廣播!已經滿足我們的基本需求了~ 但是前面寫的廣播都是全域性廣播!這同樣意味著我們APP發出的廣播

Android四大元件BroadcastReceiver廣播

什麼是廣播 廣播是一個全域性的監聽器,屬於Android四大元件之一,它分為兩個角色:廣播發送者、廣播接收者 廣播用於不同元件之間(應用內/不同應用之間),還有多執行緒之間的通訊 - 廣播的

Android--四大元件BroadCastReceiver生命週期、實現原理及使用等

####1. BroadCastReceiver是什麼? ####2. 廣播型別 ######1). 有序廣播 ######2). 無序廣播 ####3. 生命週期 ####4. 實現原理 ####5. 使用方法 ####6. 許可權問題(安全性) ####7. LocalBroad

Android四大元件ContentProvider內容提供者

ContentProvider是什麼 ContentProvider是Android中的四大元件之一,主要用於不用應用之間共享資料,通過ContentProvider把應用中的資料共享給其他應用訪問,其他應用可以通過ContentProvider對指定應用中

Android控制元件ListView初識

ListView 控制元件可使用四種不同檢視顯示專案。通過此控制元件,可將專案組成帶有或不帶有列標頭的列,並顯示伴隨的圖示和文字。 ListView有四種模式: 其作用是新增選擇按鈕框。 設定單選框 Lv.setChoiceMode(ListView.CHOICE_MOD

Android四大元件Activity-生命週期

一. Android 四大元件包括 Activity 活動 Service 服務 Broadcast Receiver 廣播接收者 Content Provider 內容提供者 1.什麼是Activity? 使用者可與其提供的螢幕進行互動,以執行撥打電話、拍

Android四大元件Activity-啟動模式

1.Activity的啟動模式 當我們多次呼叫同一個Activity時,系統會重複建立多個例項並把它們一一放入任務棧中,這種方式顯然不符合我們的設計要求。所以Android在設計時就提供了四種啟動模式來解決此問題。 四種啟動模式分別如下: standard-標

Android 四大元件Activity的IntentFilter匹配規則小述

一、概述 本節主要介紹Activity的IntentFilter匹配規則,其是我們在隱式啟動一個Activity的過程中所用到的知識點,在這裡我就大概的介紹下,隱式啟動一個Activity需要我們的Intent能夠匹配待啟動Activity的IntentFilt

Android 控制元件 RecyclerView—— 載入檢視和佈局選擇

本文目錄 一、概述 二、列表檢視的處理 1. item 的佈局檔案 2. 構造 Adapter 類 3. 佈局管理器 1)LinearLayoutManager 2)GridLayoutManager

Android 四大元件Activity

Activity 是安卓四大元件之一,也是最常用最重要的元件。 四大元件:Activity、Service、Content provider、Broadcast Receiver。 通常一個Activity表示的就是一屏(也就是App的某個介面)。Activit

Android四大元件Activity

Android有四大基本元件,他們分別是: Activity Service(服務) BroadcastReceive(廣播) Content Provider(內容提供者) 這四大元件在Android開發中必不可缺,今天我們來介紹一下Activity Activi

Android 四大元件 Activity生命週期

一、 Activity 的生命週期概念 Activity 的生命週期指的是, Activity 物件從被建立到銷燬的全過程 二、 Activity 的狀態 執行狀態( Running): 該狀態表示 Activity 可見並且擁有使用者焦點; 暫停狀

Android 四大元件 Activity-帶值跳轉

從一個Activity跳轉到另外一個Activity,並且可以帶值跳轉,但我們日常生活中使用App時會經常遇到這種狀況,假設有某個介面A,點選上面不同的按鈕會啟動不同的介面B、C、D。。。,這些介面會處理某個業務並將處理結果返回給介面A,可以採用帶返回值得跳轉來

Android四大元件Activity詳解

一、Activity的生命週期: import android.app.Activity; import android.os.Bundle; public class MainActivity extends Activity { /*建立Activity時被