Activity作為四大組件之首,是使用最為頻繁的一種組件,中文翻譯為“活動”。
activity生命周期
下面用兩個圖來闡釋activiy正常的生命周期和出現異常的生命周期;
activity啟動模式
啟動模式總共有四種:
- standard :標準模式,每次啟動都會創建一個activity對象。
- singTop :棧頂復用模式,啟動activity時,如果activity實例位于棧頂,那么就復用該activity對象。
- singTask :棧內復用模式(單實例模式),啟動activity時,如果activiyu實例在棧內已經存在,那么將復用此activity。
- singInstance :單實例模式,擁有singTask所有的特性,同時具有此模式的Activity只能單獨的位于一個任務棧中的特點。
設置activity啟動模式的方法: - 方法一,在manifests.xml文件中進行聲明:
android:launchMode="singleInstance"
- 方法二,在啟動activity時設置Flag:
Intent intent = new Intent();
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
同時,值得注意的是,我們可以利用TaskAffinity來進行申明任務棧,默認屬性就activity的包名,所以如果聲明TaskAffinity屬性值為包名,就相當于沒有指定。
隱式啟動activity
action 配對原則
Intent中的action能夠和過濾規則中的任何一個action相同即可匹配成功。
category 匹配規則
Intent如果含有cateory,那么所有的cateory都必須和過濾規則中的每一個cateory相同。startActivity和startActivityForReslut都會為其添加一個android.intent.category.DEFAULT的默認值。而這個值默認就添加到過濾策略中,但是一旦添加了其他的catagory,就需要手動添加此值,否則不能正常啟動。
data 配額規則
過濾規則中定義了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的結構如下:
<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>
對應的啟動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,"沒有找到對應的actvity",Toast.LENGTH_SHORT).show();
else
startActivity(intent);
---end