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:
- 顯示啟動(常用):
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
//不獲取下一層活動的結(jié)果值
startActivtiy(intent);
//獲取下一層活動的結(jié)果值绍绘,需重寫onActivityResult 對結(jié)果值進(jìn)行處理
startActivityForResult(inent, REQUEST_CODE);
- 隱式啟動(多用于調(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()方法查辩。
- standard:是活動默認(rèn)的啟動模式。在standard模式下网持,啟動一個新活動宜岛,系統(tǒng)不會在乎這個活動是否已經(jīng)存在返回棧中,都會創(chuàng)建一個新實(shí)例功舀。
-
singleTop:在啟動活動時如果發(fā)現(xiàn)棧頂已經(jīng)是該活動了萍倡,則直接使用該活動實(shí)例,不新建實(shí)例辟汰。簡稱棧頂復(fù)用列敲。
適合接收推送啟動內(nèi)容阱佛。如某個新聞客戶端的新聞內(nèi)容頁面,如果收到10個新聞推送戴而,每次都打開一個新聞內(nèi)容頁面是很煩人的凑术。
-
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出棧
-
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)用場景