四大組建|Activity的用法和啟動模式

Activity:最吸引用戶的地方埠居,是一種可以包含用戶界面的組建,主要與用戶交互蚜点。
本篇主要介紹Activity的基本使用,不包括生命周期拌阴。

  • Activity的基本用法
  • Activity的四種啟動模式
  • Activity的兩種優(yōu)化

基本用法:

  • Activity在AndroidManifest的注冊:
<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:theme="@style/AppTheme"
    <activity
        android:name=".ActivityName"
        android:label="activity_bar_name">
        <!-- 指定為app啟動時的第一個活動 -->
        <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

android:label :指定activity標(biāo)題欄名稱

  • 活動間啟動Intent:
  1. 顯示啟動(常用):
    Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
    //不獲取下一層活動的結(jié)果值
    startActivtiy(intent);
    //獲取下一層活動的結(jié)果值绍绘,需重寫onActivityResult 對結(jié)果值進(jìn)行處理 
    startActivityForResult(inent, REQUEST_CODE);
  1. 隱式啟動(多用于調(diào)用系統(tǒng)app):不指明我們想要啟動的哪一個活動,而是指定一系列抽象的action和category等信息迟赃,然后交給系統(tǒng)去分析這個Intent陪拘,并幫助我們找到合適方法去啟動。action和category是在<Intent-filter>中指定的纤壁。action是唯一一個左刽,而category可以有多個。
<activity andorid:name=".ActivityName">
    <intent-filter>
        <action android:name="com.example.projectname.ACTION_START"/>
        <category android:name="android.intent.category.DEFAULT"/>
    </intent-filter>
</activity>

"android.intent.category.DEFAULT"是一種默認(rèn)的category酌媒,在調(diào)用startActvity()時會自動將這個category添加到intent中欠痴。

    Intent intent = new Intent("com.example.projectname.ACTION_START");
    startActivity(intent);

使用隱式Intent調(diào)用其他程序活動示例:

    Intent intent = new Intent(Intent.ACTION_VIEW);
    intent.setData(Uri.parse("http://baidu.com")";
    startActivity(intent);

setData()需轉(zhuǎn)化成指定數(shù)據(jù)類型,也可以在<intent-filter>中配置<data>標(biāo)簽秒咨,用于更精確地指定當(dāng)前活動能夠響應(yīng)什么類型地數(shù)據(jù)喇辽。如下:

    <intent-filter>
        <action android:name="com.example.projectname.ACTION_START"/>
        <category android:name="android.intent.category.DEFAULT"/>
        <data android:scheme="http" />
    </intent-filter>

各種data標(biāo)簽配置如下:
android:scheme,用于指定數(shù)據(jù)的協(xié)議部分,如http雨席。
android:host,用于指定數(shù)據(jù)的主機(jī)名部分菩咨,如www.baidu.com。android:port,端口號陡厘。
android:path,路徑
android:mimeType,指定處理數(shù)據(jù)類型抽米,允許使用通配符的方式指定。

Activity的四種啟動模式即其應(yīng)用場景:

啟動模式可以在AndroidManifest.xml中通過給<activity>標(biāo)簽android:launchMode屬性來選擇啟動模式雏亚。
若系統(tǒng)調(diào)用activity是創(chuàng)建新實(shí)例缨硝,調(diào)用activity的onCreate()方法;若無創(chuàng)建新實(shí)例罢低,則調(diào)用onNewInstance()方法查辩。

  1. standard:是活動默認(rèn)的啟動模式。在standard模式下网持,啟動一個新活動宜岛,系統(tǒng)不會在乎這個活動是否已經(jīng)存在返回棧中,都會創(chuàng)建一個新實(shí)例功舀。
  2. singleTop:在啟動活動時如果發(fā)現(xiàn)棧頂已經(jīng)是該活動了萍倡,則直接使用該活動實(shí)例,不新建實(shí)例辟汰。簡稱棧頂復(fù)用列敲。
    適合接收推送啟動內(nèi)容阱佛。如某個新聞客戶端的新聞內(nèi)容頁面,如果收到10個新聞推送戴而,每次都打開一個新聞內(nèi)容頁面是很煩人的凑术。
  3. singleTask:啟動該活動時,系統(tǒng)會先檢查返回棧內(nèi)是否存在該活動的實(shí)例所意,如果發(fā)現(xiàn)已經(jīng)存在則直接使用該實(shí)例淮逊,并把這個活動之上的所有活動出棧;如果沒有發(fā)現(xiàn)扶踊,則新建一個實(shí)例泄鹏。簡稱棧內(nèi)復(fù)用。
    適用于作為程序入口點(diǎn)秧耗,a界面購物备籽,b界面確認(rèn)訂單,c界面付款绣版,如果付款成功會跳到a胶台,如果不付款則返回b,這時候重啟a就會用到singleTask杂抽。重啟a的時候會把b出棧
  4. singleInstance:在這種模式下诈唬,啟動該活動,系統(tǒng)會創(chuàng)建一個單獨(dú)的返回棧來管理這個活動缩麸,不管是哪個應(yīng)用程序來訪問這個活動铸磅,都共用一個返回棧,也就解決了共享活動實(shí)例的問題杭朱。
    適合需要與程序分離開的頁面阅仔。例如鬧鈴提醒,將鬧鈴提醒與鬧鈴設(shè)置分離弧械。singleInstance不要用于中間頁面八酒,如果用于中間頁面,跳轉(zhuǎn)會有問題刃唐。比如:A -> B (singleInstance) -> C羞迷,完全退出后,在此啟動画饥,首先打開的是B衔瓮。

Activity優(yōu)化:

1. 創(chuàng)建基類:

方便管理activity,打印各活動名和生命周期抖甘,可以方便我們查詢目前是在哪個活動聲明周期热鞍。也可聲明抽象方法調(diào)用順序,initView()和initData()等,方便寫新aactivity時薇宠,邏輯可以更加清晰偷办。
抽象基類不需要在AndroidManifest.xml中注冊,直接創(chuàng)建類并繼承AppCompatActivity即可昼接。

public abstract class BaseActivity extends AppCompatActivity{
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        Log.v("BaseActivity", getClass().getSimpleName() + "--------onCreate---------");
        Log.v("BaseActivity", "taskId=" + getTaskId() + ",pid=" + Process.myPid() + "\n-------------------------");
        super.onCreate(savedInstanceState);
        setContentView(getContentView());
        initView();
        initData();
    }
    .....//打印其他生命周期
    
    protected abstract void initView();
    protected abstract void initData();
    
}
2. 隨時隨地退出程序:

配合基類使用爽篷,新建一個ActivityCollector類作為活動管理器悴晰。代碼如下:

public class ActivityCollector{
    public Static List<Activity> activities = new LinkedList<>();
    
    public static void add(Activity activity){
        activities.add(activity);
    }
    
    public static void remove(Activity activity){
        activities.remove(activity);
    }
    
    public static void finishAll(){
        for(Activity activity : activities){
            if (!activity.isFinishing()){
                activity.finish;
            }
        }
    }
}

public abstract class BaseActivity extends AppCompatActivity{
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        ActivityCollector.add(this);
        ...
    }
    
    @Override
    protected void onDestroy() {
        ActivityCollector.remove(this)
    }
}
3. 啟動活動的最佳寫法:

在活動中聲明該方法

public static void actionStart(Context context, String data1, String data2){
    Intent intent = new Intent(context, ActivityName.class);
    intent.putExtra("param1", data1);
    intent.putExtra("param2", data2);
}

這樣寫可以方便調(diào)用慢睡,不需要閱讀Activity的代碼就可以清楚地知道啟動Activity需要傳遞哪些數(shù)據(jù)。

參考:
《第一行代碼》
徹底弄懂Activity四大啟動模式

Activity的四種啟動模式的介紹及其應(yīng)用場景

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末铡溪,一起剝皮案震驚了整個濱河市漂辐,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌棕硫,老刑警劉巖髓涯,帶你破解...
    沈念sama閱讀 211,948評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異哈扮,居然都是意外死亡纬纪,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評論 3 385
  • 文/潘曉璐 我一進(jìn)店門滑肉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來包各,“玉大人,你說我怎么就攤上這事靶庙∥食” “怎么了?”我有些...
    開封第一講書人閱讀 157,490評論 0 348
  • 文/不壞的土叔 我叫張陵六荒,是天一觀的道長护姆。 經(jīng)常有香客問我,道長掏击,這世上最難降的妖魔是什么卵皂? 我笑而不...
    開封第一講書人閱讀 56,521評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮砚亭,結(jié)果婚禮上灯变,老公的妹妹穿的比我還像新娘。我一直安慰自己钠惩,他們只是感情好柒凉,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,627評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著篓跛,像睡著了一般膝捞。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,842評論 1 290
  • 那天蔬咬,我揣著相機(jī)與錄音鲤遥,去河邊找鬼。 笑死林艘,一個胖子當(dāng)著我的面吹牛盖奈,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播狐援,決...
    沈念sama閱讀 38,997評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼钢坦,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了啥酱?” 一聲冷哼從身側(cè)響起爹凹,我...
    開封第一講書人閱讀 37,741評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎镶殷,沒想到半個月后禾酱,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,203評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡绘趋,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,534評論 2 327
  • 正文 我和宋清朗相戀三年颤陶,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片陷遮。...
    茶點(diǎn)故事閱讀 38,673評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡滓走,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出拷呆,到底是詐尸還是另有隱情闲坎,我是刑警寧澤,帶...
    沈念sama閱讀 34,339評論 4 330
  • 正文 年R本政府宣布茬斧,位于F島的核電站腰懂,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏项秉。R本人自食惡果不足惜绣溜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,955評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望娄蔼。 院中可真熱鬧怖喻,春花似錦、人聲如沸岁诉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,770評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽涕癣。三九已至哗蜈,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背距潘。 一陣腳步聲響...
    開封第一講書人閱讀 32,000評論 1 266
  • 我被黑心中介騙來泰國打工炼列, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人音比。 一個月前我還...
    沈念sama閱讀 46,394評論 2 360
  • 正文 我出身青樓俭尖,卻偏偏與公主長得像,于是被迫代替她去往敵國和親洞翩。 傳聞我的和親對象是個殘疾皇子稽犁,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,562評論 2 349

推薦閱讀更多精彩內(nèi)容

  • 一、概述 Activity 作為與用戶交互的一個窗口菱农,是使用非常頻繁的一個基本組件缭付。Android系統(tǒng)是通過Act...
    三也視界閱讀 2,230評論 3 11
  • 第一章主要講了以下幾個知識點(diǎn): Activity生命周期 Activity的啟動模式 IntentFilter匹配...
    Utte閱讀 1,149評論 0 3
  • 一本android開發(fā)程序員必讀的一本書,感謝任玉剛大佬的分享 一循未、Activity的生命周期全面分析 典型情況下...
    kongjn閱讀 534評論 1 3
  • 本篇博客是筆者看過《Android開發(fā)藝術(shù)探索》才寫的,有些是借鑒了此本書的內(nèi)容秫舌,當(dāng)有些內(nèi)容進(jìn)行了精進(jìn)的妖。 Acti...
    ClAndEllen閱讀 3,416評論 1 27
  • 最近陷入幣乎寫作的迷茫中,懷疑自己寫作的價值足陨,心態(tài)不穩(wěn)定嫂粟,通過坐享,我內(nèi)觀到自己的問題墨缘,定位不明星虹,方向不堅定,用心...
    賦能姐在行動閱讀 253評論 0 1