Activity作為四大組件之首,是使用最為頻繁的一種組件牺弄,中文翻譯為“活動”岛马。
activity生命周期
下面用兩個圖來闡釋activiy正常的生命周期和出現(xiàn)異常的生命周期索烹;
activity啟動模式
啟動模式總共有四種:
- standard :標(biāo)準(zhǔn)模式缀辩,每次啟動都會創(chuàng)建一個activity對象臭埋。
- singTop :棧頂復(fù)用模式,啟動activity時臀玄,如果activity實例位于棧頂瓢阴,那么就復(fù)用該activity對象。
- singTask :棧內(nèi)復(fù)用模式(單實例模式)健无,啟動activity時荣恐,如果activiyu實例在棧內(nèi)已經(jīng)存在,那么將復(fù)用此activity累贤。
- singInstance :單實例模式叠穆,擁有singTask所有的特性,同時具有此模式的Activity只能單獨的位于一個任務(wù)棧中的特點臼膏。
設(shè)置activity啟動模式的方法: - 方法一硼被,在manifests.xml文件中進(jìn)行聲明:
android:launchMode="singleInstance"
- 方法二,在啟動activity時設(shè)置Flag:
Intent intent = new Intent();
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
同時讶请,值得注意的是祷嘶,我們可以利用TaskAffinity來進(jìn)行申明任務(wù)棧屎媳,默認(rèn)屬性就activity的包名夺溢,所以如果聲明TaskAffinity屬性值為包名,就相當(dāng)于沒有指定烛谊。
隱式啟動activity
action 配對原則
Intent中的action能夠和過濾規(guī)則中的任何一個action相同即可匹配成功风响。
category 匹配規(guī)則
Intent如果含有cateory,那么所有的cateory都必須和過濾規(guī)則中的每一個cateory相同丹禀。startActivity和startActivityForReslut都會為其添加一個android.intent.category.DEFAULT的默認(rèn)值状勤。而這個值默認(rèn)就添加到過濾策略中鞋怀,但是一旦添加了其他的catagory,就需要手動添加此值持搜,否則不能正常啟動密似。
data 配額規(guī)則
過濾規(guī)則中定義了data,那么Intent中必須也要定義可匹配的data葫盼。
< data android:scheme="string"
android:host ="string"
android:port ="string"
android:path ="string"
android:pathPattern="string"
android:pathPrefix ="string"
android:mimeType="string"
/>
URL的結(jié)構(gòu)如下:
<scheme>://<host>/[<path>|<pathPrefix>|<pathPattern>]
一個完整的示例如下:
<activity android:name=".view.SecondActivity">
<intent-filter>
<action android:name="reoger.hut.voice.a"/>
<action android:name="reoger.hut.voice.b"/>
<category android:name="reoger.hut.voice.c"/>
<category android:name="reoger.hut.voice.d"/>
<category android:name="reoger.hut.voice.e"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:mimeType="text/plain" />
</intent-filter>
</activity>
對應(yīng)的啟動Intent代碼如下:
PackageManager packageManager = getPackageManager();
Intent intent = new Intent();
intent.setAction("reoger.hut.voice.a");
intent.addCategory("reoger.hut.voice.c");
intent.setDataAndType(Uri.parse("file://abs"),"text/plain");
ResolveInfo resolveInfo = packageManager.resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY);
ComponentName componentName = intent.resolveActivity(packageManager);
if(componentName ==null ){
Log.d("TAG","******/*/*********************************/*/*/*/*/**/*");
}
if(resolveInfo ==null)
Toast.makeText(MainActivity.this,"沒有找到對應(yīng)的actvity",Toast.LENGTH_SHORT).show();
else
startActivity(intent);
---end