編輯:關於Android編程
一、知識點回顧:Activity
(一)、如何實現Activity頁面跳轉?
示例代碼:
//第一種方式:
Intentintent = new Intent(MainActivity.this,NextActivity.class);
startActivity(intent);
//第二種方式:
Intentintent = new Intent();
intent.setClass(MainActivity.this, NextActivity.class);
startActivity(intent);
//其實還有很多種Intent實現頁面跳轉的寫法。
二、Intent對象介紹:
(一)、Intent基本介紹:
1、Intent 用於封裝程序的”調用意圖“。兩個Activity之間,可以把需要交換的數據封裝成Bundle對象,然後使用Intent攜帶Bundle對象,實現兩個Activity之間的數據交換;
2、Intent還是各種應用程序組件之間通信的重要媒介。不管想啟動一個Acitivity、Service還是BroadcastReceiver,Android均使用統一的Intent對象來封裝這種”啟動意圖“。很明顯使用Intent提供了一致的編程模型;
3、Intent還有一個好處,如果應用程序只是想啟動具有某種特征的組件,並不想和某個具體的組件耦合,則可以通過在intent-filter中配置相應的屬性進行處理,與struts2中的MVC框架思路類似。
4、Intent對象大致包括7大屬性:ComponentName、 Action、Category、Data 、Type、 Extra、Flag。
(二)、Intent啟動不同組件的方法:
1、啟動Activity:
startActivity()
startActivtyForResult()
2、啟動Service:【後面詳細講】
ComponetName startService()
boolean bindService()
3、啟動BroadcastReceiver:【後面詳細講】
sendBroadcast()
sendOrderedBroadcast()
sendStickyBroadcast()
sendStickyOrderedBroadcast()
三、Intent的七大屬性:【重要】
Intent對象大致包括7大屬性:ComponentName、 Action 、 Category 、 Data 、Type、 Extra 、Flags。
Action作為標識符,代表一個Intent,當一個Activity需要外部協助處理時,就會發出一個Intent,如果一個程序能完成相應功能,只要在intent-filter加上這個這個intent就可以了。
Data保存需要傳遞的數據格式,比如:tel://
Extras保存需要傳遞的額外數據。
Category表示Intent的種類,從android上啟動Activity有多種方式,比如 程序列表、桌面圖標、點擊Home激活的桌面等等,Category則用來標識這些Activity的圖標會出現在哪些啟動的上下文環境裡。
(一)、ComponentName屬性:
1、指定了ComponentName屬性的Intent已經明確了它將要啟動哪個組件,因此這種Intent被稱為顯式Intent,沒有指定ComponentName屬性的Intent被稱為隱式Intent。隱式Intent沒有明確要啟動哪個組件,應用會根據Intent指定的規則去啟動符合條件的組件。
2、示例代碼:
Intent intent = new Intent();
ComponentName cName = new ComponentName(MainActivity.this,NextActivity.class);
intent.setComponent(cName);
startActivity(intent);
//實際上,以上的寫法都被簡化為以下寫法:
Intentintent = new Intent(MainActivity.this,NextActivity.class);
startActivity(intent);
//也就是說,平時我們最常用的Intent頁面跳轉的寫法就調用的是顯式Intent。
此外,ComponentName屬性可以實現一個app跳轉到另一個app。
Intent intent = new Intent();
ComponentName cName = new ComponentName(
"com.steven.testasyncloader.sqlitedata","com.steven.testasyncloader.sqlitedata.MainActivity");
//其中兩個參數的含義:第一個是要跳轉到的app的包名,第二個參數是該包中的要跳轉到app的頁面的class
intent.setComponent(cName);
startActivity(intent);
(二)、Action、Category屬性與intent-filter配置:
通常,Action、Category屬性結合使用,定義這兩個屬性都是在配置文件的節點中。Intent通過定義Action屬性(其實就是一段自定義的字符串),這樣就可以把Intent與具體的某個Activity分離,實現了解耦。否則,每次跳轉,都要寫成類似new Intent(MainActivity.this,NextActivity.class)這樣的形式,也就是說必須將要跳轉的目標Activity的名字寫出來,這樣的編碼其實是“硬編碼”,並沒有實現松耦合。調用Intent對象的setAction()方法實現頁面跳轉雖然略微復雜(需要在AndroidManifest.xml文件中配置),但是實現了解耦。
1、示例代碼:
Intent intent = new Intent();
intent.setAction("com.steven.android06lifecycle.nextactivity");
startActivity(intent);
//在配置文件中注冊Activity的時候需要聲明:
//當某個頁面是默認啟動頁面時,需要定義Action、Category的屬性必須為以下字符串:【設置任務入口】
2、常用Action屬性常量:
Intent對象不僅可以啟動本應用內的程序組件,也可以啟動Android系統的其他應用的組件,包括系統內置的程序組件(需要設置權限)。
ACTION_MAIN:(android.intent.action.MAIN)Android程序入口。
每個Android應用必須且只能包含一個此類型的Action聲明。【如果設置多個,則哪個在前,執行哪個。】
ACTION_VIEW: (android.intent.action.VIEW)顯示指定數據。
ACTION_EDIT: (android.intent.action.EDIT)編輯指定數據。
ACTION_DIAL: (android.intent.action.DIAL)顯示撥號面板。
ACTION_CALL: (android.intent.action.CALL)直接呼叫Data中所帶的號碼。
ACTION_ANSWER: (android.intent.action.ANSWER)接聽來電。
ACTION_SEND: (android.intent.action.SEND)向其他人發送數據(例如:彩信/email)。
ACTION_SENDTO: (android.intent.action.SENDTO)向其他人發送短信。
ACTION_SEARCH: (android.intent.action.SEARCH)執行搜索。
ACTION_GET_CONTENT: (android.intent.action.GET_CONTENT)讓用戶選擇數據,並返回所選數據。
(三)、Category 屬性:
Category屬性為Action增加額外的附加類別信息。CATEGORY_LAUNCHER意味著在加載程序的時候Acticity出現在最上面,而CATEGORY_HOME表示頁面跳轉到HOME界面。
1、實現頁面跳轉到HOME界面的代碼:【記憶】
Intent intent = new Intent();
intent.setAction(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGOTY_HOME);
startActivity(intent);
2、常用Category屬性常量:
CATEGORY_DEFAULT: (android.intent.category.DEFAULT)Android系統中默認的執行方式,按照普通Activity的執行方式執行。
CATEGORY_HOME: (android.intent.category.HOME)設置該組件為Home Activity。
CATEGORY_PREFERENCE: (android.intent.category.PREFERENCE)設置該組件為Preference。
CATEGORY_LAUNCHER: (android.intent.category.LAUNCHER)設置該組件為在當前應用程序啟動器中優先級最高的Activity,通常與入口ACTION_MAIN配合使用。
CATEGORY_BROWSABLE: (android.intent.category.BROWSABLE)設置該組件可以使用浏覽器啟動。
(四)、Data屬性:
1、Data屬性通常用於向Action屬性提供操作的數據。Data屬性的值是個Uri對象。
Uri的格式如下:scheme://host:port/path
2、系統內置的幾個Data屬性常量:
tel://:號碼數據格式,後跟電話號碼。
mailto://:郵件數據格式,後跟郵件收件人地址。
smsto://:短息數據格式,後跟短信接收號碼。
content://:內容數據格式,後跟需要讀取的內容。
file://:文件數據格式,後跟文件路徑。
market://search?q=pname:pkgname:市場數據格式,在Google Market裡搜索包名為pkgname的應用。
geo://latitude, longitude:經緯數據格式,在地圖上顯示經緯度所指定的位置。
3、Intent利用Action屬性和Data屬性啟動Android系統內置組件的代碼:【不需要記憶,用到的時候查找資料】
(一)、撥打電話:
intent.setAction(Intent.ACTION_CALL);
//intent.setAction("android.intent.action.CALL"); //以下各項皆如此,都有兩種寫法。
intent.setData(Uri.parse("tel:1320010001"));
startActivity(intent);
//調用撥號面板:
Intent intent=new Intent();
intent.setAction(Intent.ACTION_DIAL);
intent.setData(Uri.parse("tel:1320010001"));
startActivity(intent);
//調用撥號面板:
Intent intent=new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setData(Uri.parse("tel:1320010001"));
startActivity(intent);
(二)、利用Uri打開浏覽器、打開地圖等:
Uri uri = Uri.parse("http://www.google.com"); //浏覽器
Uri uri=Uri.parse("geo:39.899533,116.036476"); //打開地圖定位
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setData(uri);
startActivity(intent);
(五)、Type屬性:
1、Type屬性用於指定Data所指定的Uri對應的MIME類型。MIME只要符合“abc/xyz”這樣的字符串格式即可。
2、Intent利用Action、Data和Type屬性啟動Android系統內置組件的代碼:
(三)、播放視頻:
Intent intent = new Intent();
Uri uri = Uri.parse("file:///sdcard/media.mp4");
intent.setAction(Intent.ACTION_VIEW);
intent.setDataAndType(uri, "video/*");
startActivity(intent);
(六)、Extra屬性:
1、通過intent.putExtra(鍵, 值)的形式在多個Activity之間進行數據交換。
2、系統內置的幾個Extra常量:
EXTRA_BCC:存放郵件密送人地址的字符串數組。
EXTRA_CC:存放郵件抄送人地址的字符串數組。
EXTRA_EMAIL:存放郵件地址的字符串數組。
EXTRA_SUBJECT:存放郵件主題字符串。
EXTRA_TEXT:存放郵件內容。
EXTRA_KEY_EVENT:以KeyEvent對象方式存放觸發Intent的按鍵。
EXTRA_PHONE_NUMBER:存放調用ACTION_CALL時的電話號碼。
3、Intent利用Action、Data和Type、Extra屬性啟動Android系統內置組件的代碼:
(四)、調用發送短信的程序
Intent intent= new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setType("vnd.android-dir/mms-sms");
intent.putExtra("sms_body", "信息內容...");
startActivity(intent);
//發送短信息
Uri uri = Uri.parse("smsto:13200100001");
Intent intent= new Intent();
intent.setAction(Intent.ACTION_SENDTO);
intent.setData(uri);
intent.putExtra("sms_body", "信息內容...");
startActivity( intent);
//發送彩信,設備會提示選擇合適的程序發送
Uri uri = Uri.parse("content://media/external/images/media/23"); //設備中的資源(圖像或其他資源)
Intent intent = new Intent();
intent.setAction(Intent.ACTION_SEND);
intent.setType("image/png");
intent.putExtra("sms_body", "內容");
intent.putExtra(Intent.EXTRA_STREAM, uri);
startActivity(it);
(五)、發送Email:
Intent intent=new Intent();
intent.setAction(Intent.ACTION_SEND);
String[] tos={"[email protected]"};
String[] ccs={"[email protected]"};
intent.putExtra(Intent.EXTRA_EMAIL, tos);
intent.putExtra(Intent.EXTRA_CC, ccs);
intent.putExtra(Intent.EXTRA_TEXT, "The email body text");
intent.putExtra(Intent.EXTRA_SUBJECT, "The email subject text");
intent.setType("message/rfc822");
startActivity(Intent.createChooser(intent, "Choose Email Client"));
Intent intent = new Intent(Intent.ACTION_SEND);
String[] tos = { "[email protected]" };
intent.putExtra(Intent.EXTRA_EMAIL, tos);
intent.putExtra(Intent.EXTRA_TEXT, getPhoneParameter());
intent.putExtra(Intent.EXTRA_SUBJECT, "Android日志");
intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(cacheDir));
intent.setType("message/rfc882");
intent.setType("plain/text");
Intent.createChooser(intent, "請選擇郵件發送軟件");
startActivity(intent);
intent.setAction(android.provider.Settings.ACTION_SETTINGS);
4、Intent利用Action屬性中的ACTION_GET_CONTENT獲取返回值:
//選擇圖片 requestCode 返回的標識
Intent intent = new Intent();
intent.setAction(Intent.ACTION_GET_CONTENT);
intent.setType( "image/*");
Intent wrapperIntent = Intent.createChooser(intent, null);
startActivityForResult(wrapperIntent, requestCode);
//添加音頻
Intent intent = new Intent();
intent.setAction(Intent.ACTION_GET_CONTENT);
intent.setType( "video/*");
Intent wrapperIntent = Intent.createChooser(intent, null);
startActivityForResult(wrapperIntent, requestCode);
//視頻
Intent intent = new Intent();
intent.setAction(Intent.ACTION_GET_CONTENT);
intent.setType( "video/*");
Intent wrapperIntent = Intent.createChooser(intent, null);
startActivityForResult(wrapperIntent, requestCode);
//錄音
Intent intent = new Intent();
intent.setAction(Intent.ACTION_GET_CONTENT);
intent.setType( "audio/amr");
intent.setClassName("com.android.soundrecorder","com.android.soundrecorder.SoundRecorder");
startActivityForResult(intent, requestCode);
(七)、Flags屬性:Intent可調用addFlags()方法來為Intent添加控制標記。【重要】
1、FLAG_ACTIVITY_SINGLE_TOP:(效果同Activity LaunchMode的singleTop)
如果在任務的棧頂正好存在該Activity的實例, 就重用該實例,而不會創建新的Activity對象。
2、FLAG_ACTIVITY_CLEAR_TOP:(效果同Activity LaunchMode的singleTask)
如果在棧中已經有該Activity的實例,就重用該實例。重用時,會讓該實例回到棧頂,因此在它上面的實例將會被移除棧。如果棧中不存在該實例,將會創建新的實例放入棧中。
3、FLAG_ACTIVITY_NEW_TASK:(效果類似Activity LaunchMode的singleInstance)
【備注:】
使用Intent的setFlags()方法設置窗口的啟動模式。常用的有:
Intent.FLAG_ACTIVITY_SINGLE_TOP
Intent.FLAG_ACTIVITY_CLEAR_TOP
Intent.FLAG_ACTIVITY_NEW_TASK
Intent.FLAG_ACTIVITY_CLEAR_TASK
Intent.FLAG_ACTIVITY_REORDER_TO_FRONT
Intent.FLAG_ACTIVITY_SINGLE_TOP:與在launchMode設置singleTop是完全一樣的。
Intent.FLAG_ACTIVITY_CLEAR_TOP:
當跳轉到一個單獨使用Intent.FLAG_ACTIVITY_CLEAR_TOP的Activity時,會檢測回退棧是否已經有該窗口了,如果有就會清空壓在上面的窗口和自己本身,然後在新建一個新的窗口壓入回退棧。
例如:如果窗口A跳轉到B,B跳轉到C,C又調轉到B(跳轉時給Intent設置了Intent.FLAG_ACTIVITY_CLEAR_TOP),此時回退棧順序為:A-B,並且會執行B的onCreate方法。
當Intent.FLAG_ACTIVITY_CLEAR_TOP與Intent.FLAG_ACTIVITY_SINGLE_TOP同時使用,就與在launchMode設置singleTask,並跳轉到程序內部的窗口的作用是一樣的。
示例代碼:
Intent intent = new Intent(this, MainActivity.class); //將Activity棧中處於MainActivity主頁面之上的Activity都彈出。 intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(intent);
【備注:】【重點,需要認真理解】
例如:
如果依次啟動了四個Activity:A、B、C、D。
在D Activity裡,跳到B Activity,同時希望D 和 C 都finish掉,可以在startActivity(intent)裡的intent裡添加flags標記,如下所示:
Intent intent = new Intent(this, B.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
這樣啟動B Activity的同時,就會把D、C都finished掉。
如果B Activity的launchMode是默認的“standard”,則B Activity會首先finished掉舊的B頁面,再啟動一個新的Activity B。 如果不想重新再創建一個新的B Activity,而是重用之前的B Activity,可以將B Activity的launchMode設置為“singleTask”。【特別需要注意的是:在部分手機中,如三星手機。即便是singleTask也會產生新的頁面,而不是重用之前的頁面。】
時隔5個月時間,即6月14日,紅米3S作為紅米3的升級版,配備了高通骁龍430八核處理器,配備4100毫安時電池,定價699元起。紅米3S相對於紅米3的售價
本文實例講述了Android手機鬧鐘用法。分享給大家供大家參考。具體如下:一、開發手機鬧鐘主要用到了AlarmManager類,AlarmManager類提供了訪問系統定
英文原文:Probably be the best way (?) to save/restore Android Fragment’s state so f
又兩周沒寫博客了,不是不想寫而是不知道該寫點什麼,總不能為了寫博客而寫博客,前兩天項目裡要加個購物車功能,看了下別人APP的效果覺得不錯,雖然我項目裡沒用上不過畢竟還算